Docker 容器化运维实践

目录

  1. Docker 安装与配置
  2. 镜像管理
  3. 容器管理
  4. Dockerfile 编写
  5. 数据卷管理
  6. 网络管理
  7. Docker Compose
  8. 容器监控与日志
  9. 安全最佳实践

1. Docker 安装与配置

1.1 CentOS/RHEL 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 卸载旧版本
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 安装 yum 工具包
yum install -y yum-utils

# 添加 Docker 仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动 Docker
systemctl start docker
systemctl enable docker

# 验证安装
docker --version
docker run hello-world

1.2 Ubuntu/Debian 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 卸载旧版本
apt-get remove -y docker docker-engine docker.io containerd runc

# 安装依赖
apt-get update
apt-get install -y ca-certificates curl gnupg lsb-release

# 添加 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动 Docker
systemctl start docker
systemctl enable docker

1.3 配置镜像加速器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建/编辑配置文件
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF

# 重启 Docker
systemctl daemon-reload
systemctl restart docker

1.4 配置非 root 用户使用 Docker

1
2
3
4
5
6
7
8
9
10
11
# 创建 docker 组
groupadd docker

# 添加用户到 docker 组
usermod -aG docker $USER

# 应用组变更
newgrp docker

# 验证
docker run hello-world

2. 镜像管理

2.1 镜像操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 搜索镜像
docker search nginx
docker search --filter is-official=true nginx

# 拉取镜像
docker pull nginx:latest
docker pull nginx:1.21

# 查看本地镜像
docker images
docker image ls

# 查看镜像详情
docker inspect nginx

# 查看镜像历史
docker history nginx

2.2 镜像管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 删除镜像
docker rmi nginx:latest
docker image rm nginx:latest

# 删除所有悬空镜像
docker image prune

# 删除所有未使用镜像
docker image prune -a

# 镜像标签
docker tag nginx:latest myrepo/nginx:v1.0

# 保存镜像
docker save -o nginx.tar nginx:latest
docker save nginx:latest | gzip > nginx.tar.gz

# 加载镜像
docker load -i nginx.tar
docker load < nginx.tar.gz

2.3 构建镜像

1
2
3
4
5
6
7
8
9
10
11
# 基于 Dockerfile 构建
docker build -t myapp:v1.0 .

# 指定 Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .

# 构建参数
docker build --build-arg VERSION=1.0 -t myapp:v1.0 .

# 无缓存构建
docker build --no-cache -t myapp:v1.0 .

2.4 推送镜像

1
2
3
4
5
6
7
8
# 登录 Docker Hub
docker login

# 推送镜像
docker push myrepo/myapp:v1.0

# 推送所有标签
docker push myrepo/myapp --all-tags

3. 容器管理

3.1 创建与启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 运行容器
docker run -d --name my-nginx -p 80:80 nginx

# 交互式运行
docker run -it --name my-container ubuntu:20.04 /bin/bash

# 指定资源限制
docker run -d --name myapp --memory="512m" --cpus="1.0" myapp:v1.0

# 环境变量
docker run -d --name myapp -e ENV=production -e DB_HOST=localhost myapp:v1.0

# 挂载卷
docker run -d --name myapp -v /host/data:/container/data myapp:v1.0

3.2 容器操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 查看容器详情
docker inspect container_name

# 进入容器
docker exec -it container_name /bin/bash
docker exec -it container_name /bin/sh

# 查看容器日志
docker logs container_name
docker logs -f container_name
docker logs --tail 100 container_name

# 查看容器资源使用
docker stats
docker stats container_name

3.3 容器控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 停止容器
docker stop container_name
docker stop $(docker ps -q)

# 启动容器
docker start container_name

# 重启容器
docker restart container_name

# 暂停/恢复容器
docker pause container_name
docker unpause container_name

# 删除容器
docker rm container_name
docker rm -f container_name # 强制删除运行中的容器
docker rm $(docker ps -a -q) # 删除所有容器

3.4 容器文件操作

1
2
3
4
5
6
7
8
# 从容器复制文件到主机
docker cp container_name:/path/to/file /host/path/

# 从主机复制文件到容器
docker cp /host/path/file container_name:/container/path/

# 查看容器文件系统变更
docker diff container_name

4. Dockerfile 编写

4.1 基础结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 基础镜像
FROM ubuntu:20.04

# 维护者信息
LABEL maintainer="your@email.com"

# 环境变量
ENV APP_HOME=/app
ENV NODE_ENV=production

# 工作目录
WORKDIR $APP_HOME

# 复制文件
COPY package*.json ./
COPY . .

# 安装依赖
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*

# 暴露端口
EXPOSE 8080

# 启动命令
CMD ["node", "server.js"]

# 或者使用 ENTRYPOINT
ENTRYPOINT ["node"]
CMD ["server.js"]

