Docker容器管理完全指南

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

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

# 添加Docker仓库
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 更新包索引
apt update

# 安装Docker
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

# 添加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

# 启动并设置开机自启
systemctl start docker
systemctl enable docker

2.2 安装Docker Compose

Docker Compose是用于定义和运行多容器Docker应用的工具。

1
2
3
4
5
6
7
8
9
10
11
# 下载Docker Compose
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

# 重启Docker服务
systemctl restart docker

2.4 配置非root用户运行Docker

默认情况下,Docker命令需要root权限。可以将用户添加到docker组以避免使用sudo:

1
2
3
4
5
6
7
8
9
10
11
# 创建docker组(可能已存在)
groupadd docker

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

# 应用组变更(需注销后重新登录,或执行以下命令)
newgrp docker

# 验证是否可以不使用sudo运行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
# 创建示例Dockerfile
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

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 Hub或私有仓库
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 Registry容器
docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /var/lib/registry:/var/lib/registry \
registry:2

# 配置本地Docker使用私有仓库
cat > /etc/docker/daemon.json << EOF
{
"insecure-registries": ["myregistry.example.com:5000"]
}
EOF

# 重启Docker
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

# 常用参数说明
# -d, --detach 后台运行
# -p, --publish 映射端口(主机端口:容器端口)
# -v, --volume 挂载卷(主机路径:容器路径)
# --name 指定容器名称
# --restart 重启策略(no|always|on-failure|unless-stopped)
# -e, --env 设置环境变量
# --network 指定网络
# --link 链接到其他容器(已弃用)
# --memory 限制内存
# --cpus 限制CPU

# 更复杂的示例
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 # 查看最后100行日志

# 进入容器
docker exec -it my-nginx bash # 使用bash
docker exec -it my-nginx sh # 使用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
# 使用tmpfs运行容器
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 # 创建bridge网络
docker network create --driver overlay my-overlay # 创建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

# 运行MySQL容器
docker run -d \
--name mysql \
--network app-network \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7

# 运行WordPress容器并连接到MySQL
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
# 扩展app服务到3个实例
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
# 以非root用户运行容器
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 # 需要Docker Desktop

# 使用精简基础镜像
FROM alpine:3.14 # 而不是完整的Debian/Ubuntu
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
# 限制容器资源以防止DoS攻击
docker run -d \
--name limited-resources \
--cpus="0.5" \
--memory="256m" \
--pids-limit=100 \
-p 8090:80 \
nginx

# 启用Docker内容信任
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, // 使用iptables直接路由
"log-driver": "syslog", // 集中日志管理
"selinux-enabled": true // 启用SELinux
}

8.5 容器运行时安全监控

使用安全工具监控Docker环境:

  • Docker Bench Security: Docker官方安全基准测试工具
  • Falco: 容器运行时安全监控
  • Clair: 静态镜像漏洞分析
1
2
3
4
5
6
7
# 运行Docker Bench Security
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
# 初始化Swarm集群
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
# 启用Docker远程API(谨慎操作,确保安全)
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

# 重启Docker服务
systemctl daemon-reload
systemctl restart docker

# 通过API获取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

# 检查inode使用情况
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使用的总磁盘空间
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工具链和生态系统,不仅可以提高开发和部署效率,还能优化资源利用,降低运维成本,打造更加灵活和可靠的应用基础设施。