🏗️ 一、Docker基础架构理解

1.1 Docker核心组件关系

Docker采用客户端-服务器架构模式,理解各组件之间的关系对于高效使用Docker至关重要:

1.1.1 Docker Daemon(dockerd)
  • 作用:Docker的核心后台进程,负责管理镜像、容器、网络等资源
  • 特点:监听Docker API请求,管理Docker对象
  • 通信:通过UNIX套接字或网络接口与客户端通信
1.1.2 Docker Client(docker)
  • 作用:用户与Docker交互的主要接口
  • 特点:命令行工具,将用户命令转换为API调用
  • 使用:所有docker命令都通过客户端执行
1.1.3 Docker Registry
  • 作用:存储和分发Docker镜像的服务
  • 类型:
    • 公有仓库:Docker Hub、阿里云容器镜像服务等
    • 私有仓库:Harbor、Registry等

1.2 容器生命周期概念

容器的生命周期是理解Docker操作的基础:

创建 → 启动 → 运行 → 停止 → 重启 → 删除
1.2.1 容器状态详解
  • Created:已创建但未启动
  • Running:正在运行
  • Paused:已暂停
  • Exited:已停止
  • Dead:已死亡,无法重启
1.2.2 状态转换命令
# 创建容器
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

# 启动容器
docker start [OPTIONS] CONTAINER [CONTAINER...]

# 运行容器(创建+启动)
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 停止容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]

# 重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]

# 删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]

🖼️ 二、镜像管理命令

镜像是Docker的基石,掌握镜像管理命令是使用Docker的第一步。

2.1 镜像搜索与拉取

2.1.1 搜索镜像
# 基本搜索
docker search nginx

# 搜索官方镜像
docker search --filter is-official=true nginx

# 搜索星数超过100的镜像
docker search --filter stars=100 nginx

# 搜索自动化构建的镜像
docker search --filter is-automated=true nginx
2.1.2 拉取镜像
# 拉取最新版本
docker pull nginx

# 拉取指定版本
docker pull nginx:1.21

# 拉取所有版本
docker pull -a nginx

# 从私有仓库拉取
docker pull registry.example.com/private/nginx:latest

2.2 镜像查看与管理

2.2.1 查看本地镜像
# 查看所有镜像
docker images

# 查看镜像详细信息
docker image inspect nginx:latest

# 查看镜像历史
docker history nginx:latest

# 查看镜像摘要
docker image inspect --format='{{index .RepoDigests 0}}' nginx:latest
2.2.2 镜像标签管理
# 为镜像添加标签
docker tag nginx:latest my-nginx:v1.0

# 查看镜像所有标签
docker image ls --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

# 删除指定标签
docker rmi my-nginx:v1.0

2.3 镜像构建与清理

2.3.1 构建自定义镜像
# 使用Dockerfile构建镜像
docker build -t my-app:latest .

# 指定Dockerfile路径
docker build -f /path/to/Dockerfile -t my-app:latest .

# 构建时指定构建参数
docker build --build-arg NODE_VERSION=14 -t my-app:latest .

# 不使用缓存构建
docker build --no-cache -t my-app:latest .
2.3.2 镜像导出与导入
# 导出镜像到文件
docker save -o nginx-backup.tar nginx:latest

# 从文件导入镜像
docker load -i nginx-backup.tar

# 导出容器为镜像
docker export my-container > container-backup.tar

# 从容器备份导入镜像
docker import container-backup.tar my-imported-image:latest
2.3.3 镜像清理
# 删除所有未使用的镜像
docker image prune

# 删除所有悬空镜像
docker image prune --filter "dangling=true"

# 删除所有未使用的镜像(强制)
docker image prune -a

# 按条件删除镜像
docker image prune --filter "until=24h"

2.4 镜像安全检查

# 扫描镜像漏洞(需要Docker Desktop或第三方工具)
docker scan nginx:latest

# 查看镜像签名信息
docker trust inspect nginx:latest

# 验证镜像签名
docker trust verify nginx:latest

📦 三、容器管理核心命令

容器是Docker的核心概念,掌握容器管理命令是日常工作的重点。

3.1 容器创建与启动

3.1.1 创建容器
# 基本创建
docker create --name my-nginx nginx:latest

