Skip to content

容器基础操作

本章将详细介绍 Docker 容器的基础操作,包括创建、启动、停止、删除容器,以及容器的监控和管理。

容器生命周期管理

容器状态转换图

    create
┌─────────────┐
│   Created   │
└─────┬───────┘
      │ start

┌─────────────┐    pause    ┌─────────────┐
│   Running   │◄──────────►│   Paused    │
└─────┬───────┘             └─────────────┘
      │ stop

┌─────────────┐
│   Stopped   │
└─────┬───────┘
      │ rm

┌─────────────┐
│   Removed   │
└─────────────┘

基本生命周期操作

bash
# 1. 创建容器(不启动)
docker create --name mycontainer nginx:latest

# 2. 启动已创建的容器
docker start mycontainer

# 3. 创建并启动容器
docker run --name mycontainer nginx:latest

# 4. 停止运行中的容器
docker stop mycontainer

# 5. 强制停止容器
docker kill mycontainer

# 6. 重启容器
docker restart mycontainer

# 7. 暂停容器
docker pause mycontainer

# 8. 恢复暂停的容器
docker unpause mycontainer

# 9. 删除容器
docker rm mycontainer

# 10. 强制删除运行中的容器
docker rm -f mycontainer

容器运行模式

前台运行 vs 后台运行

bash
# 前台运行(阻塞终端)
docker run nginx:latest

# 后台运行(守护进程模式)
docker run -d nginx:latest

# 后台运行并指定名称
docker run -d --name web-server nginx:latest

交互式运行

bash
# 交互式运行 Ubuntu 容器
docker run -it ubuntu:20.04 /bin/bash

# 参数说明:
# -i: 保持 STDIN 开放,即使没有附加
# -t: 分配一个伪终端

# 在后台运行的容器中执行交互式命令
docker exec -it container_name /bin/bash

# 执行单个命令
docker exec container_name ls -la /app

# 以特定用户身份执行命令
docker exec -u root container_name whoami

一次性运行

bash
# 运行完成后自动删除容器
docker run --rm ubuntu:20.04 echo "Hello Docker"

# 交互式一次性容器
docker run --rm -it ubuntu:20.04 /bin/bash

容器配置选项

基本配置

bash
# 指定容器名称
docker run --name myapp nginx

# 设置主机名
docker run --hostname myhost nginx

# 设置工作目录
docker run -w /app nginx

# 设置用户
docker run -u 1000:1000 nginx

# 设置环境变量
docker run -e NODE_ENV=production -e PORT=3000 node

# 从文件读取环境变量
docker run --env-file .env node

资源限制

bash
# 限制内存使用
docker run -m 512m nginx
docker run --memory=1g nginx

# 限制 CPU 使用
docker run --cpus="1.5" nginx
docker run --cpuset-cpus="0,1" nginx

# 设置 CPU 权重
docker run --cpu-shares=512 nginx

# 限制磁盘 I/O
docker run --device-read-bps /dev/sda:1mb nginx
docker run --device-write-bps /dev/sda:1mb nginx

网络配置

bash
# 端口映射
docker run -p 8080:80 nginx                    # 映射到指定端口
docker run -p 127.0.0.1:8080:80 nginx         # 映射到指定 IP
docker run -p 8080:80/udp nginx               # UDP 端口映射
docker run -P nginx                            # 映射所有暴露的端口

# 网络模式
docker run --network bridge nginx             # 桥接网络(默认)
docker run --network host nginx               # 主机网络
docker run --network none nginx               # 无网络
docker run --network container:other nginx    # 共享其他容器网络

# 自定义网络
docker network create mynetwork
docker run --network mynetwork nginx

# 添加主机名解析
docker run --add-host myhost:192.168.1.100 nginx

# 设置 DNS
docker run --dns 8.8.8.8 --dns 8.8.4.4 nginx

容器查看和监控

列出容器

bash
# 列出运行中的容器
docker ps

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

# 只显示容器 ID
docker ps -q

# 自定义输出格式
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"

# 过滤容器
docker ps --filter "status=running"
docker ps --filter "name=web"
docker ps --filter "ancestor=nginx"

