Docker从入门到精通技术指南
目录
- Docker 简介与核心概念
- Docker 安装与配置
- Docker 镜像操作
- Docker 容器管理
- Dockerfile 最佳实践
- Docker Compose 实战
- Docker 网络与存储
- Docker 安全最佳实践
- Docker 性能优化
- Docker 在生产环境中的应用
1. Docker 简介与核心概念
1.1 什么是 Docker
Docker 是一个开源的容器化平台,用于开发、部署和运行应用程序。容器允许开发者将应用程序及其所有依赖项打包到一个轻量级、可移植的容器中,确保应用程序在任何环境下都能一致地运行。
1.2 Docker 的核心概念
镜像(Image)
Docker 镜像是一个只读模板,用于创建容器。镜像包含了运行应用程序所需的所有内容:代码、运行时、库、环境变量和配置文件。镜像采用分层结构,可以通过继承和叠加来构建复杂的多层镜像。
容器(Container)
容器是镜像的运行实例。容器是从镜像创建的可运行实例,它包含了自己的文件系统、进程空间和网络接口。容器是隔离的,每个容器都有自己的文件系统、进程和网络栈,它们相互之间不会干扰。
仓库(Repository)
仓库是存储镜像的地方,分为公共仓库和私有仓库。Docker Hub 是最大的公共仓库,包含了官方镜像和社区贡献的镜像。用户也可以搭建私有仓库来存储自己的镜像。
1.3 Docker 的优势
| 优势 | 说明 |
|---|---|
| 一致性 | 消除"在我机器上能运行"的问题 |
| 轻量级 | 相比虚拟机,容器共享操作系统内核,启动更快 |
| 可移植性 | 可以在任何支持 Docker 的系统上运行 |
| 隔离性 | 容器之间相互隔离,互不影响 |
| 版本控制 | 支持镜像版本管理和回滚 |
| 快速部署 | 几秒钟内即可启动容器 |
1.4 Docker 架构
Docker 采用客户端-服务器架构,主要包含以下组件:
- Docker Daemon:运行在主机上的后台进程,负责构建、运行和管理容器
- Docker Client:命令行工具,用户通过它与 Docker Daemon 交互
- Docker Registry:存储镜像的仓库服务,Docker Hub 是默认的公共仓库
2. Docker 安装与配置
2.1 在 Windows 上安装 Docker
系统要求
- Windows 10/11 专业版、企业版或教育版
- 启用 Hyper-V 和Containers 功能
- 至少 4GB 内存
- 64 位处理器
安装步骤
# 使用 Chocolatey 安装
choco install docker-desktop
# 或者手动下载安装
# 访问 https://www.docker.com/products/docker-desktop 下载安装包
# 安装完成后,启动 Docker Desktop
WSL2 后端配置(推荐)
# 在 PowerShell 中启用 WSL2
wsl --install
# 更新 WSL2 内核
wsl --update
# 验证安装
docker --version
docker run hello-world
2.2 在 Linux 上安装 Docker
Ubuntu/Debian
# 更新包索引
sudo apt update
# 安装依赖包
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker run hello-world
CentOS/RHEL
# 安装依赖
sudo yum install -y yum-utils
# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker
2.3 Docker 配置
配置镜像加速
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
在 Docker Desktop 中:Settings -> Docker Engine -> 添加上述配置
在 Linux 中编辑 /etc/docker/daemon.json:
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl restart docker
配置资源限制
{
"memory": "4g",
"memorySwap": "2g",
"cpu": 2,
"storage": "50gb"
}
2.4 Docker Compose 安装
Docker Desktop 已包含 Docker Compose。对于 Linux 系统:
# 方法一:通过 pip 安装
pip install docker-compose
# 方法二:从 GitHub 下载
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证
docker-compose --version
3. Docker 镜像操作
3.1 镜像基础操作
搜索镜像
# 搜索镜像
docker search nginx
# 搜索官方镜像
docker search --filter "is-official=true" nginx
# 搜索星级大于 1000 的镜像
docker search --filter "stars=1000" nginx
拉取镜像
# 拉取最新版本
docker pull nginx
# 拉取指定版本标签
docker pull nginx:1.25
# 拉取所有标签
docker pull -a nginx
列出镜像
# 列出本地镜像
docker images
# 显示镜像 ID
docker images -q
# 显示悬空镜像(无标签)
docker images -f "dangling=true"
# 显示格式化输出
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
删除镜像
# 删除单个镜像
docker rmi nginx
# 强制删除
docker rmi -f nginx
# 删除悬空镜像
docker image prune
# 删除所有未使用的镜像
docker image prune -a
# 删除特定仓库的所有镜像
docker rmi $(docker images -q nginx)
3.2 镜像构建
使用 Dockerfile 构建
# 构建镜像
docker build -t myapp:1.0 .
# 指定 Dockerfile 路径
docker build -t myapp:1.0 -f /path/to/Dockerfile .
# 使用构建缓存
docker build -t myapp:1.0 --cache-from myapp:previous .
# 构建时传递构建参数
docker build --build-arg VERSION=1.0 -t myapp:1.0 .
# 多阶段构建
docker build -t myapp:1.0 -f Dockerfile.multi .
手动构建镜像
# 从容器创建镜像
docker commit -m "Add new feature" -a "Author" container_id myapp:1.0
# 导入 tar 文件创建镜像
docker import - myapp:1.0 < /path/to/image.tar
3.3 镜像管理
镜像标签
# 为镜像添加标签
docker tag myapp:1.0 myregistry.com/myapp:1.0
# 为镜像添加多个标签
docker tag myapp:1.0 myapp:latest myapp:production
镜像推送
# 登录 Docker Hub
docker login
# 登录私有仓库
docker login myregistry.com
# 推送到 Docker Hub
docker push myapp:1.0
# 推送到私有仓库
docker push myregistry.com/myapp:1.0
镜像历史
# 查看镜像构建历史
docker history myapp:1.0
# 显示详细历史
docker history --no-trunc myapp:1.0
镜像 prune
# 清理所有悬空镜像
docker image prune
# 清理所有未使用的镜像
docker image prune -a
# 清理构建缓存
docker builder prune
4. Docker 容器管理
4.1 容器基础操作
创建并启动容器
# 创建并启动容器
docker run -d --name mynginx nginx
# 交互式容器
docker run -it --name myubuntu ubuntu /bin/bash
# 启动后自动删除(临时容器)
docker run --rm --name tempnginx nginx
启动和停止容器
# 启动已停止的容器
docker start mynginx
# 停止容器
docker stop mynginx
# 重启容器
docker restart mynginx
# 暂停容器
docker pause mynginx
# 取消暂停
docker unpause mynginx
# 发送信号而非强制停止
docker kill -s SIGTERM mynginx
查看容器
# 列出运行中的容器
docker ps
# 列出所有容器(包括停止的)
docker ps -a
# 显示容器 ID
docker ps -q
# 显示容器的详细信息
docker inspect mynginx
# 查看容器日志
docker logs mynginx
# 实时跟踪日志
docker logs -f mynginx
# 显示最近 N 行日志
docker logs --tail 100 mynginx
进入容器
# 使用 exec 进入容器
docker exec -it mynginx /bin/bash
# 在容器中执行单个命令
docker exec mynginx ls -la
# 使用 attach 附加到容器(不推荐)
docker attach mynginx
删除容器
# 删除已停止的容器
docker rm mynginx
# 强制删除运行中的容器
docker rm -f mynginx
# 删除所有已停止的容器
docker container prune
# 删除所有容器(包括运行中的)
docker rm -f $(docker ps -aq)
4.2 容器资源管理
内存限制
# 限制内存为 512MB
docker run -m 512m --name mynginx nginx
# 设置内存和交换空间
docker run -m 512m --memory-swap 1g --name mynginx nginx
CPU 限制
# 限制使用 2 个 CPU 核心
docker run --cpus=2 --name mynginx nginx
# 限制 CPU 权重(相对值)
docker run --cpu-shares=1024 --name mynginx nginx
I/O 限制
# 限制读写速率
docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb --name mynginx nginx
存储限制
# 创建带有存储限制的容器
docker run --storage-opt size=10g --name mynginx nginx
4.3 容器网络
端口映射
# 映射端口
docker run -p 8080:80 --name mynginx nginx
# 映射多个端口
docker run -p 8080:80 -p 443:443 --name mynginx nginx
# 映射特定 IP
docker run -p 127.0.0.1:8080:80 --name mynginx nginx
网络模式
# 使用 bridge 网络(默认)
docker run --network bridge --name mynginx nginx
# 使用 host 网络(共享主机网络命名空间)
docker run --network host --name mynginx nginx
# 使用 none 网络(无网络)
docker run --network none --name mynginx nginx
# 使用自定义网络
docker run --network mynetwork --name mynginx nginx
4.4 数据卷挂载
# 挂载主机目录
docker run -v /host/path:/container/path --name mynginx nginx
# 挂载只读目录
docker run -v /host/path:/container/path:ro --name mynginx nginx
# 使用命名卷
docker run -v myvolume:/container/path --name mynginx nginx
# 挂载单个文件
docker run -v /host/file:/container/file:ro --name mynginx nginx
4.5 容器健康检查
# 在 Dockerfile 中定义健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
# 在 docker run 中定义健康检查
docker run --health-cmd="curl -f http://localhost/" --health-interval=30s --health-timeout=3s --name mynginx nginx
5. Dockerfile 最佳实践
5.1 Dockerfile 基础指令
# 基础镜像
FROM node:18-alpine
# 维护者信息
LABEL maintainer="author@example.com"
# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000
# 设置工作目录
WORKDIR /app
# 复制文件
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 定义启动命令
CMD ["node", "server.js"]
5.2 Dockerfile 最佳实践
减少镜像层数
# 不推荐:多个 RUN 指令会产生多个层
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get clean
# 推荐:合并为一个 RUN 指令
RUN apt-get update && apt-get install -y nginx \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
使用多阶段构建
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]
利用构建缓存
# 顺序很重要:先复制依赖文件,再安装,最后复制代码
COPY package*.json ./
RUN npm ci
COPY . .
使用 .dockerignore
# 排除不需要的文件
node_modules
npm-debug.log
.git
.gitignore
*.md
docs/
tests/
.env.local
使用轻量级基础镜像
# 推荐:使用 alpine 镜像
FROM node:18-alpine
# 不推荐:使用完整系统镜像
FROM ubuntu:22.04
5.3 Dockerfile 示例
Node.js 应用
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
USER node
CMD ["node", "index.js"]
Python 应用
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
Go 应用
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app
FROM alpine:3.18
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/app .
EXPOSE 8080
CMD ["./app"]
5.4 构建参数与环境变量
# 构建参数
ARG VERSION=latest
FROM nginx:${VERSION}
# 环境变量
ENV APP_ENV=production
# 运行时覆盖构建参数
docker build --build-arg VERSION=1.0 -t myapp .
5.5 安全最佳实践
# 创建非 root 用户
RUN addgroup -g 1000 appgroup && adduser -u 1000 -G appgroup -s /bin/sh -D appuser
# 切换到非 root 用户
USER appuser
# 确保文件所有权正确
COPY --chown=appuser:appgroup . .
6. Docker Compose 实战
6.1 Docker Compose 基础
docker-compose.yml 基础结构
version: '3.8'
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- frontend
api:
build: ./api
environment:
- DATABASE_URL=postgres://db:5432/app
depends_on:
- db
networks:
- frontend
- backend
db:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
networks:
frontend:
backend:
volumes:
db-data:
6.2 Docker Compose 命令
# 启动所有服务
docker-compose up
# 后台启动
docker-compose up -d
# 启动指定服务
docker-compose up web
# 停止服务
docker-compose down
# 停止并删除 volumes
docker-compose down -v
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
# 实时日志
docker-compose logs -f
# 重新构建服务
docker-compose build
# 重新创建服务
docker-compose up --force-recreate
# 进入服务容器
docker-compose exec web sh
# 扩展服务(Docker Compose v2)
docker-compose up -d --scale web=3
6.3 服务依赖与启动顺序
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
6.4 环境变量与配置
services:
app:
build:
context: .
args:
- BUILD_VERSION=1.0
environment:
- NODE_ENV=production
- DB_HOST=$${DB_HOST} # 从主机环境变量读取
env_file:
- ./config/app.env
ports:
- "${APP_PORT:-3000}:3000"
创建 .env 文件:
APP_PORT=8080
DB_HOST=localhost
6.5 高级特性
重启策略
services:
web:
image: nginx
restart: unless-stopped
# restart: no # 不重启
# restart: on-failure # 失败时重启
# restart: always # 始终重启
健康检查
services:
db:
image: postgres:15
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
资源限制
services:
web:
image: nginx
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
横向扩展
services:
worker:
image: worker
deploy:
replicas: 3
6.6 实际应用示例
Node.js + MongoDB + Redis
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- MONGODB_URI=mongodb://mongo:27017/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- mongo
- redis
networks:
- app-network
mongo:
image: mongo:6
volumes:
- mongo-data:/data/db
networks:
- app-network
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
networks:
- app-network
volumes:
mongo-data:
redis-data:
networks:
app-network:
driver: bridge
微服务架构
version: '3.8'
services:
gateway:
build: ./gateway
ports:
- "8080:8080"
networks:
- microservices
auth-service:
build: ./auth-service
environment:
- JWT_SECRET=secret
networks:
- microservices
user-service:
build: ./user-service
depends_on:
- auth-service
networks:
- microservices
order-service:
build: ./order-service
depends_on:
- auth-service
networks:
- microservices
networks:
microservices:
7. Docker 网络与存储
7.1 Docker 网络
网络驱动类型
| 驱动 | 说明 | 适用场景 |
|---|---|---|
| bridge | 默认网络,容器与容器之间通信 | 单主机容器通信 |
| host | 共享主机网络命名空间 | 性能敏感场景 |
| overlay | 跨主机容器通信 | Docker Swarm |
| macvlan | 为容器分配 MAC 地址 | 需要直接网络访问 |
| none | 无网络 | 离线任务 |
管理网络
# 创建网络
docker network create mynetwork
# 创建自定义 bridge 网络
docker network create --driver bridge mybridge
# 列出网络
docker network ls
# 查看网络详情
docker network inspect mynetwork
# 连接容器到网络
docker network connect mynetwork container1
# 断开容器网络
docker network disconnect mynetwork container1
# 删除网络
docker network rm mynetwork
网络配置示例
services:
web:
networks:
- frontend
- backend
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
backend:
driver: bridge
internal: true # 禁止外部访问
7.2 Docker 存储
存储驱动
| 驱动 | 说明 | 适用场景 |
|---|---|---|
| overlay2 | 默认推荐 | 通用场景 |
| aufs | 早期存储驱动 | 兼容性需求 |
| devicemapper | 块级存储 | 生产环境 |
| btrfs | 文件系统级别 | 需要快照功能 |
| zfs | 高级存储功能 | 数据安全要求高 |
管理卷
# 创建卷
docker volume create myvolume
# 列出卷
docker volume ls
# 查看卷详情
docker volume inspect myvolume
# 删除未使用的卷
docker volume prune
# 删除指定卷
docker volume rm myvolume
卷类型
# 匿名卷(自动创建和删除)
services:
app:
volumes:
- /app/data
# 命名卷
services:
app:
volumes:
- myvolume:/app/data
# 主机绑定挂载
services:
app:
volumes:
- ./local-path:/app/data
# 只读挂载
services:
app:
volumes:
- myvolume:/app/data:ro
卷插件
# 使用 NFS 卷
volumes:
nfs-volume:
driver: local
driver_opts:
type: nfs
o: addr=192.168.1.1,rw
device: ":/path/to/share"
# 使用 CIFS/SMB 卷
volumes:
smb-volume:
driver: local
driver_opts:
type: cifs
o: username=admin,password=secret
device: "//server/share"
7.3 数据共享与备份
容器间数据共享
services:
app1:
volumes:
- shared-data:/data
app2:
volumes:
- shared-data:/data
volumes:
shared-data:
备份与恢复
# 备份卷
docker run --rm -v myvolume:/data -v $(pwd):/backup alpine tar cvf /backup/backup.tar /data
# 恢复卷
docker run --rm -v myvolume:/data -v $(pwd):/backup alpine tar xvf /backup/backup.tar -C /
8. Docker 安全最佳实践
8.1 镜像安全
使用官方镜像
优先使用官方镜像并定期更新:
# 定期更新基础镜像
docker pull node:18-alpine
# 使用具体版本标签
FROM node:18.17.0-alpine3.18
扫描镜像漏洞
# 使用 Docker Scout
docker scout cves myimage:latest
# 使用 Trivy
trivy image myimage:latest
# 使用 Clair
clair-scanner myimage:latest
签名和验证镜像
# 启用 Docker Content Trust
export DOCKER_CONTENT_TRUST=1
# 拉取签名镜像
docker pull myimage:latest
8.2 运行时安全
以非 root 用户运行
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001
USER nextjs
WORKDIR /app
COPY --chown=nextjs:nodejs . .
限制容器权限
# 只读文件系统
docker run --read-only --tmpfs /tmp myimage
# 删除所有能力,只保留必需的能力
docker run --cap-drop all --cap-add NET_BIND_SERVICE myimage
# 禁止新增内核模块
docker run --cap-drop=SYS_MODULE myimage
# 禁止容器访问主机设备
docker run --device /dev/sda:/dev/sda myimage
资源限制
services:
app:
image: myapp
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
reservations:
memory: 256M
8.3 主机安全
保持 Docker 更新
# 检查 Docker 版本
docker version
# 更新 Docker(Ubuntu)
sudo apt update
sudo apt upgrade docker-ce
限制 Docker socket 访问
# 不要将 Docker socket 挂载到容器中
# 禁止这样使用:docker run -v /var/run/docker.sock:/var/run/docker.sdk ...
启用 AppArmor/SELinux
# 查看 AppArmor 状态
aa-status
# 查看 SELinux 状态
getenforce
# 为容器启用 SELinux
docker run --security-opt label=type:container_t myimage
8.4 网络安全
隔离网络
services:
web:
networks:
- public
api:
networks:
- internal
internal: true
使用 TLS 保护注册表
services:
registry:
image: registry:2
ports:
- "5000:5000"
environment:
- REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt
- REGISTRY_HTTP_TLS_KEY=/certs/server.key
volumes:
- ./certs:/certs
8.5 安全工具集成
Docker Bench for Security
# 运行安全检查
docker run -it --net host --privileged -v /var/run/docker.sock:/var/run/docker.sock docker/docker-bench-security
Falco
# docker-compose.yml
services:
falco:
image: falcosecurity/falco
privileged: true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc:/host/proc:ro
- /boot:/host/boot:ro
- /lib/modules:/host/lib/modules:ro
9. Docker 性能优化
9.1 镜像优化
减少镜像层数
# 不推荐
RUN apt-get update
RUN apt-get install -y python
RUN apt-get install -y nodejs
RUN apt-get clean
# 推荐
RUN apt-get update && apt-get install -y python nodejs \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
使用构建缓存
# 调整层顺序,先安装依赖
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
多阶段构建
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
9.2 运行时优化
使用轻量级镜像
# 推荐:Alpine 镜像
FROM node:18-alpine
# 不推荐:完整系统镜像
FROM ubuntu:22.04
并行化容器
# 使用 docker-compose 并行启动
docker-compose up -d
# 限制并发构建
docker build --build-arg BUILDKIT_INLINE_CACHE=1 .
优化网络
services:
app:
dns:
- 8.8.8.8
- 8.8.4.4
dns_search: mydomain.local
9.3 资源管理
合理设置资源限制
# 生产环境推荐设置
docker run -m 512m --cpus=1 --pids-limit=100 myimage
使用健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
CMD curl -f http://localhost/health || exit 1
清理资源
# 清理构建缓存
docker builder prune -a
# 清理悬空镜像
docker image prune
# 清理停止的容器
docker container prune
# 完整清理
docker system prune -a --volumes
9.4 监控与调试
资源监控
# 查看容器资源使用
docker stats
# 查看容器详情
docker inspect --format='{{.State}}' mycontainer
# 实时监控
docker stats --no-stream
性能分析
# 查看容器进程
docker top mycontainer
# 查看容器网络统计
docker network inspect bridge
# 查看容器磁盘 I/O
docker inspect --format='{{.BlkioWeight}}' mycontainer
日志优化
# 限制日志大小
docker run --log-opt max-size=10m --log-opt max-file=3 myimage
# 清空日志
echo "" > /var/lib/docker/containers/$(docker inspect --format='{{.Id}}' mycontainer)/$(docker inspect --format='{{.Id}}' mycontainer)-json.log
10. Docker 在生产环境中的应用
10.1 生产环境部署
Docker Swarm 集群
# 初始化 Swarm
docker swarm init --advertise-addr 192.168.1.10
# 添加工作节点
docker swarm join --token TOKEN manager-ip:2377
# 查看节点
docker node ls
# 部署服务
docker service create \
--name myservice \
--replicas 3 \
-p 80:80 \
nginx:latest
# 扩展服务
docker service scale myservice=5
# 更新服务
docker service update --image nginx:1.25 myservice
Docker Stack 部署
# docker-compose.yml
version: '3.8'
services:
web:
image: myapp:latest
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
networks:
- webnet
networks:
webnet:
driver: overlay
# 部署 Stack
docker stack deploy -c docker-compose.yml myapp
# 查看 Stack
docker stack ls
docker stack ps myapp
# 删除 Stack
docker stack rm myapp
10.2 CI/CD 集成
GitHub Actions 示例
name: Docker Build and Push
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: myapp:latest
GitLab CI 示例
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
deploy:
stage: deploy
image: alpine:latest
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker pull $IMAGE_TAG
- docker run -d $IMAGE_TAG
10.3 日志管理
日志收集
# 使用 docker logs
docker logs -f mycontainer
# 使用 ELK Stack
# docker-compose.yml
services:
elasticsearch:
image: elasticsearch:8.10.0
environment:
- discovery.type=single-node
logstash:
image: logstash:8.10.0
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
kibana:
image: kibana:8.10.0
ports:
- "5601:5601"
日志驱动配置
# 使用 JSON 文件日志驱动
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 myimage
# 使用 syslog 日志驱动
docker run --log-driver syslog --log-opt syslog-address=tcp://localhost:514 myimage
10.4 监控与告警
Prometheus + Grafana
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
cAdvisor 监控
# 运行 cAdvisor
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
gcr.io/cadvisor/cadvisor:latest
10.5 滚动更新与回滚
滚动更新
# 使用 Docker Swarm 进行滚动更新
docker service update --image nginx:1.25 myservice
# 滚动更新配置
docker service update \
--update-parallelism 1 \
--update-delay 10s \
--update-failure-action rollback \
myservice
回滚
# 回滚到上一个版本
docker service rollback myservice
# 查看服务历史
docker service history myservice
10.6 高可用与负载均衡
服务高可用
services:
web:
image: myapp
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
max_attempts: 3
nginx:
image: nginx:alpine
ports:
- "80:80"
depends_on:
- web
负载均衡
services:
proxy:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
networks:
- app-network
web:
image: myapp
networks:
- app-network
networks:
app-network:
附录
常用命令速查表
# 镜像操作
docker pull <image> # 拉取镜像
docker images # 列出镜像
docker rmi <image> # 删除镜像
docker build -t <name> . # 构建镜像
docker tag <image> <tag> # 标记镜像
# 容器操作
docker run -d <image> # 后台运行容器
docker run -it <image> sh # 交互式运行
docker ps # 列出运行中的容器
docker ps -a # 列出所有容器
docker exec -it <container> sh # 进入容器
docker logs <container> # 查看日志
docker stop <container> # 停止容器
docker rm <container> # 删除容器
# Docker Compose
docker-compose up -d # 启动服务
docker-compose down # 停止服务
docker-compose ps # 查看服务状态
docker-compose logs -f # 查看日志
# 系统管理
docker system df # 磁盘使用
docker system prune # 清理资源
docker stats # 资源监控
常见问题解决
容器无法启动
# 查看详细错误信息
docker logs <container>
# 检查容器状态
docker inspect <container>
# 检查资源限制
docker stats <container>
网络问题
# 检查网络
docker network ls
docker network inspect bridge
# 重新创建网络
docker network rm mynetwork
docker network create mynetwork
磁盘空间不足
# 清理未使用的资源
docker system prune -a --volumes
# 清理构建缓存
docker builder prune -a
相关资源
- Docker 官方文档:https://docs.docker.com/
- Docker Hub:https://hub.docker.com/
- Docker Compose 文档:https://docs.docker.com/compose/
- Awesome Docker:https://github.com/veggiemonk/awesome-docker
总结
本文档从 Docker 的基础概念出发,逐步深入到生产环境中的应用,涵盖了 Docker 开发的各个方面。通过掌握这些知识,你将能够:
- 理解容器化的核心概念和优势
- 熟练使用 Docker 进行开发、测试和部署
- 编写高效的 Dockerfile 和 Docker Compose 配置
- 实现容器网络和存储的正确配置
- 遵循安全最佳实践保护你的容器环境
- 优化容器性能并进行有效的监控
- 在生产环境中实现高可用和自动化的部署
随着容器技术的不断发展,Docker 已成为现代云原生应用开发的基础。持续学习和实践将帮助你更好地掌握这一强大的技术。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)