# 创建时指定端口映射
docker create --name my-nginx -p 8080:80 nginx:latest

# 创建时指定数据卷
docker create --name my-nginx -v /host/path:/container/path nginx:latest

# 创建时指定环境变量
docker create --name my-nginx -e ENV=production nginx:latest

# 创建时指定网络
docker create --name my-nginx --network my-network nginx:latest
3.1.2 启动容器
# 启动已创建的容器
docker start my-nginx

# 启动容器并附加到终端
docker start -i my-nginx

# 启动所有已停止的容器
docker start $(docker ps -aq)
3.1.3 运行容器(创建+启动)
# 后台运行容器
docker run -d --name my-nginx nginx:latest

# 前台运行容器
docker run -it --name my-nginx nginx:latest /bin/bash

# 运行容器并自动删除
docker run --rm --name my-nginx nginx:latest

# 运行容器并限制资源
docker run --memory="512m" --cpus="1.0" --name my-nginx nginx:latest

3.2 容器状态管理

3.2.1 查看容器状态
# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 查看最近创建的容器
docker ps -l

# 查看容器详细信息
docker inspect my-nginx

# 查看容器资源使用情况
docker stats my-nginx

# 查看所有容器资源使用情况
docker stats --no-stream
3.2.2 容器生命周期控制
# 停止容器
docker stop my-nginx

# 强制停止容器
docker kill my-nginx

# 暂停容器
docker pause my-nginx

# 恢复暂停的容器
docker unpause my-nginx

# 重启容器
docker restart my-nginx

# 删除容器
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

# 删除所有已停止的容器
docker container prune

3.3 容器交互操作

3.3.1 进入容器
# 使用exec进入运行中的容器
docker exec -it my-nginx /bin/bash

# 使用attach附加到容器
docker attach my-nginx

# 在容器中执行单个命令
docker exec my-nginx nginx -v

# 以特定用户身份执行命令
docker exec -u root my-nginx whoami
3.3.2 文件操作
# 复制文件到容器
docker cp ./local-file.txt my-nginx:/container/path/

# 从容器复制文件
docker cp my-nginx:/container/path/file.txt ./

# 在容器中创建文件
docker exec my-nginx touch /tmp/test.txt

# 在容器中编辑文件
docker exec -it my-nginx vi /etc/nginx/nginx.conf

3.4 容器日志管理

3.4.1 查看日志
# 查看容器日志
docker logs my-nginx

# 实时查看日志
docker logs -f my-nginx

# 查看最近100行日志
docker logs --tail 100 my-nginx

# 查看特定时间段的日志
docker logs --since 1h my-nginx

