桀骜倔犟的鸟 發表於 2025-12-11 12:12:01

Docker 容器全生命周期管理与运维命令实战演练

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">一、 容器创建与启动机制:docker create</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1.1 命令语法与关键参数解析</a></li><li><a href="#_lab2_1_1">1.2 实战演练:端口冲突与状态观察</a></li><li><a href="#_lab2_1_2">1.3 启动失败与端口修正</a></li></ul><li><a href="#_label2">二、 日志监控与排错:docker logs</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_3">2.1 命令语法与参数</a></li><li><a href="#_lab2_2_4">2.2 实战演练:实时日志追踪</a></li></ul><li><a href="#_label3">三、 容器连接机制:docker attach</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_5">3.1 风险与信号代理</a></li><li><a href="#_lab2_3_6">3.2 实战演练:信号代理控制</a></li></ul><li><a href="#_label4">四、 容器内命令执行:docker exec</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_7">4.1 关键参数</a></li><li><a href="#_lab2_4_8">4.2 实战演练:多维度的容器交互</a></li></ul><li><a href="#_label5">五、 容器状态控制:start / stop / restart / kill</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_9">5.1 启动与停止</a></li><li><a href="#_lab2_5_10">5.2 重启与强制终止</a></li></ul><li><a href="#_label6">六、 进程与资源监控:top / stats</a></li><ul class="second_class_ul"><li><a href="#_lab2_6_11">6.1 进程查看:docker top</a></li><li><a href="#_lab2_6_12">6.2 资源统计:docker stats</a></li></ul><li><a href="#_label7">七、 元数据查阅与端口检测:inspect / port</a></li><ul class="second_class_ul"><li><a href="#_lab2_7_13">7.1 深度信息查阅:docker inspect</a></li><li><a href="#_lab2_7_14">7.2 端口映射查询:docker port</a></li></ul><li><a href="#_label8">八、 文件系统操作:cp / diff</a></li><ul class="second_class_ul"><li><a href="#_lab2_8_15">8.1 文件拷贝:docker cp</a></li><li><a href="#_lab2_8_16">8.2 变更检查:docker diff</a></li></ul><li><a href="#_label9">九、 镜像构建与迁移:commit / export / import</a></li><ul class="second_class_ul"><li><a href="#_lab2_9_17">9.1 从容器构建镜像:docker commit</a></li><li><a href="#_lab2_9_18">9.2 导出与导入:export / import</a></li></ul><li><a href="#_label10">十、 暂停与恢复:pause / unpause</a></li><ul class="second_class_ul"></ul><li><a href="#_label11">十一、 其他管理命令</a></li><ul class="second_class_ul"><li><a href="#_lab2_11_19">11.1 删除容器:docker rm</a></li><li><a href="#_lab2_11_20">11.2 等待容器退出:docker wait</a></li><li><a href="#_lab2_11_21">11.3 重命名:docker rename</a></li><li><a href="#_lab2_11_22">11.4 清理停止的容器:docker container prune</a></li><li><a href="#_lab2_11_23">11.5 动态更新配置:docker update</a></li></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2>
<p>在容器化技术的实际应用中,对容器生命周期的精准控制、运行时状态的监控以及故障排查是运维与开发人员必须掌握的核心技能。本文将深入剖析 Docker 容器管理的二十余条核心命令,结合实际操作案例与执行结果,详细解读从容器创建、运行、调试到销毁的全过程。</p>
<p class="maodian"><a name="_label1"></a></p><h2>一、 容器创建与启动机制:docker create</h2>
<p><code>docker create</code> 命令用于创建一个新的容器,但并不会立即启动它。这一机制允许用户在容器运行前预先配置好网络、存储卷、环境变量及资源限制等参数,使容器处于 <code>Created</code> 状态,等待后续的启动指令。</p>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1.1 命令语法与关键参数解析</h3>
<p>基本语法如下:</p>
<div class="jb51code"><pre class="brush:bash;">docker create IMAGE </pre></div>
<p>该命令拥有丰富的参数选项,用于定义容器的运行时环境:</p>
<ul><li><strong>交互与终端控制</strong>:
<ul><li><code>-i</code> (interactive):保持标准输入(STDIN)打开,即使没有连接。通常用于需要交互的场景。</li><li><code>-t</code> (tty):分配一个伪终端(pseudo-TTY)。<code>-i</code> 与 <code>-t</code> 常组合使用,以便在容器启动后进行交互式操作。</li></ul></li><li><strong>网络与端口映射</strong>:<ul><li><code>-P</code> (Publish all):随机端口映射。Docker 会随机选择宿主机的一个高位端口映射到容器内部开放的所有端口。</li><li><code>-p</code> (publish):指定端口映射。格式为 <code>宿主机端口:容器端口</code>,实现了外部流量访问容器内部服务的通道。</li><li><code>--network</code>:指定容器的网络模式(如 bridge, host, none, overlay 等),默认为 bridge 模式。</li><li><code>--link</code>:用于链接到另一个容器,实现容器间的通信(在现代 Docker 版本中推荐使用自定义网络代替)。</li></ul></li><li><strong>标识与元数据</strong>:<ul><li><code>--name</code>:为容器指定一个易于识别的名称,替代自动生成的随机名称。</li><li><code>-h</code> (hostname):指定容器内部的主机名。</li></ul></li><li><strong>资源限制与环境配置</strong>:<ul><li><code>-e</code> (env):设置环境变量,用于向容器内传递配置信息。</li><li><code>--cpuset-cpus</code>:绑定容器到指定的 CPU 核心运行(如 &ldquo;0-2&rdquo; 或 &ldquo;0,1,2&rdquo;),用于高性能计算场景的资源隔离。</li><li><code>-m</code> (memory):设置容器可使用的最大内存限额,防止单个容器耗尽宿主机资源。</li></ul></li><li><strong>存储与生命周期</strong>:<ul><li><code>-v</code> (volume):绑定挂载卷,实现数据的持久化或宿主机文件共享。</li><li><code>--rm</code>:容器退出时自动清理容器文件系统,适用于临时任务。</li><li><code>--restart</code>:定义容器的重启策略(如 <code>always</code>, <code>on-failure</code>),确保服务的高可用性。</li></ul></li></ul>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>1.2 实战演练:端口冲突与状态观察</h3>
<p>在实际操作中,尝试创建一个名为 <code>myweb</code> 的容器,并将宿主机的 80 端口映射到容器的 80 端口:</p>
<div class="jb51code"><pre class="brush:bash;">docker create --name myweb -p 80:80 nginx:1.23.3</pre></div>
<p>执行上述命令后,Docker 返回了一个长字符串(容器 ID),表明容器对象已成功创建。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483048.png" /></p>
<p>然而,在执行创建命令之前,宿主机的 80 端口实际上已经被其他进程占用。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483136.png" /></p>
<p>这里揭示了一个重要机制:<code>docker create</code> 阶段仅进行容器配置的初始化和元数据的写入,<strong>并不会实际占用宿主机的端口资源</strong>。因此,即使端口冲突,创建操作依然可以成功。</p>
<p>此时使用 <code>docker ps</code> 命令无法查看到该容器,因为默认情况下该命令仅显示正在运行(Up)的容器。需要添加 <code>-a</code> 参数查看所有状态的容器:</p>
<div class="jb51code"><pre class="brush:bash;">docker ps -a</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483114.png" /></p>
<p>从输出结果可以看到,<code>myweb</code> 容器的 Status 为 <code>Created</code>,表明其已就绪但未运行。</p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1.3 启动失败与端口修正</h3>
<p>尝试启动处于 <code>Created</code> 状态的容器:</p>
<div class="jb51code"><pre class="brush:bash;">docker start myweb</pre></div>
<p>此时系统抛出报错信息,提示端口绑定失败,因为 80 端口已被占用。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483194.png" /></p>
<p>验证宿主机 80 端口的占用情况,发现确实存在正在运行的 Nginx 服务。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483190.png" /></p>
<p>为了解决此问题,需要重新创建一个使用不同宿主机端口的容器。例如,将宿主机的 8050 端口映射到容器的 80 端口:</p>
<div class="jb51code"><pre class="brush:bash;">docker create --name myweb2 -p 8050:80 nginx:1.23.3</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483036.png" /></p>
<p>随后启动该容器,操作顺利完成。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483014.png" /></p>
<p>此时,宿主机的 8050 端口已成功转发流量至容器内部,实现了服务的对外发布。</p>
<p class="maodian"><a name="_label2"></a></p><h2>二、 日志监控与排错:docker logs</h2>
<p>容器遵循&ldquo;一个容器一个进程&rdquo;的原则,其应用日志通常直接输出到标准输出(STDOUT)和标准错误(STDERR)。<code>docker logs</code> 命令用于获取这些输出流,是排查容器故障的第一手资料。</p>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>2.1 命令语法与参数</h3>
<div class="jb51code"><pre class="brush:bash;">docker logs CONTAINER</pre></div>
<ul><li><code>-f</code> (&ndash;follow):实时跟踪日志输出,类似于 Linux 的 <code>tail -f</code> 命令。</li><li><code>--since</code>:仅显示指定时间之后的日志,便于缩小排查范围。</li><li><code>-t</code> (&ndash;timestamps):在每行日志前显示精确的时间戳。</li><li><code>-n</code> (&ndash;tail):仅列出最新的 N 条日志,避免大量历史日志刷屏。</li></ul>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>2.2 实战演练:实时日志追踪</h3>
<p>以前文创建的 <code>myweb2</code> 容器为例,首先确认容器已启动。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483188.png" /></p>
<p>访问映射的端口,验证 Nginx 服务运行正常。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483126.png" /></p>
<p>直接执行 <code>docker logs myweb2</code> 会一次性输出当前所有的日志内容并退出。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/20251211120617704.png" /></p>
<p>若需持续监控服务请求,应配合 <code>-f</code> 参数:</p>
<div class="jb51code"><pre class="brush:bash;">docker logs -f myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/20251211120742159.png" /></p>
<p>此时,每当有新的 HTTP 请求到达 Nginx,控制台将实时刷新日志条目。</p>
<p>如果只关注最近发生的事件,可以使用 <code>-n</code> 参数限制行数:</p>
<div class="jb51code"><pre class="brush:bash;">docker logs -f -n 5 myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483238.png" /></p>
<p>这精确展示了最后 5 条日志记录,极大提高了运维效率。</p>
<p class="maodian"><a name="_label3"></a></p><h2>三、 容器连接机制:docker attach</h2>
<p><code>docker attach</code> 命令用于将当前终端的标准输入、输出和错误流连接到正在运行的容器的主进程上。</p>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>3.1 风险与信号代理</h3>
<p>该命令的一个显著特性是默认将本地终端的信号转发给容器。如果在 attach 模式下按下 <code>Ctrl+C</code>,发送的 SIGINT 信号会被容器内的主进程(PID 1)接收,导致容器停止运行。</p>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>3.2 实战演练:信号代理控制</h3>
<p>直接连接容器:</p>
<div class="jb51code"><pre class="brush:bash;">docker attach myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/20251211120918742.jpg" /></p>
<p>在此状态下,若执行中止操作,Nginx 进程会随之关闭。</p>
<p>为了避免这种情况,可以使用 <code>--sig-proxy=false</code> 参数。该参数设置是否进行信号代理,默认为 true。设置为 false 后,退出 attach 模式(例如使用 Ctrl+C)不会影响容器的运行状态。</p>
<div class="jb51code"><pre class="brush:bash;">docker attach --sig-proxy=false myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483574.jpg" /></p>
<p>此时即使强制退出连接,容器依然在后台稳健运行。</p>
<p class="maodian"><a name="_label4"></a></p><h2>四、 容器内命令执行:docker exec</h2>
<p>与 <code>attach</code> 不同,<code>docker exec</code> 允许在正在运行的容器中启动一个新的进程(如 <code>/bin/bash</code>),这是调试和管理容器最常用的方式。</p>
<p class="maodian"><a name="_lab2_4_7"></a></p><h3>4.1 关键参数</h3>
<ul><li><code>-d</code>:分离模式,在后台执行命令。</li><li><code>-i</code>:保持 STDIN 打开。</li><li><code>-t</code>:分配伪终端。</li><li><code>-e</code>:设置该次执行的环境变量。</li><li><code>-u</code>:指定执行命令的用户(Name 或 UID)。</li><li><code>-w</code>:指定命令执行的工作目录。</li></ul>
<p class="maodian"><a name="_lab2_4_8"></a></p><h3>4.2 实战演练:多维度的容器交互</h3>
<p>启动 <code>myweb2</code> 后,通过以下命令进入容器的交互式 Shell:</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it myweb2 bash
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483280.png" /></p>
<p>在容器内部,可以执行如 <code>nginx -v</code> 等命令查看应用详情。</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it myweb2 nginx -v
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483385.png" /></p>
<p><strong>临时环境变量设置</strong>:<br />通过 <code>-e</code> 参数,可以在执行命令时注入特定的环境变量,这在测试配置或脚本时非常有用。</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it -e mynginx=kk myweb2 bash
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483390.png" /></p>
<p><strong>指定用户身份</strong>:<br />默认情况下,<code>exec</code> 使用 root 用户。通过查看 <code>/etc/passwd</code> 可知容器内存在 <code>nginx</code> 用户。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483497.jpg" /></p>
<p>使用 <code>-u</code> 参数切换身份执行命令,模拟权限受限场景:</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it -u nginx myweb2 nginx -v
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483359.png" /></p>
<p><strong>指定工作目录</strong>:<br />使用 <code>-w</code> 参数可以直接在特定目录下启动进程,省去了 <code>cd</code> 的步骤。</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it -w /etc myweb2 bash
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483364.png" /></p>
<p>如图所示,进入容器后的默认路径即为 <code>/etc</code>。</p>
<p class="maodian"><a name="_label5"></a></p><h2>五、 容器状态控制:start / stop / restart / kill</h2>
<p>这组命令构成了容器运行状态的基础控制流。</p>
<p class="maodian"><a name="_lab2_5_9"></a></p><h3>5.1 启动与停止</h3>
<p><code>docker start</code>:启动一个或多个已经被停止的容器。</p>
<div class="jb51code"><pre class="brush:bash;">docker start mynginx
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483391.png" /></p>
<p>执行后,容器状态由 Exited 变为 Up。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483466.png" /></p>
<p><code>docker stop</code>:停止正在运行的容器。该命令会向容器主进程发送 <code>SIGTERM</code> 信号,给予进程处理未完成请求和清理资源的时间(默认 10 秒)。如果超时未停止,则强制发送 <code>SIGKILL</code>。</p>
<div class="jb51code"><pre class="brush:bash;">docker stop myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483433.png" /></p>
<p>停止后,通过 <code>docker ps -a</code> 确认状态已变更。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483482.png" /></p>
<p class="maodian"><a name="_lab2_5_10"></a></p><h3>5.2 重启与强制终止</h3>
<p><code>docker restart</code>:相当于连续执行 stop 和 start。</p>
<p>配合日志观察重启过程:<br />在终端 A 监控日志:<code>docker logs -f myweb2</code><br />在终端 B 执行重启:<code>docker restart myweb2</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483423.png" /></p>
<p>日志流中会显示服务停止和重新启动的记录。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/20251211121045067.png" /></p>
<p><code>docker kill</code>:直接发送 <code>SIGKILL</code> 信号,立即终止容器进程,不给予清理资源的机会。</p>
<div class="jb51code"><pre class="brush:bash;">docker kill myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483564.png" /></p>
<p class="maodian"><a name="_label6"></a></p><h2>六、 进程与资源监控:top / stats</h2>
<p class="maodian"><a name="_lab2_6_11"></a></p><h3>6.1 进程查看:docker top</h3>
<p><code>docker top</code> 允许用户查看容器内部正在运行的进程列表,无需进入容器内部。这对于精简版镜像(如 Alpine 或 Distroless)尤为重要,因为这些镜像可能不包含 <code>ps</code> 或 <code>top</code> 命令。</p>
<p>启动容器后,获取其 ID 或名称:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483536.png" /></p>
<p>查看进程详情:</p>
<div class="jb51code"><pre class="brush:bash;">docker top 74a1273c093d
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483577.png" /></p>
<p>输出展示了 UID、PID(宿主机上的进程 ID)以及 PPID 等信息。</p>
<p class="maodian"><a name="_lab2_6_12"></a></p><h3>6.2 资源统计:docker stats</h3>
<p><code>docker stats</code> 提供实时的容器资源使用情况监控,包括 CPU、内存、网络 I/O 和块设备 I/O。</p>
<p><strong>默认模式</strong>:实时刷新显示所有运行中容器的统计信息。</p>
<div class="jb51code"><pre class="brush:bash;">docker stats
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483573.png" /></p>
<p><strong>查看所有容器</strong>:使用 <code>-a</code> 参数包括未运行的容器(虽然未运行容器资源占用通常为 0)。</p>
<div class="jb51code"><pre class="brush:bash;">docker stats -a
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483659.png" /></p>
<p><strong>格式化输出</strong>:使用 <code>--format</code> 参数输出 JSON 格式,便于脚本解析和监控系统集成。</p>
<div class="jb51code"><pre class="brush:bash;">docker stats --format json
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483629.png" /></p>
<p><strong>快照模式</strong>:使用 <code>--no-stream</code> 参数,仅输出当前瞬间的状态并退出,不持续刷新。</p>
<div class="jb51code"><pre class="brush:bash;">docker stats --no-stream
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483618.png" /></p>
<p><strong>完整信息</strong>:<code>--no-trunc</code> 参数显示完整的容器 ID,不进行截断。</p>
<div class="jb51code"><pre class="brush:bash;">docker stats --no-trunc
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483619.png" /></p>
<p class="maodian"><a name="_label7"></a></p><h2>七、 元数据查阅与端口检测:inspect / port</h2>
<p class="maodian"><a name="_lab2_7_13"></a></p><h3>7.1 深度信息查阅:docker inspect</h3>
<p><code>docker inspect</code> 是获取容器或镜像最详细元数据的命令。它返回一个庞大的 JSON 数组,包含配置信息、网络设置、挂载卷详情等。</p>
<div class="jb51code"><pre class="brush:bash;">docker container inspect myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483993.png" /></p>
<p>通过 <code>-f</code> 参数可以利用 Go 模板语法提取特定字段,或直接输出为紧凑的 JSON。</p>
<div class="jb51code"><pre class="brush:bash;">docker container inspect -f json myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/20251211121158486.jpg" /></p>
<p class="maodian"><a name="_lab2_7_14"></a></p><h3>7.2 端口映射查询:docker port</h3>
<p>当容器配置了复杂的端口映射规则(如随机端口 <code>-P</code>)时,<code>docker port</code> 能快速定位宿主机端口与容器端口的对应关系。</p>
<div class="jb51code"><pre class="brush:bash;">docker port myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483749.png" /></p>
<p class="maodian"><a name="_label8"></a></p><h2>八、 文件系统操作:cp / diff</h2>
<p class="maodian"><a name="_lab2_8_15"></a></p><h3>8.1 文件拷贝:docker cp</h3>
<p>该命令用于在容器与宿主机之间双向拷贝文件,类似于 Linux 的 <code>cp</code> 命令,但跨越了容器隔离边界。</p>
<p><strong>场景一:从容器复制到宿主机</strong><br />首先进入容器确认文件路径:</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it myweb2 bash
cd /usr/share/nginx/html/
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483730.png" /></p>
<p>确认 <code>index.html</code> 存在。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483741.png" /></p>
<p>退出容器后执行拷贝:</p>
<div class="jb51code"><pre class="brush:bash;">docker cp myweb2:/usr/share/nginx/html/index.html .
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483723.png" /></p>
<p><strong>场景二:修改后覆盖回容器</strong><br />在宿主机修改 <code>index.html</code> 内容。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483882.jpg" /></p>
<p>将修改后的文件拷回容器:</p>
<div class="jb51code"><pre class="brush:bash;">docker cp ./index.html myweb2:/usr/share/nginx/html/
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483891.png" /></p>
<p>进入容器验证,内容已更新。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483813.jpg" /></p>
<p class="maodian"><a name="_lab2_8_16"></a></p><h3>8.2 变更检查:docker diff</h3>
<p><code>docker diff</code> 用于列出容器文件系统中自镜像启动以来发生变化的文件和目录。状态标记说明:</p>
<ul><li><strong>A (Add)</strong>:新增的文件或目录。</li><li><strong>C (Change)</strong>:修改的文件。</li><li><strong>D (Delete)</strong>:删除的文件。</li></ul>
<p>查看 <code>myweb2</code> 的变动:</p>
<div class="jb51code"><pre class="brush:bash;">docker diff myweb2
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483935.png" /></p>
<p>如果在容器内手动创建一个新文件,再次查看 diff,会明确显示该文件状态为 <code>A</code>。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483988.png" /></p>
<p class="maodian"><a name="_label9"></a></p><h2>九、 镜像构建与迁移:commit / export / import</h2>
<p class="maodian"><a name="_lab2_9_17"></a></p><h3>9.1 从容器构建镜像:docker commit</h3>
<p>当对容器进行了修改(如安装软件、修改配置),可以使用 <code>commit</code> 将当前容器状态保存为一个新的镜像。</p>
<p>首先启动一个基础容器:</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d --name myweb4forcommit nginx:1.23.3
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483928.png" /></p>
<p>确认运行状态:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483985.png" /></p>
<p>执行提交操作:</p>
<div class="jb51code"><pre class="brush:bash;">docker commit myweb4forcommit myweb4:v1.0
</pre></div>
<p>查看镜像列表,新镜像已生成。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111483976.png" /></p>
<p><strong>高级参数</strong>:</p>
<ul><li><code>-a</code>:指定作者。</li><li><code>-m</code>:提交说明。</li><li><code>-p</code>:提交时暂停容器(默认开启),防止数据不一致。</li><li><code>-c</code>:修改 Dockerfile 指令(如 CMD)。</li></ul>
<div class="jb51code"><pre class="brush:bash;">docker commit -a 'bit' -m 'create' -p myweb4forcommit myweb4:v2.0
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484075.png" /></p>
<p>查看新镜像详情,作者信息已被记录。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484045.png" /></p>
<p>通过 <code>-c</code> 修改启动命令:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484193.png" /></p>
<p>检查镜像信息确认 CMD 已变更。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484067.png" /></p>
<p class="maodian"><a name="_lab2_9_18"></a></p><h3>9.2 导出与导入:export / import</h3>
<p><code>export</code> 将容器的文件系统导出为 tar 归档文件,丢弃历史层级信息,仅保留当前快照。</p>
<p><strong>导出(Export)</strong>:<br />启动容器 <code>myweb</code>:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484123.png" /></p>
<p>导出为 <code>mweb.tar</code>:</p>
<div class="jb51code"><pre class="brush:bash;">docker export -o mweb.tar myweb
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484088.png" /></p>
<p><strong>导入(Import)</strong>:<br />将 tar 包导入为新镜像:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484165.png" /></p>
<div class="jb51code"><pre class="brush:bash;">docker import mweb.tar myweb1:v1.0
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484117.png" /></p>
<p>需要注意,<code>import</code> 导入的镜像会丢失原始镜像的元数据(如 CMD、ENTRYPOINT)。查看新镜像详情可证实这一点:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484269.jpg" /></p>
<p>因此,在导入时通常需要使用 <code>-c</code> 参数重设启动命令:</p>
<div class="jb51code"><pre class="brush:bash;">docker import -c 'CMD ["nginx","-g","daemon off;"]' -m "creat by bit" mweb.tar myweb7:v1.0
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484128.png" /></p>
<p>验证新镜像的 CMD 配置:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484268.jpg" /></p>
<p class="maodian"><a name="_label10"></a></p><h2>十、 暂停与恢复:pause / unpause</h2>
<p><code>docker pause</code> 利用 cgroups 的特性,冻结容器内所有进程的执行。这与停止容器不同,进程并未退出,只是不再获得 CPU 时间片。</p>
<p>启动容器并确认状态:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484183.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484284.png" /></p>
<p>执行暂停:</p>
<div class="jb51code"><pre class="brush:bash;">docker pause myweb5
</pre></div>
<p>查看状态,显示为 <code>Paused</code>。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484260.png" /></p>
<p>执行恢复:</p>
<div class="jb51code"><pre class="brush:bash;">docker unpause myweb5
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484278.png" /></p>
<p class="maodian"><a name="_label11"></a></p><h2>十一、 其他管理命令</h2>
<p class="maodian"><a name="_lab2_11_19"></a></p><h3>11.1 删除容器:docker rm</h3>
<p>用于删除已停止的容器。若要删除运行中的容器,需使用 <code>-f</code> (force) 参数,这会发送 SIGKILL 信号。</p>
<div class="jb51code"><pre class="brush:bash;">docker rm -f myweb
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484394.png" /></p>
<p class="maodian"><a name="_lab2_11_20"></a></p><h3>11.2 等待容器退出:docker wait</h3>
<p><code>docker wait</code> 会阻塞当前终端,直到指定容器停止运行,然后打印出该容器的退出状态码。</p>
<p>在终端 A 执行等待:</p>
<div class="jb51code"><pre class="brush:bash;">docker wait myweb
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484314.png" /></p>
<p>在终端 B 强制杀死容器:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484339.png" /></p>
<p>终端 A 立即解除阻塞并输出退出码(如 137,表示被 SIGKILL 终止)。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484366.png" /></p>
<p class="maodian"><a name="_lab2_11_21"></a></p><h3>11.3 重命名:docker rename</h3>
<p>更改容器名称。</p>
<div class="jb51code"><pre class="brush:bash;">docker rename myweb9 myweb8
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484312.jpg" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484336.png" /></p>
<p class="maodian"><a name="_lab2_11_22"></a></p><h3>11.4 清理停止的容器:docker container prune</h3>
<p>一键删除系统中所有处于停止状态的容器,释放磁盘空间。使用 <code>-f</code> 参数可跳过确认提示。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484358.png" /></p>
<p>执行清理:</p>
<div class="jb51code"><pre class="brush:bash;">docker container prune
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484371.png" /></p>
<p>清理后再次查看,已无残留容器。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484366.png" /></p>
<p class="maodian"><a name="_lab2_11_23"></a></p><h3>11.5 动态更新配置:docker update</h3>
<p><code>docker update</code> 允许在容器运行时动态调整其资源限制(如 CPU 和内存),无需重启容器。</p>
<p>启动一个标准容器:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484399.png" /></p>
<p>将其内存限制更新为 500MB:</p>
<div class="jb51code"><pre class="brush:bash;">docker update -m 500m myweb
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484389.png" /></p>
<p>系统返回容器名称表示更新成功,容器即刻在新的资源约束下运行。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121111484397.png" /></p>
<p>通过对上述二十余条命令的深入剖析与实战演练,我们可以看到 Docker 提供了一套逻辑严密、功能强大的工具集,涵盖了从容器创建、运行监控到资源调整的全过程。熟练掌握这些命令,是构建稳定、高效容器化基础设施的基石。</p>
<p>到此这篇关于Docker 容器全生命周期管理与运维命令深度解析的文章就介绍到这了,更多相关docker生命周期管理与运维命令内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁: [1]
查看完整版本: Docker 容器全生命周期管理与运维命令实战演练