# 显示最近创建的 N 个容器
docker ps -n 5

查看容器详细信息

bash
# 查看容器详细配置
docker inspect container_name

# 获取特定信息
docker inspect --format='{{.State.Status}}' container_name
docker inspect --format='{{.NetworkSettings.IPAddress}}' container_name
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name

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

# 实时监控所有容器
docker stats

# 查看容器进程
docker top container_name

# 查看容器端口映射
docker port container_name

容器日志管理

bash
# 查看容器日志
docker logs container_name

# 实时跟踪日志
docker logs -f container_name

# 显示最近的 N 行日志
docker logs --tail 50 container_name

# 显示带时间戳的日志
docker logs -t container_name

# 显示指定时间范围的日志
docker logs --since "2023-01-01T00:00:00" container_name
docker logs --until "2023-12-31T23:59:59" container_name

# 组合使用
docker logs -f --tail 100 --since "1h" container_name

容器文件操作

文件复制

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

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

# 复制目录
docker cp container_name:/app/logs ./logs/

# 复制并重命名
docker cp container_name:/app/config.json ./backup-config.json

文件挂载

bash
# 挂载主机目录到容器
docker run -v /host/path:/container/path nginx

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

# 使用数据卷
docker run -v myvolume:/data nginx

# 挂载单个文件
docker run -v /host/config.conf:/app/config.conf nginx

# 临时文件系统挂载
docker run --tmpfs /tmp nginx

容器网络操作

网络连接管理

bash
# 创建自定义网络
docker network create --driver bridge mynetwork

# 查看网络列表
docker network ls

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

# 将容器连接到网络
docker network connect mynetwork container_name

# 断开容器网络连接
docker network disconnect mynetwork container_name

# 删除网络
docker network rm mynetwork

# 清理未使用的网络
docker network prune

容器间通信

bash
# 创建网络
docker network create app-network

# 运行数据库容器
docker run -d --name database --network app-network \
  -e POSTGRES_PASSWORD=password postgres:13

# 运行应用容器
docker run -d --name webapp --network app-network \
  -p 8080:80 nginx

# 在应用容器中可以通过容器名访问数据库
# 例如:连接字符串可以使用 "database:5432"

容器安全操作

用户和权限

bash
# 以非 root 用户运行
docker run -u 1000:1000 nginx

# 以指定用户名运行
docker run -u nginx:nginx nginx

# 添加用户到组
docker run --group-add audio nginx

# 设置安全选项
docker run --security-opt no-new-privileges nginx

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

# 禁用特权模式
docker run --privileged=false nginx

资源隔离

bash
# 限制设备访问
docker run --device=/dev/sda:/dev/sda nginx

# 设置 cgroup 父级
docker run --cgroup-parent /docker/mygroup nginx

# 设置 PID 命名空间
docker run --pid host nginx

# 设置 IPC 命名空间
docker run --ipc container:other nginx

批量容器操作

批量管理命令

bash
# 停止所有运行中的容器
docker stop $(docker ps -q)

# 删除所有已停止的容器
docker rm $(docker ps -aq --filter "status=exited")

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

# 清理系统
docker system prune                    # 清理未使用的资源
docker system prune -a                 # 清理所有未使用的资源
docker container prune                 # 只清理容器
docker image prune                     # 只清理镜像
docker volume prune                    # 只清理数据卷
docker network prune                   # 只清理网络

使用过滤器批量操作

bash
# 停止特定镜像的所有容器
docker stop $(docker ps -q --filter "ancestor=nginx")

# 删除特定状态的容器
docker rm $(docker ps -aq --filter "status=exited")

# 删除特定标签的容器
docker rm $(docker ps -aq --filter "label=env=test")

# 删除创建时间超过 24 小时的容器
docker container prune --filter "until=24h"

容器调试技巧

调试运行中的容器

bash
# 进入容器进行调试
docker exec -it container_name /bin/bash

# 查看容器进程
docker exec container_name ps aux

# 查看容器网络配置
docker exec container_name ip addr show

# 查看容器环境变量
docker exec container_name env

