这份指南涵盖了 Docker 日常使用中 90% 以上的场景,从基础操作到生产部署、从单容器到多容器编排、从开发调试到 CI/CD 自动化。
由于内容较多,我将分章节系统性地呈现。
建议点赞收藏以后备用。,需要时快速查阅。
一、Docker 基础概念速览
| 概念 | 说明 |
|---|---|
| 镜像 (Image) | 只读模板,包含运行应用所需的代码、库、环境变量和配置文件 |
| 容器 (Container) | 镜像的运行实例,是独立、轻量级的运行环境 |
| 仓库 (Repository) | 存储和分发镜像的地方(如 Docker Hub) |
| Dockerfile | 定义如何构建镜像的文本文件 |
| 卷 (Volume) | 持久化数据存储,独立于容器生命周期 |
| 网络 (Network) | 容器间通信和与外部连接的机制 |
二、镜像管理命令(15个核心场景)
2.1 镜像搜索与下载
bash
# 从 Docker Hub 搜索镜像
docker search nginx
docker search --filter=stars=1000 mysql # 筛选高星镜像
# 拉取镜像(默认最新版)
docker pull nginx
docker pull nginx:1.21 # 指定版本标签
docker pull registry.cn-hangzhou.aliyuncs.com/nginx:latest # 从阿里云镜像仓库拉取
# 查看本地镜像列表
docker images
docker image ls
docker images --filter "dangling=true" # 仅显示悬空镜像(无标签)
# 查看镜像详细信息
docker inspect nginx:latest
docker inspect --format='{{.Size}}' nginx # 仅查看镜像大小
2.2 镜像构建
bash
# 基础构建(当前目录需有 Dockerfile)
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod . # 指定 Dockerfile 文件
# 高级构建选项
docker build --no-cache -t myapp:1.0 . # 不使用缓存,强制重新构建
docker build --build-arg NODE_ENV=production -t myapp:1.0 . # 传入构建参数
docker build --target builder -t myapp:builder . # 多阶段构建,仅构建到指定阶段
docker build --platform linux/amd64 -t myapp:1.0 . # 指定构建平台(跨平台构建)
docker build --progress=plain -t myapp:1.0 . # 显示详细构建输出
# 查看构建历史
docker history nginx:latest
2.3 镜像标签与推送
bash
# 给镜像打标签(创建别名)
docker tag nginx:latest myregistry.com/nginx:v1.0
docker tag myapp:1.0 myapp:latest
# 推送镜像到仓库
docker push myregistry.com/nginx:v1.0
docker push myapp:1.0
# 登录/登出镜像仓库
docker login myregistry.com
docker login -u username -p password myregistry.com # 非交互式(CI/CD 用)
docker logout myregistry.com
# 保存镜像为 tar 文件(离线传输)
docker save -o nginx.tar nginx:latest
docker save nginx:latest mysql:5.7 > images.tar # 保存多个镜像
# 从 tar 文件加载镜像
docker load -i nginx.tar
2.4 镜像清理与维护
bash
# 删除单个镜像
docker rmi nginx:latest
docker image rm nginx:latest
# 强制删除(即使被容器使用)
docker rmi -f nginx:latest
# 批量删除悬空镜像(无标签)
docker image prune
docker image prune -f # 强制,不确认
# 删除所有未使用的镜像(未被容器引用)
docker image prune -a
docker image prune -a --filter "until=24h" # 删除24小时前的未使用镜像
# 查看镜像占用空间
docker system df
docker system df -v # 详细视图
三、容器生命周期管理(20个核心场景)
3.1 容器创建与启动
bash
# 基础运行(前台运行,Ctrl+C 停止)
docker run nginx
# 后台运行(守护模式)
docker run -d nginx
# 交互式运行(进入容器内部)
docker run -it ubuntu /bin/bash
docker run -it --rm ubuntu /bin/bash # 退出后自动删除容器
# 常用参数组合
docker run -d \
--name my-nginx \ # 指定容器名称
-p 8080:80 \ # 端口映射(主机端口:容器端口)
-p 127.0.0.1:8080:80 \ # 仅绑定本地接口
-p 80 \ # 随机分配主机端口
-v /host/data:/usr/share/nginx/html \ # 挂载主机目录
-v html-data:/usr/share/nginx/html \ # 使用命名卷
-e NGINX_HOST=example.com \ # 设置环境变量
-e MYSQL_ROOT_PASSWORD=123456 \
--restart unless-stopped \ # 自动重启策略
--memory 512m \ # 限制内存
--cpus 1.5 \ # 限制CPU
--network my-network \ # 指定网络
--ip 172.18.0.10 \ # 指定固定IP
nginx:latest
# 重启策略说明
# no: 不自动重启(默认)
# on-failure: 退出码非0时重启
# always: 总是重启
# unless-stopped: 总是重启,除非手动停止
3.2 容器启停控制
bash
# 启动/停止/重启容器
docker start my-nginx
docker stop my-nginx # 优雅停止(发送 SIGTERM,10秒后 SIGKILL)
docker stop -t 30 my-nginx # 自定义超时时间(秒)
docker restart my-nginx
# 强制停止(立即终止)
docker kill my-nginx
# 暂停/恢复(冻结容器状态)
docker pause my-nginx
docker unpause my-nginx
# 查看容器状态
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括停止的)
docker ps -q # 仅显示容器ID(批量操作时常用)
docker ps --filter "status=exited" --filter "name=nginx" # 筛选条件
3.3 进入运行中的容器
bash
# 执行命令(推荐,可执行任意命令)
docker exec -it my-nginx /bin/bash
docker exec -it my-nginx sh # 如果容器没有 bash
docker exec my-nginx ps aux # 不需要交互时不用 -it
# 以 root 用户进入(解决权限问题)
docker exec -u 0 -it my-nginx /bin/bash
# 附加到容器主进程(进入后 Ctrl+C 会停止容器)
docker attach my-nginx
# 在容器中执行单次命令
docker exec my-nginx nginx -t # 测试 nginx 配置
docker exec my-nginx ls -la /etc/nginx
3.4 容器查看与监控
bash
# 查看容器详细信息
docker inspect my-nginx
docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx # 提取特定字段
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx
# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx # 实时跟踪(类似 tail -f)
docker logs --tail 100 my-nginx # 查看最后100行
docker logs --since 10m my-nginx # 查看最近10分钟的日志
docker logs -t my-nginx # 显示时间戳
# 查看容器资源使用
docker stats # 实时查看所有容器资源使用
docker stats my-nginx # 查看指定容器
docker stats --no-stream # 只输出一次(非实时)
# 查看容器进程
docker top my-nginx
# 查看容器文件系统变更
docker diff my-nginx # 显示 A(添加)、D(删除)、C(变更)
3.5 容器清理与删除
bash
# 删除单个容器(需先停止)
docker rm my-nginx
# 强制删除(运行中也能删)
docker rm -f my-nginx
# 删除已停止的容器
docker container prune
docker container prune -f
# 批量删除(结合命令)
docker rm $(docker ps -aq) # 删除所有容器(危险!)
docker rm $(docker ps -aq --filter "status=exited") # 仅删除已停止的
docker rm $(docker ps -aq --filter "label=app=test") # 按标签删除
# 清理停止的容器、悬空镜像、未使用的网络和卷
docker system prune
docker system prune -a # 包括未使用的镜像(更彻底)
docker system prune -f # 强制,不确认
# 查看容器退出码
docker inspect my-nginx --format='{{.State.ExitCode}}'
四、数据持久化:卷与挂载(10个核心场景)
4.1 卷(Volume)管理
bash
# 创建卷
docker volume create my-data
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m tmp-vol # 创建 tmpfs 卷
# 查看卷
docker volume ls
docker volume inspect my-data
# 使用卷运行容器
docker run -d -v my-data:/data nginx
# 多个容器共享卷
docker run -d --name writer -v shared-vol:/data busybox sh -c "echo hello > /data/file.txt"
docker run -d --name reader -v shared-vol:/data busybox cat /data/file.txt
# 备份卷数据
docker run --rm -v my-data:/data -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
# 恢复卷数据
docker run --rm -v my-data:/data -v $(pwd):/backup busybox tar xvf /backup/backup.tar -C /
# 删除卷
docker volume rm my-data
docker volume prune # 删除未使用的卷
4.2 绑定挂载(Bind Mount)
bash
# 挂载主机目录(绝对路径)
docker run -d -v /host/path:/container/path nginx
# 挂载单个文件
docker run -d -v /host/nginx.conf:/etc/nginx/nginx.conf:ro nginx # 只读挂载
# 相对路径挂载(使用 $(pwd))
docker run -d -v $(pwd)/html:/usr/share/nginx/html nginx
# 挂载选项
docker run -d -v /host/data:/data:ro nginx # 只读
docker run -d -v /host/data:/data:rw nginx # 读写(默认)
docker run -d --mount type=bind,source=/host/data,target=/container/data,readonly nginx # 新语法(推荐)
4.3 临时文件系统(tmpfs)
bash
# 使用 tmpfs(数据仅存储在内存中,容器停止即消失)
docker run -d --tmpfs /tmp:noexec,nosuid,size=100m nginx
# 使用 --mount 语法
docker run -d --mount type=tmpfs,destination=/tmp,tmpfs-size=100m nginx
五、网络管理(12个核心场景)
5.1 网络基础操作
bash
# 查看网络列表
docker network ls
docker network ls --filter driver=bridge
# 查看网络详情
docker network inspect bridge
docker network inspect --format='{{range .Containers}}{{.Name}} {{end}}' my-network
# 创建网络
docker network create my-network
docker network create --driver bridge my-bridge
docker network create --subnet=172.18.0.0/16 --gateway=172.18.0.1 my-net
docker network create --ipv6 --subnet=2001:db8::/32 my-ipv6-net
# 连接/断开容器网络
docker network connect my-network my-container
docker network disconnect my-network my-container
# 删除网络
docker network rm my-network
docker network prune # 删除未使用的网络
5.2 容器网络模式
bash
# Bridge 模式(默认,容器间可通过 IP 通信)
docker run -d --network bridge nginx
# Host 模式(共享主机网络栈,性能最好但隔离性差)
docker run -d --network host nginx
# None 模式(无网络,完全隔离)
docker run -d --network none nginx
# 自定义网络(容器可通过名称互相访问,支持自动 DNS 解析)
docker network create app-net
docker run -d --name web --network app-net nginx
docker run -d --name api --network app-net myapi
# 在 api 容器内可直接 ping web,Docker 自动解析 IP
# 多网络连接(一个容器连接多个网络)
docker network create frontend
docker network create backend
docker run -d --name db --network backend mysql
docker run -d --name app --network backend myapp
docker network connect frontend app # app 同时连接 frontend 和 backend
5.3 端口映射与暴露
bash
# 随机映射(Docker 随机分配主机端口)
docker run -d -P nginx # 暴露 Dockerfile 中所有 EXPOSE 的端口
# 指定映射
docker run -d -p 8080:80 nginx # TCP
docker run -d -p 8080:80/udp nginx # UDP
docker run -d -p 127.0.0.1:8080:80 nginx # 仅本地访问
docker run -d -p [::1]:8080:80 nginx # IPv6 本地
docker run -d -p 80 nginx # 随机分配主机端口
# 多端口映射
docker run -d \
-p 8080:80 \
-p 8443:443 \
-p 127.0.0.1:3306:3306 \
mysql
六、Docker Compose 多容器编排(15个核心场景)
6.1 基础命令
bash
# 启动服务(后台)
docker-compose up -d
docker-compose -f docker-compose.prod.yml up -d # 指定文件
# 停止服务
docker-compose down
docker-compose down -v # 同时删除卷和网络
docker-compose down --rmi all # 同时删除镜像
# 查看状态
docker-compose ps
docker-compose logs
docker-compose logs -f web # 实时查看 web 服务日志
# 构建/重建服务
docker-compose build
docker-compose up -d --build # 启动前强制构建
docker-compose build --no-cache web # 无缓存构建指定服务
# 扩展服务实例数
docker-compose up -d --scale web=3 # 启动3个 web 实例
# 执行命令
docker-compose exec web /bin/bash
docker-compose run --rm api migrate # 运行一次性命令
# 重启/停止/启动单个服务
docker-compose restart web
docker-compose stop web
docker-compose start web
# 查看配置
docker-compose config # 验证并查看解析后的配置
docker-compose config -q # 仅验证,不输出
6.2 常用 docker-compose.yml 模板
Web + Database 基础模板:
yaml
version: '3.8'
services:
web:
build:
context: ./web
dockerfile: Dockerfile
ports:
- "8080:80"
environment:
- DB_HOST=db
- DB_PASSWORD_FILE=/run/secrets/db_password
volumes:
- web-data:/var/www/html
- ./config/nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- frontend
- backend
depends_on:
- db
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.25'
memory: 128M
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: appdb
volumes:
- db-data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- backend
secrets:
- db_root_password
command: --default-authentication-plugin=mysql_native_password
redis:
image: redis:alpine
volumes:
- redis-data:/data
networks:
- backend
volumes:
web-data:
db-data:
redis-data:
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 无外部访问
secrets:
db_password:
file: ./secrets/db_password.txt
db_root_password:
file: ./secrets/db_root_password.txt
七、Dockerfile 编写指南(12个核心场景)
7.1 多阶段构建(生产优化)
dockerfile
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
COPY . .
RUN npm run build
# 生产阶段(仅包含必要文件)
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
7.2 常见语言 Dockerfile 模板
Python 应用:
dockerfile
FROM python:3.11-slim
# 安全:创建非 root 用户
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
WORKDIR /app
# 先复制依赖,利用缓存层
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 切换非 root 用户
USER appuser
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8000/health || exit 1
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]
Go 应用(多阶段构建):
dockerfile
# 编译阶段
FROM golang:1.21-alpine AS builder
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
# 最小化运行镜像
FROM scratch
COPY --from=builder /build/main /main
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 8080
ENTRYPOINT ["/main"]
八、系统管理与调试(10个核心场景)
8.1 系统信息查看
bash
# Docker 系统信息
docker info
docker version
# 资源使用统计
docker system df
docker system df -v
# 事件监控(实时)
docker events
docker events --filter 'type=container' --filter 'event=stop'
docker events --since '1h' # 过去1小时的事件
8.2 容器调试技巧
bash
# 复制文件进出容器
docker cp my-container:/etc/nginx/nginx.conf ./nginx.conf # 容器到主机
docker cp ./app.js my-container:/app/app.js # 主机到容器
# 查看容器资源限制
docker inspect my-container --format='{{.HostConfig.Memory}}'
# 导出容器为镜像(保存现场)
docker commit my-container my-image:debug-version
# 从容器创建新镜像并导出
docker export my-container -o container-backup.tar # 导出文件系统(无历史层)
docker import container-backup.tar my-image:imported # 导入为镜像
# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container
# 容器网络抓包
docker run --rm --net container:my-container nicolaka/netshoot tcpdump -i eth0
8.3 日志管理
bash
# 配置日志驱动(运行时)
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 nginx
# 查看日志驱动配置
docker inspect my-container --format='{{.HostConfig.LogConfig}}'
# 清理日志(手动)
echo "" > $(docker inspect --format='{{.LogPath}}' my-container)
# 使用 syslog 驱动
docker run --log-driver syslog --log-opt syslog-address=udp://1.2.3.4:514 nginx
九、安全与最佳实践(8个核心场景)
9.1 安全运行
bash
# 以非 root 用户运行
docker run -d --user 1000:1000 nginx
# 只读文件系统 + 临时写入层
docker run -d --read-only --tmpfs /tmp:rw,noexec,nosuid,size=100m nginx
# 禁用特权 + 安全选项
docker run -d \
--security-opt no-new-privileges:true \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
nginx
# 限制资源防止 DoS
docker run -d \
--memory 512m \
--memory-swap 512m \
--cpus 1.0 \
--pids-limit 100 \
nginx
9.2 镜像安全扫描
bash
# 使用 Docker Scout 扫描(Docker Desktop 内置)
docker scout quickview nginx:latest
docker scout cves nginx:latest
docker scout recommendations nginx:latest
# 使用 Trivy 扫描(第三方,需安装)
trivy image nginx:latest
trivy image --severity HIGH,CRITICAL nginx:latest
# 镜像签名与验证(Docker Content Trust)
export DOCKER_CONTENT_TRUST=1
docker pull signed-image:latest # 仅拉取签名镜像
十、CI/CD 与自动化(8个核心场景)
10.1 常用 CI/CD 命令
bash
# 构建并推送(GitLab CI / GitHub Actions 常用)
docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
# 多平台构建(需开启 buildx)
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest --push .
# 层缓存优化(利用 registry 缓存)
docker build --cache-from $CI_REGISTRY_IMAGE:cache -t $CI_REGISTRY_IMAGE:latest --build-arg BUILDKIT_INLINE_CACHE=1 .
docker push $CI_REGISTRY_IMAGE:latest
# 清理 CI 环境
docker system prune -af --volumes
十一、常用场景示例
1. 运行一个 Nginx 并挂载本地目录
bash
docker run -d --name nginx-site -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html nginx
2. 进入容器调试
bash
docker exec -it nginx-site /bin/bash
3. 构建镜像并推送到仓库
bash
docker build -t myapp:1.0 .
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0
4. 使用 Compose 启动 LNMP 环境
创建 docker-compose.yml:
yaml
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
php:
image: php:fpm
volumes:
- ./html:/var/www/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
启动:
bash
docker-compose up -d
5. 备份与恢复数据卷
备份:
bash
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/mydata-backup.tar.gz -C /data .
恢复:
bash
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar xzf /backup/mydata-backup.tar.gz -C /data
6. 查看容器资源占用
bash
docker stats
7. 清理所有未使用的资源
bash
docker system prune -a --volumes
快速参考表
| 场景 | 命令 |
|---|---|
| 一键清理所有 | docker system prune -a --volumes -f |
| 查看容器 IP | docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container> |
| 实时查看日志 | docker logs -f --tail 100 <container> |
| 复制文件到容器 | docker cp <local> <container>:<path> |
| 进入容器调试 | docker exec -it <container> /bin/sh |
| 查看资源使用 | docker stats --no-stream |
| 批量停止容器 | docker stop $(docker ps -q) |
| 批量删除镜像 | docker rmi $(docker images -q --filter "dangling=true") |
| 导出导入镜像 | docker save/load |
| 多阶段构建 | docker build --target <stage> |