Docker 容器化运维实践
目录
- Docker 安装与配置
- 镜像管理
- 容器管理
- Dockerfile 编写
- 数据卷管理
- 网络管理
- Docker Compose
- 容器监控与日志
- 安全最佳实践
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 install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
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
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
apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
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
systemctl daemon-reload systemctl restart docker
|
1.4 配置非 root 用户使用 Docker
1 2 3 4 5 6 7 8 9 10 11
| groupadd 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
| docker build -t myapp:v1.0 .
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 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 ["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 apk add --no-cache \ curl \ git \ && rm -rf /var/cache/apk/*
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
docker run -d --name web --link db:database myapp
|
7. Docker Compose
7.1 安装
1 2 3 4 5
|
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
{ "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
| 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
|
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
| 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
| echo "mypassword" | docker secret create db_password -
docker run -e DB_PASSWORD=mypassword myapp
|
文档版本: 1.0
最后更新: 2026-02-27
适用版本: Docker 20.10+, Docker Compose V2