4.2 多阶段构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 生产阶段
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
EXPOSE 8080
CMD ["node", "dist/server.js"]

4.3 最佳实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 使用具体版本的基础镜像
FROM node:16.13.0-alpine

# 合并 RUN 指令减少层数
RUN apk add --no-cache \
curl \
git \
&& rm -rf /var/cache/apk/*

# 使用 .dockerignore
# .git
# node_modules
# *.log
# .env

# 非 root 用户运行
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
USER nodejs

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1

5. 数据卷管理

5.1 数据卷类型

1
2
3
4
5
6
7
8
9
# 绑定挂载
docker run -v /host/path:/container/path nginx

# 命名卷
docker volume create mydata
docker run -v mydata:/container/data nginx

# 只读挂载
docker run -v /host/path:/container/path:ro nginx

5.2 卷操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建卷
docker volume create myvolume

# 查看卷
docker volume ls
docker volume inspect myvolume

# 删除卷
docker volume rm myvolume

# 删除未使用卷
docker volume prune

# 备份卷
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 /

6. 网络管理

6.1 网络类型

1
2
3
4
5
6
7
8
9
# 查看网络
docker network ls

# 创建网络
docker network create mynetwork
docker network create --driver bridge --subnet 172.20.0.0/16 mynetwork

# 查看网络详情
docker network inspect mynetwork

6.2 容器网络连接

1
2
3
4
5
6
7
8
# 运行时连接网络
docker run -d --network mynetwork --name web nginx

# 运行中连接网络
docker network connect mynetwork container_name

# 断开网络
docker network disconnect mynetwork container_name

6.3 容器间通信

1
2
3
4
5
6
# 同一网络内的容器可以通过名称通信
docker run -d --network mynetwork --name db postgres
docker run -d --network mynetwork --name web -e DB_HOST=db myapp

# 使用 link(已废弃,不推荐)
docker run -d --name web --link db:database myapp

7. Docker Compose

7.1 安装

1
2
3
4
5
# Docker Compose V2(作为 Docker 插件)
# 已随 Docker 一起安装

# 验证
docker compose version

7.2 docker-compose.yml 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: '3.8'

services:
web:
build: .
ports:
- "8080:8080"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
networks:
- app-network
restart: unless-stopped
volumes:
- ./logs:/app/logs

db:
image: postgres:13
environment:
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
- POSTGRES_DB=mydb
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-network
restart: unless-stopped

redis:
image: redis:6-alpine
networks:
- app-network
restart: unless-stopped

networks:
app-network:
driver: bridge

volumes:
postgres-data:

7.3 Compose 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 启动服务
docker compose up -d

# 停止服务
docker compose down

# 查看日志
docker compose logs -f
docker compose logs -f web

# 查看状态
docker compose ps

# 重启服务
docker compose restart

# 重建服务
docker compose up -d --build

# 执行命令
docker compose exec web /bin/bash

# 查看资源使用
docker compose top

8. 容器监控与日志

8.1 资源监控

1
2
3
4
5
6
7
8
# 实时资源使用
docker stats

# 一次性快照
docker stats --no-stream

# 查看容器进程
docker top container_name

8.2 日志管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看日志
docker logs container_name
docker logs -f container_name
docker logs --tail 100 container_name
docker logs --since 1h container_name
docker logs --until 10m container_name

# 日志驱动配置
# 在 daemon.json 中配置
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}

8.3 监控方案

1
2
3
4
5
6
7
8
9
10
11
12
# 使用 cAdvisor
docker run -d \
--name=cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
google/cadvisor:latest

# 使用 Prometheus + Grafana
# 参考 Prometheus 官方文档配置

9. 安全最佳实践

9.1 镜像安全

1
2
3
4
5
6
7
8
# 使用官方镜像
FROM node:16-alpine

# 扫描镜像漏洞
docker scan myapp:v1.0

# 使用固定版本
FROM node:16.13.0-alpine

9.2 容器安全

1
2
3
4
5
6
7
8
9
10
11
# 非 root 用户运行
docker run -u 1000:1000 myapp

# 只读文件系统
docker run --read-only myapp

# 限制能力
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp

# 禁用网络
docker run --network none myapp

9.3 网络安全

1
2
3
4
5
# 仅暴露必要端口
docker run -p 127.0.0.1:8080:8080 myapp

# 使用内部网络
docker network create --internal internal-net

9.4 密钥管理

1
2
3
4
5
6
7
8
# 使用 Docker Secrets(Swarm 模式)
echo "mypassword" | docker secret create db_password -

# 使用环境变量(不推荐敏感信息)
docker run -e DB_PASSWORD=mypassword myapp

# 使用密钥管理工具
# Docker Secrets, HashiCorp Vault 等

文档版本: 1.0
最后更新: 2026-02-27
适用版本: Docker 20.10+, Docker Compose V2