容器基础操作 #
创建容器 #
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容器的基本操作:
- 创建、启动、停止、删除容器
- 查看容器状态和信息
- 进入容器执行命令
- 日志查看和文件操作
- 端口映射和环境变量
下一步 #
接下来,让我们学习 容器生命周期,深入了解容器的生命周期管理。