Docker
Docker 核心概念
Image(镜像)
- 一个只读模板
- 包含:系统 + 运行环境 + 应用
- 类似:
class
shell
docker pull nginxContainer(容器)
- 镜像运行后的实例
- 类似:
new Class()
shell
docker run nginxDockerfile
- 用代码描述镜像怎么构建
- 类似:构建脚本
Volume(数据卷)
- 容器数据持久化
- 容器删了,数据还在
Network(网络)
- 容器之间通信
- docker-compose 自动处理
Docker 安装
Linux(Ubuntu / Debian)
shell
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker- 验证:
shell
docker -v- 非 root 用户使用
shell
sudo usermod -aG docker $USER
newgrp dockerDocker 基本配置
镜像加速
shell
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.jsonjson
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn",
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}- 重启:
shell
sudo systemctl restart docker查看 Docker 状态
shell
docker info
docker version常用 Docker 命令
镜像相关
shell
docker images # 查看本地镜像
docker pull nginx # 拉取镜像
docker rmi nginx # 删除镜像
docker build -t myapp . # 构建镜像容器相关
shell
docker ps # 运行中的容器
docker ps -a # 所有容器- 启动容器
shell
docker run nginx- 常用参数
shell
docker run -d \
--name my-nginx \
-p 8080:80 \
nginx| 参数 | 含义 |
|---|---|
-d | 后台运行 |
--name | 容器名 |
-p | 端口映射 |
-v | 数据卷 |
-e | 环境变量 |
- 停止 / 删除
shell
docker stop my-nginx
docker start my-nginx
docker restart my-nginx
docker rm my-nginx- 进入容器
shell
docker exec -it my-nginx /bin/bash- 查看日志
shell
docker logs my-nginx
docker logs -f my-nginx清理命令
shell
docker rm -f $(docker ps -aq) # 删除所有容器
docker rmi -f $(docker images -q) # 删除所有镜像
docker system prune -a # 清理无用资源Volume(数据持久化)
挂载宿主目录
shell
docker run -d \
-v /data/nginx/html:/usr/share/nginx/html \
-p 80:80 \
nginx匿名 Volume
shell
docker volume ls
docker volume rm xxxDockerfile
Node 项目示例
dockerfile
FROM node:22.11.0-alpine
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm && pnpm install
COPY . .
RUN pnpm build
EXPOSE 3000
CMD ["pnpm", "start"]- 构建:
shell
docker build -t my-node-app .
docker run -d -p 3000:3000 my-node-appGo 项目(多阶段构建)
dockerfile
# 构建阶段
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app
# 运行阶段
FROM alpine
WORKDIR /app
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]docker-compose
前端 + 后端 + MySQL
yaml
services:
web:
image: nginx
ports:
- '80:80'
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
api:
build: ./backend
ports:
- '3000:3000'
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:- 启动:
shell
docker compose up -d
docker compose down网络通信(容器互相访问)
❌ 错误方式
shell
localhost: 3306✅ 正确方式
shell
mysql:3306 # 使用 service 名常见坑
总结
- ❌ 容器里用
localhost访问宿主 - ✅ 用
host.docker.internal - ❌ 不加
-d前台卡死 - 后台运行
- 数据没挂载
- volume 持久化
- 镜像太大
- alpine + 多阶段构建