Skip to content

容器生命周期

生命周期全景

镜像 --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
--cpusCPU 限制--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 \    # 进程数上限
  nginx
bash
# 动态更新运行中容器的资源限制
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 生成的是“黑盒”镜像,难以复现与审计。

常见场景速查

需求命令
后台跑 nginxdocker 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 "..."