容器基础操作 #

创建容器 #

docker create #

创建容器但不启动。

bash
# 创建容器
docker create --name mycontainer nginx:latest

# 创建并配置容器
docker create \
  --name mycontainer \
  -p 8080:80 \
  -v /data:/app/data \
  -e MY_VAR=value \
  nginx:latest

docker run #

创建并启动容器。

bash
# 基本运行
docker run nginx

# 后台运行
docker run -d nginx

# 指定名称
docker run -d --name my-nginx nginx

# 交互式运行
docker run -it ubuntu bash

# 运行后自动删除
docker run --rm alpine echo "Hello"

启动容器 #

docker start #

启动已停止的容器。

bash
# 启动容器
docker start mycontainer

# 启动并附加
docker start -a mycontainer

# 启动多个容器
docker start container1 container2 container3

docker restart #

重启容器。

bash
# 重启容器
docker restart mycontainer

# 设置超时时间(秒)
docker restart -t 10 mycontainer

停止容器 #

docker stop #

优雅停止容器。

bash
# 停止容器
docker stop mycontainer

# 设置超时时间(秒)
docker stop -t 30 mycontainer

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

docker kill #

强制停止容器。

bash
# 强制停止
docker kill mycontainer

# 发送特定信号
docker kill -s SIGTERM mycontainer

docker pause/unpause #

暂停/恢复容器。

bash
# 暂停容器
docker pause mycontainer

# 恢复容器
docker unpause mycontainer

查看容器 #

docker ps #

列出容器。

bash
# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 只显示容器ID
docker ps -q

# 显示容器大小
docker ps -s

# 格式化输出
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

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

输出字段说明 #

text
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                NAMES
abc123def456   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp   my-nginx
字段 说明
CONTAINER ID 容器ID
IMAGE 使用的镜像
COMMAND 启动命令
CREATED 创建时间
STATUS 状态
PORTS 端口映射
NAMES 容器名称

docker inspect #

查看容器详细信息。

bash
# 查看完整信息
docker inspect mycontainer

# 查看特定信息
docker inspect --format '{{.State.Status}}' mycontainer
docker inspect --format '{{.NetworkSettings.IPAddress}}' mycontainer
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mycontainer
docker inspect --format '{{.Config.Env}}' mycontainer

docker stats #

查看容器资源使用情况。

bash
# 查看所有容器资源使用
docker stats

# 查看指定容器
docker stats mycontainer

# 不刷新显示
docker stats --no-stream

# 自定义格式
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

docker top #

查看容器内进程。

bash
# 查看容器进程
docker top mycontainer

# 使用ps参数
docker top mycontainer aux

进入容器 #

docker exec #

在运行中的容器中执行命令。

bash
# 执行单条命令
docker exec mycontainer ls /app

# 进入交互模式
docker exec -it mycontainer bash

# 指定用户
docker exec -u root mycontainer command

# 设置环境变量
docker exec -e MY_VAR=value mycontainer command

# 指定工作目录
docker exec -w /app mycontainer command

docker attach #

连接到容器的主进程。

bash
# 连接到容器
docker attach mycontainer

# 退出但不停止容器: Ctrl+P Ctrl+Q
# 退出并停止容器: Ctrl+C

exec vs attach #

text
┌─────────────────────────────────────────────────────┐
│               exec vs attach                         │
├─────────────────────────────────────────────────────┤
│                                                     │
│  docker exec:                                       │
│  - 在容器中启动新进程                                │
│  - 不影响主进程                                      │
│  - 退出不会停止容器                                  │
│  - 推荐用于日常操作                                  │
│                                                     │
│  docker attach:                                     │
│  - 连接到容器主进程                                  │
│  - 直接查看主进程输出                                │
│  - 退出可能停止容器                                  │
│  - 适合调试主进程                                    │
│                                                     │
└─────────────────────────────────────────────────────┘

删除容器 #

docker rm #

删除容器。

bash
# 删除已停止的容器
docker rm mycontainer

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

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

# 删除所有容器
docker rm -f $(docker ps -aq)

# 删除时删除关联的卷
docker rm -v mycontainer

容器日志 #

docker logs #

查看容器日志。

bash
# 查看日志
docker logs mycontainer