# 查看带时间戳的日志
docker logs -t my-nginx
3.4.2 日志管理
# 清空容器日志
truncate -s 0 /var/lib/docker/containers/*/*-json.log

# 配置日志驱动(运行时)
docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 my-nginx

# 查看日志配置
docker inspect my-nginx --format='{{.HostConfig.LogConfig}}'

📁 四、数据卷与网络管理

数据卷和网络是容器持久化存储和通信的关键组件。

4.1 数据卷管理

4.1.1 数据卷基本操作
# 创建数据卷
docker volume create my-volume

# 查看所有数据卷
docker volume ls

# 查看数据卷详细信息
docker volume inspect my-volume

# 删除数据卷
docker volume rm my-volume

# 删除所有未使用的数据卷
docker volume prune
4.1.2 数据卷挂载
# 使用命名数据卷
docker run -d --name my-nginx -v my-volume:/usr/share/nginx/html nginx:latest

# 使用主机目录挂载
docker run -d --name my-nginx -v /host/path:/container/path nginx:latest

# 使用只读挂载
docker run -d --name my-nginx -v /host/path:/container/path:ro nginx:latest

# 使用绑定挂载
docker run -d --name my-nginx --mount type=bind,source=/host/path,target=/container/path nginx:latest
4.1.3 数据卷备份与恢复
# 备份数据卷
docker run --rm -v my-volume:/volume -v $(pwd):/backup alpine tar cvf /backup/my-volume-backup.tar /volume

# 恢复数据卷
docker run --rm -v my-volume:/volume -v $(pwd):/backup alpine tar xvf /backup/my-volume-backup.tar -C /volume --strip 1

# 复制数据卷
docker run --rm -v source-volume:/from -v target-volume:/to alpine cp -a /from/. /to/

4.2 网络管理

4.2.1 网络基本操作
# 查看所有网络
docker network ls

# 创建桥接网络
docker network create my-network

# 创建自定义桥接网络(指定子网)
docker network create --subnet=192.168.1.0/24 my-network

# 查看网络详细信息
docker network inspect my-network

# 删除网络
docker network rm my-network

# 删除所有未使用的网络
docker network prune
4.2.2 网络模式配置

Docker支持多种网络模式,每种模式适用于不同的场景:

# Bridge模式(默认)
docker run -d --name my-nginx --network bridge nginx:latest

# Host模式(共享主机网络)
docker run -d --name my-nginx --network host nginx:latest

# None模式(无网络)
docker run -d --name my-nginx --network none nginx:latest

# Container模式(共享容器网络)
docker run -d --name my-nginx2 --network container:my-nginx nginx:latest

# 自定义网络
docker run -d --name my-nginx --network my-network nginx:latest
4.2.3 网络连接管理
# 将容器连接到网络
docker network connect my-network my-nginx

# 断开容器与网络的连接
docker network disconnect my-network my-nginx

# 连接时指定别名
docker network connect --alias nginx my-network my-nginx

# 连接时指定IP地址
docker network connect --ip 192.168.1.100 my-network my-nginx
4.2.4 端口映射
# 映射单个端口
docker run -d --name my-nginx -p 8080:80 nginx:latest

# 映射多个端口
docker run -d --name my-nginx -p 8080:80 -p 8443:443 nginx:latest

# 映射到随机端口
docker run -d --name my-nginx -p 80 nginx:latest

# 映射到特定IP地址
docker run -d --name my-nginx -p 192.168.1.100:8080:80 nginx:latest

# 映射UDP端口
docker run -d --name my-nginx -p 53:53/udp dns-server:latest

4.3 容器间通信

4.3.1 DNS解析
# 在自定义网络中,容器可以通过容器名互相访问
docker run -d --name web-app --network my-network nginx:latest
docker run -d --name db-server --network my-network mysql:latest

# 在web-app容器中可以通过容器名访问数据库
docker exec web-app ping db-server
4.3.2 网络安全配置
# 创建网络时启用内部模式(隔离外部访问)
docker network create --internal my-internal-network

# 配置网络别名
docker network connect --alias web --alias app my-network my-container

# 网络隔离配置
docker network create --subnet=192.168.1.0/24 --gateway=192.168.1.1 my-isolated-network

⚡ 五、实用命令技巧

掌握一些实用的命令技巧可以大大提高工作效率。

5.1 批量操作命令

5.1.1 批量容器操作
# 停止所有运行中的容器
docker stop $(docker ps -q)

# 删除所有已停止的容器
docker rm $(docker ps -aq)

# 删除所有容器(包括运行中的)
docker rm -f $(docker ps -aq)

# 启动所有已停止的容器
docker start $(docker ps -q -f "status=exited")

# 重启所有容器
docker restart $(docker ps -q)
5.1.2 批量镜像操作
# 删除所有悬空镜像
docker rmi $(docker images -q -f "dangling=true")

# 删除所有镜像
docker rmi $(docker images -q)

# 删除指定名称的所有镜像
docker rmi $(docker images | grep "nginx" | awk '{print $3}')

# 清理所有未使用的资源
docker system prune -a

5.2 资源限制设置

5.2.1 内存限制
# 限制容器内存使用
docker run -d --memory="512m" --name my-nginx nginx:latest

# 限制内存并设置交换内存
docker run -d --memory="1g" --memory-swap="2g" --name my-nginx nginx:latest

# 限制内存使用率
docker run -d --memory-reservation="256m" --name my-nginx nginx:latest
5.2.2 CPU限制
# 限制CPU使用核心数
docker run -d --cpus="1.5" --name my-nginx nginx:latest

# 限制CPU使用权重
docker run -d --cpu-shares=512 --name my-nginx nginx:latest

# 绑定容器到特定CPU核心
docker run -d --cpuset-cpus="0,1" --name my-nginx nginx:latest
5.2.3 磁盘I/O限制
# 限制磁盘读取速度
docker run -d --device-read-bps=/dev/sda:1mb --name my-nginx nginx:latest

# 限制磁盘写入速度
docker run -d --device-write-bps=/dev/sda:1mb --name my-nginx nginx:latest

# 限制磁盘I/O操作次数
docker run -d --device-read-iops=/dev/sda:1000 --name my-nginx nginx:latest

5.3 容器监控命令

5.3.1 实时监控
# 实时监控容器资源使用
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"

# 监控特定容器
docker stats my-nginx --no-stream

# 自定义监控格式
docker stats --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
5.3.2 健康检查
# 运行容器时设置健康检查
docker run -d --name my-nginx \
  --health-cmd="curl -f http://localhost/ || exit 1" \
  --health-interval=30s \
  --health-timeout=10s \
  --health-retries=3 \
  nginx:latest

# 查看容器健康状态
docker inspect my-nginx --format='{{.State.Health.Status}}'

# 查看健康检查详细信息
docker inspect my-nginx --format='{{json .State.Health}}'

5.4 实用脚本示例

5.4.1 容器备份脚本
#!/bin/bash
# backup_containers.sh

# 创建备份目录
BACKUP_DIR="/backup/containers/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 备份所有容器
for container in $(docker ps -aq); do
    container_name=$(docker inspect --format='{{.Name}}' $container | sed 's/\///')
    echo "Backing up container: $container_name"
    
    # 导出容器
    docker export $container > $BACKUP_DIR/${container_name}.tar
    
    # 备份容器配置
    docker inspect $container > $BACKUP_DIR/${container_name}.json
    
    # 备份数据卷
    docker run --rm -v /var/lib/docker/volumes:/volumes alpine tar czf $BACKUP_DIR/${container_name}_volumes.tar.gz -C /volumes .
done

echo "Backup completed: $BACKUP_DIR"
5.4.2 容器清理脚本
#!/bin/bash
# cleanup_docker.sh

echo "Cleaning up Docker resources..."

# 停止所有容器
echo "Stopping all containers..."
docker stop $(docker ps -q) 2>/dev/null

# 删除已停止的容器
echo "Removing stopped containers..."
docker container prune -f

# 删除未使用的镜像
echo "Removing unused images..."
docker image prune -f

# 删除未使用的网络
echo "Removing unused networks..."
docker network prune -f

# 删除未使用的卷
echo "Removing unused volumes..."
docker volume prune -f

# 清理构建缓存
echo "Cleaning build cache..."
docker builder prune -f

echo "Cleanup completed!"
5.4.3 容器监控脚本
#!/bin/bash
# monitor_containers.sh

while true; do
    clear
    echo "=== Docker Container Monitor ==="
    echo "Time: $(date)"
    echo ""
    
    # 显示容器状态
    echo "Container Status:"
    docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
    
    echo ""
    echo "Resource Usage:"
    docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
    
    echo ""
    echo "Health Status:"
    for container in $(docker ps -q); do
        name=$(docker inspect --format='{{.Name}}' $container | sed 's/\///')
        health=$(docker inspect --format='{{.State.Health.Status}}' $container 2>/dev/null || echo "no-health-check")
        echo "$name: $health"
    done
    
    sleep 5
done

📋 六、命令速查表

6.1 镜像管理命令速查

命令功能示例
docker search搜索镜像docker search nginx
docker pull拉取镜像docker pull nginx:latest
docker images查看本地镜像docker images
docker rmi删除镜像docker rmi nginx:latest
docker build构建镜像docker build -t my-app .
docker save导出镜像docker save -o app.tar my-app
docker load导入镜像docker load -i app.tar

6.2 容器管理命令速查

命令功能示例
docker run运行容器docker run -d nginx
docker ps查看容器docker ps -a
docker stop停止容器docker stop my-container
docker start启动容器docker start my-container
docker restart重启容器docker restart my-container
docker rm删除容器docker rm my-container
docker exec执行命令docker exec -it my-container bash
docker logs查看日志docker logs -f my-container

6.3 数据卷与网络命令速查

命令功能示例
docker volume create创建数据卷docker volume create my-vol
docker volume ls查看数据卷docker volume ls
docker network create创建网络docker network create my-net
docker network ls查看网络docker network ls
docker network connect连接网络docker network connect my-net my-container
docker network disconnect断开网络docker network disconnect my-net my-container
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