【Docker基础】Docker容器生命周期管理:从创建到删除的完整指南

目录

[1 容器生命周期概述](#1 容器生命周期概述)

[2 容器创建(docker create)](#2 容器创建(docker create))

[2.1 docker create命令详解](#2.1 docker create命令详解)

[2.2 创建流程解析](#2.2 创建流程解析)

[2.3 创建与运行的区别](#2.3 创建与运行的区别)

[3 容器启动(docker start)](#3 容器启动(docker start))

[3.1 docker start命令详解](#3.1 docker start命令详解)

[3.2 启动流程解析](#3.2 启动流程解析)

[3.3 启动与运行的区别](#3.3 启动与运行的区别)

[4 容器运行管理](#4 容器运行管理)

[4.1 查看运行状态](#4.1 查看运行状态)

[4.2 暂停与恢复(docker pause/unpause)](#4.2 暂停与恢复(docker pause/unpause))

[4.3 停止与重启(docker stop/restart)](#4.3 停止与重启(docker stop/restart))

[5 容器删除(docker rm)](#5 容器删除(docker rm))

[5.1 删除命令详解](#5.1 删除命令详解)

[5.2 删除流程解析](#5.2 删除流程解析)

[5.3 数据持久化策略](#5.3 数据持久化策略)

[6 容器生命周期实践示例](#6 容器生命周期实践示例)

[7 常见问题与解决方案](#7 常见问题与解决方案)

[7.1 容器启动后立即退出](#7.1 容器启动后立即退出)

[7.2 端口冲突](#7.2 端口冲突)

[7.3 容器无法删除](#7.3 容器无法删除)

[8 总结](#8 总结)


1 容器生命周期概述

Docker容器的生命周期包含多个关键状态和转换过程,理解这些状态及其转换对于有效管理容器至关重要,容器生命周期主要包括以下状态和操作:

2 容器创建(docker create)

2.1 docker create命令详解

  • docker create命令用于创建一个新的容器但不立即启动它:

    docker create [选项] 镜像 [命令] [参数...]

常用选项:

  • --name:为容器指定名称
  • -p/--publish:发布容器端口到主机
  • -v/--volume:挂载数据卷
  • -e/--env:设置环境变量
  • --restart:配置重启策略
  • -it:分配交互式终端

  • 示例:

    docker create --name myweb -p 8080:80 nginx:latest

2.2 创建流程解析

  • 用户执行docker create命令
  • Docker客户端将请求发送给Docker守护进程
  • 守护进程检查镜像是否存在(不存在则尝试拉取)
  • 创建容器文件系统(基于镜像层+可写层)
  • 应用所有配置选项(网络、卷、环境变量等)
  • 返回创建的容器ID
  • 客户端显示创建结果

2.3 创建与运行的区别

|------|---------------|------------|
| 特性 | docker create | docker run |
| 容器状态 | 仅创建,不启动 | 创建并立即启动 |
| 执行速度 | 较快 | 较慢(包含启动过程) |
| 使用场景 | 需要预先配置后启动 | 需要立即运行的容器 |
| 后续操作 | 需要手动start | 已自动启动 |
| 日志输出 | 无 | 立即开始产生日志 |

3 容器启动(docker start)

3.1 docker start命令详解

  • docker start命令用于启动一个或多个已停止的容器:

    docker start [选项] 容器 [容器...]

常用选项:

  • -a/--attach:附加STDOUT/STDERR并转发信号
  • -i/--interactive:附加容器的STDIN
  • --checkpoint:从检查点恢复

  • 示例:

    docker start -ai myweb

3.2 启动流程解析

  • 用户执行docker start命令
  • Docker客户端将请求发送给守护进程
  • 守护进程准备容器运行时环境
  • 初始化网络栈(如果未初始化)
  • 挂载所有配置的卷
  • 执行容器入口点命令
  • 返回启动结果给客户端

3.3 启动与运行的区别

  • docker run实际上是docker create和docker start的组合:

    以下两条命令效果相似

    docker run -d --name myweb nginx
    docker create --name myweb nginx && docker start myweb

关键区别:

  • docker run无法设置某些只能在create阶段设置的参数
  • docker create + start可以更精确控制创建和启动过程
  • docker run会自动附加终端(除非使用-d)

4 容器运行管理

4.1 查看运行状态

复制代码
# 查看容器列表
docker ps           # 仅运行中的容器
docker ps -a        # 所有容器(包括已停止的)

# 查看容器详情
docker inspect 容器

# 查看容器日志
docker logs 容器

# 查看容器资源使用
docker stats 容器

4.2 暂停与恢复(docker pause/unpause)

  • 暂停容器会冻结容器内的所有进程:

    暂停容器

    docker pause 容器

    恢复容器

    docker unpause 容器

使用场景:

  • 临时释放CPU资源
  • 调试容器状态
  • 保持容器状态的同时暂停服务
    注意事项:
  • 暂停的容器仍然占用内存
  • 网络连接会被保持但不会处理
  • 文件系统保持打开状态

4.3 停止与重启(docker stop/restart)

  • 优雅停止容器:

    停止容器(发送SIGTERM,然后SIGKILL)

    docker stop [-t 超时时间] 容器

    强制停止(立即发送SIGKILL)

    docker kill 容器

    重启容器

    docker restart 容器

停止流程:

  • 发送SIGTERM信号
  • 等待默认10秒(可通过-t调整)
  • 如果仍未停止,发送SIGKILL
  • 容器状态变为"Exited"

5 容器删除(docker rm)

5.1 删除命令详解

复制代码
# 删除已停止的容器
docker rm 容器

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

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

# 删除容器时同时删除关联的卷
docker rm -v 容器

5.2 删除流程解析

5.3 数据持久化策略

删除容器时,默认会丢失容器内的所有数据,要实现数据持久化:

  • 使用数据卷

    docker run -v /data/host:/data/container nginx

  • 使用命名卷

    docker volume create myvol docker run -v myvol:/data/container nginx

  • 绑定挂载主机目录

    docker run -v $(pwd):/app nginx

6 容器生命周期实践示例

  • 命名容器:总是使用--name指定有意义的名称

    docker run --name web-server nginx

  • 自动清理:运行一次性容器时使用--rm选项

    docker run --rm alpine echo "hello"

  • 重启策略:根据需求配置适当的重启策略

    docker run --restart unless-stopped redis

  • 资源限制:为容器设置适当的资源限制

    docker run -m 512m --cpus 1.5 nginx

  • 日志管理:配置适当的日志驱动和大小限制

    docker run --log-driver json-file --log-opt max-size=10m nginx

7 常见问题与解决方案

7.1 容器启动后立即退出

问题现象:容器状态显示"Exited (0)"
可能原因

  • 容器内主进程结束

  • 没有前台进程保持运行

  • 配置错误导致快速失败
    解决方案

  • 检查容器日志:

    docker logs 容器

  • 确保有前台进程运行

  • 使用交互模式调试:

    docker run -it --entrypoint sh 镜像

7.2 端口冲突

问题现象:Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
解决方案

  • 更改主机端口:

    docker run -p 8080:80 nginx

  • 停止占用端口的服务

  • 使用不同网络模式:

    docker run --network host nginx

7.3 容器无法删除

问题现象:Error response from daemon: You cannot remove a running container
解决方案

  • 先停止容器:

    docker stop 容器 && docker rm 容器

  • 强制删除:

    docker rm -f 容器

  • 删除所有停止的容器:

    docker container prune

8 总结

Docker容器的生命周期管理是容器化技术的核心技能,通过合理运用容器生命周期的各个阶段:创建、启动、运行、暂停、停止和删除等命令和技巧,可以高效地管理Docker容器,确保应用程序的稳定运行和资源的有效利用。记住,理解容器生命周期有助于调试问题、优化性能并构建可靠的容器化应用。

相关推荐
BUTCHER51 小时前
Docker镜像使用
java·docker·容器
小趴菜吖1 小时前
使用macvlan实现容器的跨主机通信
docker
一只 Lemon1 小时前
K8s存储系统(通俗易懂版)
云原生·容器·kubernetes
澜兮子1 小时前
k8s-高级调度(一)
云原生·容器·kubernetes
无敌糖果1 小时前
K8S的Helm包管理器
docker·容器·kubernetes·helm·helm安装包
不易思不逸1 小时前
Ubuntu20.04 RTX 4080 Nvidia驱动安装
运维·服务器
筱小虾米2 小时前
Docker配置国内镜像源
运维·docker·容器
爱吃芝麻汤圆2 小时前
k8s之Snapshots 详解
云原生·容器·kubernetes
L_autinue_Star3 小时前
从0到1实现Shell!Linux进程程序替换详解
linux·运维·服务器·c++·chrome
Ftrans3 小时前
【分享】文件摆渡系统适配医疗场景:安全与效率兼得
大数据·运维·安全