# 查看容器文件系统
docker exec container_name df -h

# 测试网络连通性
docker exec container_name ping google.com

调试容器启动问题

bash
# 查看容器退出原因
docker logs container_name

# 查看容器详细信息
docker inspect container_name

# 以调试模式运行
docker run -it --entrypoint /bin/bash nginx

# 覆盖默认命令
docker run -it nginx /bin/bash

# 查看镜像的默认配置
docker inspect nginx:latest

实战练习

练习 1:Web 应用部署

bash
# 1. 运行 Nginx Web 服务器
docker run -d --name web-server -p 8080:80 nginx:latest

# 2. 创建自定义 HTML 内容
mkdir -p ~/web-content
echo "<h1>Hello Docker!</h1>" > ~/web-content/index.html

# 3. 重新运行并挂载自定义内容
docker stop web-server && docker rm web-server
docker run -d --name web-server -p 8080:80 \
  -v ~/web-content:/usr/share/nginx/html nginx:latest

# 4. 验证服务
curl http://localhost:8080

练习 2:数据库服务

bash
# 1. 运行 MySQL 数据库
docker run -d --name mysql-db \
  -e MYSQL_ROOT_PASSWORD=mypassword \
  -e MYSQL_DATABASE=testdb \
  -e MYSQL_USER=testuser \
  -e MYSQL_PASSWORD=testpass \
  -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# 2. 连接到数据库
docker exec -it mysql-db mysql -u root -p

# 3. 在 MySQL 中执行操作
# CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
# INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob');
# SELECT * FROM users;

# 4. 备份数据库
docker exec mysql-db mysqldump -u root -pmypassword testdb > backup.sql

练习 3:开发环境搭建

bash
# 1. 创建开发网络
docker network create dev-network

# 2. 运行 Redis 缓存
docker run -d --name redis-cache \
  --network dev-network \
  redis:latest

# 3. 运行 PostgreSQL 数据库
docker run -d --name postgres-db \
  --network dev-network \
  -e POSTGRES_PASSWORD=devpass \
  -e POSTGRES_DB=devdb \
  postgres:13

# 4. 运行 Node.js 开发环境
docker run -it --name dev-env \
  --network dev-network \
  -v $(pwd):/workspace \
  -w /workspace \
  -p 3000:3000 \
  node:16 /bin/bash

# 在容器内可以通过服务名访问其他服务
# Redis: redis-cache:6379
# PostgreSQL: postgres-db:5432

常见问题和解决方案

问题 1:容器无法启动

bash
# 检查容器日志
docker logs container_name

# 检查容器配置
docker inspect container_name

# 尝试交互式启动
docker run -it --entrypoint /bin/bash image_name

问题 2:端口冲突

bash
# 查看端口使用情况
netstat -tulpn | grep :8080
# 或
lsof -i :8080

# 使用不同端口
docker run -p 8081:80 nginx

问题 3:权限问题

bash
# 检查文件权限
ls -la /host/path

# 修改文件所有者
sudo chown -R 1000:1000 /host/path

# 以特定用户运行容器
docker run -u $(id -u):$(id -g) -v /host/path:/container/path nginx

问题 4:容器内存不足

bash
# 检查容器资源使用
docker stats container_name

# 增加内存限制
docker run -m 1g nginx

# 检查系统内存
free -h

本章小结

本章详细介绍了 Docker 容器的基础操作:

关键要点:

  • 生命周期管理:创建、启动、停止、删除容器
  • 运行模式:前台、后台、交互式、一次性运行
  • 配置选项:资源限制、网络配置、环境变量
  • 监控调试:日志查看、状态监控、问题排查
  • 文件操作:文件复制、目录挂载、数据持久化
  • 批量管理:批量操作和系统清理

最佳实践:

  • 使用有意义的容器名称
  • 合理设置资源限制
  • 及时清理不需要的容器
  • 使用数据卷持久化重要数据
  • 定期监控容器状态和资源使用

在下一章中,我们将学习 Docker 镜像的管理,包括镜像的拉取、构建、标记和分发。

延伸阅读

本站内容仅供学习和研究使用。