容器生命周期
生命周期全景
镜像 --run--> [已创建 Created] --start--> [运行中 Running]
│ │
│ stop/pause
▼ ▼
[已退出 Exited] ◀── kill [已暂停 Paused]
│
start(可再次启动)
│
rm(删除)
▼
[已删除]运行容器 docker run
bash
docker run [选项] 镜像[:tag] [命令] [参数...]常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-d | 后台运行(detached) | docker run -d nginx |
--name | 命名容器 | --name web |
-p | 端口映射 宿主机:容器 | -p 8080:80 |
-e | 环境变量 | -e MYSQL_ROOT_PASSWORD=pass |
-v | 挂载卷 | -v data:/var/lib/mysql |
--rm | 退出后自动删除 | --rm |
-it | 交互式终端 | -it ubuntu bash |
--network | 指定网络 | --network mynet |
--restart | 重启策略 | --restart unless-stopped |
-m / --memory | 内存限制 | -m 512m |
--cpus | CPU 限制 | --cpus 1.5 |
--user | 运行用户 | --user 1000:1000 |
--env-file | 从文件读环境变量 | --env-file .env |
典型示例
bash
# 后台运行并命名、映射端口
docker run -d --name web -p 8080:80 nginx:alpine
# 交互式进入 ubuntu
docker run -it --rm ubuntu:22.04 bash
# 一次性任务(跑完即删)
docker run --rm alpine echo "hello"
# 带环境变量与卷的数据库
docker run -d --name db \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=app \
-v dbdata:/var/lib/mysql \
-p 3306:3306 \
mysql:8前台运行加
-d前,先用docker run --rm验证一遍命令能正常启动。
生命周期管理命令
bash
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(含已停止)
docker ps -q # 只显示容器 ID
docker start <容器> # 启动已停止的容器
docker stop <容器> # 优雅停止(发 SIGTERM,超时后 SIGKILL)
docker restart <容器> # 重启
docker pause <容器> # 暂停进程(不释放内存)
docker unpause <容器> # 恢复
docker kill <容器> # 强制停止(SIGKILL)
docker rm <容器> # 删除已停止容器
docker rm -f <容器> # 强制删除(运行中也删)批量操作:
bash
# 删除所有已停止容器
docker container prune
# 或
docker rm $(docker ps -aq)进入与查看容器
bash
# 在运行中的容器里执行命令
docker exec <容器> <命令>
docker exec -it web bash # 交互式进入(若容器无 bash 用 sh)
# 查看日志
docker logs <容器>
docker logs -f <容器> # 持续跟踪(tail -f)
docker logs --tail 50 <容器> # 最近 50 行
docker logs --since 10m <容器> # 最近 10 分钟
docker logs -t <容器> # 带时间戳
# 查看容器详情(完整 JSON)
docker inspect <容器>
docker inspect -f '{{.State.Status}} {{.NetworkSettings.IPAddress}}' <容器>
# 查看容器内进程
docker top <容器>
# 查看资源占用
docker stats
docker stats <容器>区分
exec(进入运行中容器)与run(从镜像新建容器)。
容器与宿主机互传文件
bash
# 宿主机 → 容器
docker cp ./file.txt web:/app/file.txt
# 容器 → 宿主机
docker cp web:/app/log.txt ./log.txt资源限制
bash
docker run -d \
--cpus 1.5 \ # 最多 1.5 个 CPU 核
--memory 512m \ # 内存上限 512MB
--memory-swap 1g \ # 内存+swap 上限
--pids-limit 100 \ # 进程数上限
nginxbash
# 动态更新运行中容器的资源限制
docker update --memory 1g --cpus 2 web重启策略 --restart
| 值 | 行为 |
|---|---|
no | 不自动重启(默认) |
on-failure[:n] | 退出码非 0 时重启,最多 n 次 |
always | 总是重启(含守护进程重启后) |
unless-stopped | 总是重启,除非手动停止 |
bash
docker run -d --restart unless-stopped nginx生产服务常用
unless-stopped:手动 stop 后不自动拉起,但机器/守护进程重启后会拉起。
把容器提交为新镜像 commit
(不推荐作为正规流程,多用于调试快照)
bash
docker commit <容器> myapp:debug正规做法是用 Dockerfile 构建;
commit生成的是“黑盒”镜像,难以复现与审计。
常见场景速查
| 需求 | 命令 |
|---|---|
| 后台跑 nginx | docker run -d -p 80:80 nginx |
| 进容器排查 | docker exec -it <c> sh |
| 看实时日志 | docker logs -f <c> |
| 复制文件出来 | docker cp <c>:/path ./ |
| 停止并删除 | docker stop <c> && docker rm <c> |
| 一次性跑脚本 | docker run --rm alpine sh -c "..." |
