Docker容器管理完全指南
AI生成:本文由人工智能辅助生成,内容已经过人工审核。
本文详细介绍了Docker容器的基本概念、安装配置、镜像管理、容器编排、网络设置、存储管理、监控和常见问题解决方案,帮助你全面掌握Docker容器管理技术。
1. Docker基础知识
Docker是一种开源的容器化平台,让开发者能够将应用及其依赖打包到一个轻量、可移植的容器中,确保在任何环境中都能一致地运行。
1.1 Docker的核心概念
- 镜像(Image): 应用程序及其依赖的只读模板
- 容器(Container): 镜像的运行实例,相互隔离
- 仓库(Registry): 存储和分发Docker镜像的服务
- Dockerfile: 用于构建Docker镜像的脚本文件
- Docker Compose: 定义和运行多容器应用的工具
- Docker Swarm/Kubernetes: 容器编排工具
1.2 Docker架构
Docker采用客户端-服务器(C/S)架构:
- Docker守护进程(Docker Daemon): 管理Docker对象
- Docker客户端(Docker Client): 与Docker守护进程交互的命令行工具
- Docker仓库(Docker Registry): 存储Docker镜像
2. 安装与配置Docker
2.1 在主流Linux发行版上安装Docker
Ubuntu/Debian安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| apt update
apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt install -y docker-ce docker-ce-cli containerd.io
systemctl start docker systemctl enable docker
|
CentOS/RHEL安装
1 2 3 4 5 6 7 8 9 10 11 12
| yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker systemctl enable docker
|
2.2 安装Docker Compose
Docker Compose是用于定义和运行多容器Docker应用的工具。
1 2 3 4 5 6 7 8 9 10 11
| curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
|
2.3 Docker基本配置
Docker守护进程配置文件通常位于/etc/docker/daemon.json
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| cat > /etc/docker/daemon.json << EOF { "data-root": "/var/lib/docker", "storage-driver": "overlay2", "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" }, "default-address-pools": [ { "base": "172.17.0.0/16", "size": 24 } ], "registry-mirrors": ["https://registry.docker-cn.com"], "experimental": false } EOF
systemctl restart docker
|
2.4 配置非root用户运行Docker
默认情况下,Docker命令需要root权限。可以将用户添加到docker组以避免使用sudo:
1 2 3 4 5 6 7 8 9 10 11
| groupadd docker
usermod -aG docker $USER
newgrp docker
docker run hello-world
|
3. Docker镜像管理
3.1 搜索和拉取镜像
1 2 3 4 5 6 7
| docker search nginx
docker pull nginx docker pull nginx:1.19 docker pull nginx:1.19.10-alpine
|
3.2 查看和管理本地镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker images docker image ls
docker image inspect nginx
docker rmi nginx docker image rm nginx:1.19 docker rmi $(docker images -q)
docker image prune docker image prune -a
|
3.3 使用Dockerfile构建镜像
Dockerfile是用于构建Docker镜像的脚本文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| cat > Dockerfile << EOF
FROM nginx:alpine
LABEL maintainer="Your Name <your.email@example.com>"
WORKDIR /usr/share/nginx/html
COPY ./html/ .
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"] EOF
docker build -t my-nginx:1.0 . docker build -t my-nginx:1.0 -f Dockerfile .
|
Dockerfile常用指令:
FROM
: 指定基础镜像
LABEL
: 添加元数据
RUN
: 执行命令并创建新层
COPY
/ADD
: 复制文件到容器
WORKDIR
: 设置工作目录
ENV
: 设置环境变量
EXPOSE
: 声明容器监听的端口
VOLUME
: 创建挂载点
CMD
/ENTRYPOINT
: 指定容器启动命令
3.4 将镜像推送到仓库
1 2 3 4 5 6 7 8 9 10 11
| docker login [registry-url]
docker tag my-nginx:1.0 username/my-nginx:1.0
docker push username/my-nginx:1.0
docker logout [registry-url]
|
3.5 设置私有Docker仓库
使用Docker Registry镜像快速搭建私有仓库:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v /var/lib/registry:/var/lib/registry \ registry:2
cat > /etc/docker/daemon.json << EOF { "insecure-registries": ["myregistry.example.com:5000"] } EOF
systemctl restart docker
docker tag my-nginx:1.0 myregistry.example.com:5000/my-nginx:1.0 docker push myregistry.example.com:5000/my-nginx:1.0
|
4. Docker容器管理
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
| docker run -d --name my-nginx -p 80:80 nginx
docker run -d \ --name wordpress \ -p 8080:80 \ -v wordpress_data:/var/www/html \ -e WORDPRESS_DB_HOST=db \ -e WORDPRESS_DB_USER=wordpress \ -e WORDPRESS_DB_PASSWORD=password \ -e WORDPRESS_DB_NAME=wordpress \ --network wordpress-net \ --restart always \ wordpress:latest
|
4.2 管理容器生命周期
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
| docker ps
docker ps -a
docker start my-nginx docker stop my-nginx docker restart my-nginx
docker pause my-nginx docker unpause my-nginx
docker rm my-nginx docker rm -f my-nginx docker rm $(docker ps -aq)
docker logs my-nginx docker logs -f my-nginx docker logs --tail 100 my-nginx
docker exec -it my-nginx bash docker exec -it my-nginx sh
|
4.3 监控容器
1 2 3 4 5 6 7 8 9 10 11
| docker stats
docker stats my-nginx
docker top my-nginx
docker inspect my-nginx
|
4.4 容器资源限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker run -d \ --name limited-nginx \ --memory="512m" \ --memory-swap="1g" \ --cpus="0.5" \ --cpu-shares=512 \ -p 8080:80 \ nginx
docker update \ --memory="1g" \ --cpus="1" \ my-nginx
|
5. Docker数据管理
5.1 数据卷(Volumes)
数据卷是Docker持久化数据的首选机制,完全由Docker管理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| docker volume create my-vol
docker volume ls
docker volume inspect my-vol
docker volume rm my-vol docker volume prune
docker run -d \ --name nginx-with-volume \ -v my-vol:/usr/share/nginx/html \ -p 8080:80 \ nginx
|
5.2 绑定挂载(Bind Mounts)
绑定挂载将主机文件系统的路径直接挂载到容器中:
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker run -d \ --name nginx-with-bind \ -v /host/path:/usr/share/nginx/html \ -p 8081:80 \ nginx
docker run -d \ --name nginx-readonly \ -v /host/path:/usr/share/nginx/html:ro \ -p 8082:80 \ nginx
|
5.3 临时文件系统(tmpfs)
tmpfs挂载存储在主机系统的内存中,不会写入主机文件系统:
1 2 3 4 5 6
| docker run -d \ --name nginx-tmpfs \ --tmpfs /usr/share/nginx/html:rw,size=100M,mode=700 \ -p 8083:80 \ nginx
|
5.4 数据备份与恢复
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker run --rm \ -v my-vol:/source \ -v $(pwd):/backup \ alpine \ tar -czf /backup/my-vol-backup.tar.gz -C /source .
docker run --rm \ -v my-vol:/target \ -v $(pwd):/backup \ alpine \ sh -c "rm -rf /target/* && tar -xzf /backup/my-vol-backup.tar.gz -C /target"
|
6. Docker网络
6.1 Docker网络基础
Docker提供了多种网络驱动:
bridge
: 默认网络,容器通过网桥连接
host
: 容器共享主机网络命名空间
none
: 容器没有网络连接
overlay
: 用于Swarm服务的多主机网络
macvlan
: 为容器分配MAC地址
ipvlan
: 类似macvlan,但不分配MAC地址
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker network ls
docker network inspect bridge
docker network create my-net docker network create --driver overlay my-overlay
docker network rm my-net docker network prune
|
6.2 容器网络管理
1 2 3 4 5 6 7 8 9 10 11 12
| docker run -d \ --name nginx-custom-net \ --network my-net \ -p 8084:80 \ nginx
docker network connect my-net my-nginx
docker network disconnect my-net my-nginx
|
6.3 端口映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker run -d --name nginx-random -P nginx
docker run -d --name nginx-specific -p 8080:80 nginx
docker run -d --name nginx-interface -p 127.0.0.1:8080:80 nginx
docker run -d \ --name nginx-multi-ports \ -p 8080:80 \ -p 8443:443 \ nginx
|
6.4 容器间通信
同一网络中的容器可以通过容器名称相互访问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| docker network create app-network
docker run -d \ --name mysql \ --network app-network \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=wordpress \ mysql:5.7
docker run -d \ --name wordpress \ --network app-network \ -p 8085:80 \ -e WORDPRESS_DB_HOST=mysql \ -e WORDPRESS_DB_USER=root \ -e WORDPRESS_DB_PASSWORD=password \ -e WORDPRESS_DB_NAME=wordpress \ wordpress
|
7. Docker Compose
Docker Compose用于定义和运行多容器应用,通过YAML文件配置应用服务。
7.1 基本使用
创建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
| version: '3'
services: web: image: nginx:alpine ports: - "8086:80" volumes: - ./html:/usr/share/nginx/html restart: always depends_on: - app app: build: ./app volumes: - ./app:/code environment: - DEBUG=true db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=myapp
volumes: db_data:
|
常用命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| docker-compose up -d
docker-compose ps
docker-compose logs -f
docker-compose stop
docker-compose start
docker-compose restart
docker-compose down
docker-compose down -v
|
7.2 扩展服务实例
1 2
| docker-compose up -d --scale app=3
|
7.3 多环境配置
创建多个环境的Compose文件:
docker-compose.yml
: 基本配置
docker-compose.override.yml
: 默认覆盖配置(开发环境)
docker-compose.prod.yml
: 生产环境配置
启动生产环境配置:
1
| docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
|
8. Docker安全最佳实践
8.1 容器安全配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| docker run -d \ --name secure-nginx \ --user 1000:1000 \ -p 8087:80 \ nginx
docker run -d \ --name restricted-nginx \ --cap-drop ALL \ --cap-add NET_BIND_SERVICE \ -p 8088:80 \ nginx
docker run -d \ --name readonly-nginx \ --read-only \ -v /tmp \ -p 8089:80 \ nginx
|
8.2 镜像安全
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker scan nginx:latest
FROM alpine:3.14 FROM scratch
FROM golang:1.16 AS builder WORKDIR /app COPY . . RUN go build -o myapp
FROM alpine:3.14 COPY --from=builder /app/myapp /usr/local/bin/ CMD ["myapp"]
|
8.3 容器运行时安全
1 2 3 4 5 6 7 8 9 10 11 12
| docker run -d \ --name limited-resources \ --cpus="0.5" \ --memory="256m" \ --pids-limit=100 \ -p 8090:80 \ nginx
export DOCKER_CONTENT_TRUST=1 docker pull nginx:latest
|
8.4 Docker守护进程安全
编辑/etc/docker/daemon.json
:
1 2 3 4 5 6 7 8 9
| { "icc": false, "userns-remap": "default", "no-new-privileges": true, "live-restore": true, "userland-proxy": false, "log-driver": "syslog", "selinux-enabled": true }
|
8.5 容器运行时安全监控
使用安全工具监控Docker环境:
- Docker Bench Security: Docker官方安全基准测试工具
- Falco: 容器运行时安全监控
- Clair: 静态镜像漏洞分析
1 2 3 4 5 6 7
| docker run -it --net host --pid host --userns host --cap-add audit_control \ -v /var/lib:/var/lib \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/lib/systemd:/usr/lib/systemd \ -v /etc:/etc --label docker_bench_security \ docker/docker-bench-security
|
9. Docker高级主题
9.1 Docker Swarm集群
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
| docker swarm init --advertise-addr <MANAGER-IP>
docker swarm join --token <TOKEN> <MANAGER-IP>:2377
docker node ls
docker service create \ --name web \ --replicas 3 \ --publish 8080:80 \ nginx:alpine
docker service scale web=5
docker service update \ --image nginx:1.19 \ --update-parallelism 2 \ --update-delay 20s \ web
|
9.2 Docker健康检查
在Dockerfile中配置健康检查:
1 2 3
| FROM nginx:alpine HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost/ || exit 1
|
运行时配置健康检查:
1 2 3 4 5 6 7 8 9
| docker run -d \ --name healthcheck-nginx \ --health-cmd="curl -f http://localhost/ || exit 1" \ --health-interval=30s \ --health-timeout=3s \ --health-retries=3 \ --health-start-period=5s \ -p 8091:80 \ nginx
|
9.3 Docker API和SDK
Docker提供REST API和各种语言的SDK:
1 2 3 4 5 6 7 8 9 10 11 12 13
| cat > /etc/systemd/system/docker.service.d/override.conf << EOF [Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 EOF
systemctl daemon-reload systemctl restart docker
curl http://localhost:2375/info | jq
|
9.4 使用Docker Registry API
1 2 3 4 5
| curl -X GET http://myregistry:5000/v2/_catalog
curl -X GET http://myregistry:5000/v2/nginx/tags/list
|
10. 常见问题排查
10.1 容器启动问题
1 2 3 4 5 6 7 8
| docker logs <container-id>
docker run -it --rm nginx:alpine sh
docker inspect <container-id> --format='{{.State.ExitCode}}'
|
10.2 网络连接问题
1 2 3 4 5 6 7 8 9 10 11
| docker network inspect bridge
docker exec -it my-nginx ping google.com
docker port my-nginx
docker run --rm --net=container:<container-id> nicolaka/netshoot
|
10.3 存储问题
1 2 3 4 5 6 7 8
| docker inspect <container-id> --format='{{json .Mounts}}' | jq
df -h /var/lib/docker
df -i /var/lib/docker
|
10.4 资源使用问题
1 2 3 4 5 6 7 8 9 10
| docker stats
top free -m df -h
docker system df
|
10.5 完全清理Docker环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
docker volume rm $(docker volume ls -q)
docker network rm $(docker network ls -q | grep -v "bridge\|host\|none")
docker system prune -a --volumes
|
总结
Docker容器技术极大地简化了应用的部署和管理,通过容器化可以实现一次构建、到处运行的开发模式。本文详细介绍了Docker的基本概念、安装配置、镜像和容器管理、存储和网络设置、Docker Compose使用以及安全最佳实践,希望能帮助您更好地利用Docker技术进行应用部署和管理。
合理利用Docker工具链和生态系统,不仅可以提高开发和部署效率,还能优化资源利用,降低运维成本,打造更加灵活和可靠的应用基础设施。