# 实时查看日志
docker logs -f mycontainer

# 查看最后100行
docker logs --tail 100 mycontainer

# 查看指定时间后的日志
docker logs --since 2024-01-01 mycontainer
docker logs --since 2h mycontainer

# 查看指定时间段的日志
docker logs --since 2024-01-01 --until 2024-01-02 mycontainer

# 添加时间戳
docker logs -t mycontainer

文件操作 #

docker cp #

在容器和宿主机之间复制文件。

bash
# 从宿主机复制到容器
docker cp ./file.txt mycontainer:/app/

# 从容器复制到宿主机
docker cp mycontainer:/app/file.txt ./

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

docker diff #

查看容器文件系统的变化。

bash
# 查看文件变化
docker diff mycontainer

# 输出说明:
# A - 添加
# C - 修改
# D - 删除

导出导入容器 #

docker export #

导出容器文件系统。

bash
# 导出容器
docker export mycontainer > container.tar

# 导出并压缩
docker export mycontainer | gzip > container.tar.gz

docker import #

从归档文件创建镜像。

bash
# 从文件导入
docker import container.tar myimage:v1.0

# 从URL导入
docker import http://example.com/container.tar myimage:v1.0

# 带提交信息
docker import -m "Import from container" container.tar myimage:v1.0

容器端口映射 #

端口映射方式 #

bash
# 映射指定端口
docker run -p 8080:80 nginx

# 映射多个端口
docker run -p 8080:80 -p 443:443 nginx

# 映射UDP端口
docker run -p 53:53/udp nginx

# 映射到指定IP
docker run -p 127.0.0.1:8080:80 nginx

# 随机端口映射
docker run -P nginx

# 查看映射端口
docker port mycontainer
docker port mycontainer 80

端口映射格式 #

text
-p [host_ip:]host_port:container_port[/protocol]

示例:
-p 8080:80          # 映射TCP 8080到容器80
-p 127.0.0.1:8080:80  # 只绑定本地回环地址
-p 8080:80/udp      # 映射UDP端口
-P                  # 随机映射所有EXPOSE端口

容器环境变量 #

设置环境变量 #

bash
# 使用-e参数
docker run -e MY_VAR=value nginx

# 设置多个环境变量
docker run -e VAR1=value1 -e VAR2=value2 nginx

# 从文件加载
docker run --env-file .env nginx

# 从多个文件加载
docker run --env-file .env --env-file .env.prod nginx

查看环境变量 #

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

# 使用inspect
docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' mycontainer

容器命名 #

命名规则 #

bash
# 容器名称规则
# - 只能包含小写字母、数字、下划线、点和连字符
# - 必须以字母或数字开头
# - 至少2个字符
# - 最多63个字符

# 有效名称
docker run --name my-nginx nginx
docker run --name my_nginx nginx
docker run --name nginx.prod nginx

# 无效名称
docker run --name 1nginx nginx      # 以数字开头
docker run --name MY-NGINX nginx    # 包含大写字母

重命名容器 #

bash
# 重命名容器
docker rename old_name new_name

容器状态管理 #

状态转换图 #

text
┌─────────────────────────────────────────────────────┐
│                   容器状态                           │
├─────────────────────────────────────────────────────┤
│                                                     │
│   Created ──start──→ Running ──pause──→ Paused     │
│      │                  │                   │       │
│      │              stop/kill               │       │
│      │                  │                   │       │
│      │                  ↓                   │       │
│      │              Stopped ←──unpause─────┘       │
│      │                  │                           │
│      └──────────────────┴──rm──→ Removed           │
│                                                     │
└─────────────────────────────────────────────────────┘

查看容器状态 #

bash
# 查看状态
docker ps --format "table {{.Names}}\t{{.Status}}"

# 过滤特定状态
docker ps --filter "status=running"
docker ps --filter "status=exited"
docker ps --filter "status=paused"

小结 #

本节学习了Docker容器的基本操作:

  • 创建、启动、停止、删除容器
  • 查看容器状态和信息
  • 进入容器执行命令
  • 日志查看和文件操作
  • 端口映射和环境变量

下一步 #

接下来,让我们学习 容器生命周期,深入了解容器的生命周期管理。