Java 项目部署之 Docker工具快速入门: 容器命令总览与状态流转

发布时间:2026/10/12 3:54:59

Java 项目部署之 Docker工具快速入门: 容器命令总览与状态流转 概述镜像拉下来只是拿到了一个只读的模板真正跑起来的才是容器。这篇把容器相关命令按状态流转这条线索串一遍重点讲清run、start、exec这几个长得很像、语义完全不同的命令以及-p、-d、--name这些参数写错之后会发生什么。纲要容器的三种状态运行、暂停、停止以及它们背后操作系统做了什么生命周期命令地图run/pause/unpause/stop/start/rm各自触发的状态转换docker run参数全解-d、--name、-p、-v、-e、-it逐条拆解并配实例三个易混命令的对照run创建 启动、start启动已存在、exec在运行中的容器里执行命令查看容器docker ps与docker ps -a的差别、docker logs -f --tail、docker inspect完整案例创建一个 nginx 容器并进容器改文件实战踩坑前台运行被 CtrlC 干掉、端口顺序写反、忘了--name、exec进不去已停止的容器容器有几种状态把容器当成一个被隔离起来的进程就好理解了。它有且只有三种状态状态进程情况内存CPU文件系统运行running进程正常执行占用正常调度保留暂停paused进程被挂起保留不释放不再执行保留停止stopped进程已终止回收回收仅保留静态文件系统暂停和停止的差别全在操作系统怎么处理这个进程暂停是SIGSTOP语义把进程挂起、内存原封不动留在那儿恢复的时候内存空间回来程序从断点接着跑。停止是把进程直接杀掉内存回收剩下的只有容器的文件系统那些静态的东西。所以暂停能原地复活停止不能——进程都没了恢复无从谈起。想让一个停止的容器重新跑起来做法是docker start它相当于重新拉起一个新进程而不是让原来那个进程继续。这一点在排查为什么容器里的状态丢了时非常关键停了再起进程内的内存数据本来就该没。容器命令全景图下面这张状态图把命令和状态转换对应起来了照着箭头走基本不会写错命令docker createdocker run创建并启动docker startdocker pausedocker unpausedocker stop或容器内主进程退出docker stopdocker start拉起新进程docker rmdocker rm -f强制删除createdrunningpausedstoppedremoved进程运行中docker exec 只能作用于这个状态只能保存文件系统docker start 会拉起新进程需要记的两条硬规则docker exec只能作用于running状态暂停或停止的容器进不去。docker rm只删停止的容器运行中的必须加-f强制删否则会报You cannot remove a running container。docker run 参数全解docker run是唯一一条创建 启动二合一命令它背后实际等价于docker create再docker start。参数多但其实常用的就下面几个参数全称 / 含义作用-ddetach让容器在后台运行命令行立刻返回--name容器名给容器起名字不写则由 Docker 随机生成-ppublish端口映射格式宿主机端口:容器端口-vvolume挂载数据卷或宿主机目录到容器-eenv向容器内注入环境变量-itinteractive tty分配交互式终端用于进容器敲命令逐个看实例。后台启动一个 nginx把宿主机的 80 映射到容器 80dockerrun--namemn-p80:80-dnginx--name mn起了名字后面docker exec、docker logs就能直接叫mn而不用贴那一长串容器 ID。不写--name的话只能靠docker ps里查出来的 ID 操作麻烦且容易贴错。-d是后台运行。不加-d会怎样容器会在当前终端前台跑日志直接刷屏而且你按CtrlC的瞬间容器就被干掉了——这不是退出查看是真的把容器停了。所以只要不是临时调试-d基本是必带。端口映射的顺序是-p 宿主机端口:容器端口左边宿主机、右边容器别写反# 访问宿主机 8080 → 转发到容器 80dockerrun--namemn2-p8080:80-dnginx容器是隔离环境默认情况下访问宿主机的 80 端口根本摸不到容器里的 nginx。-p做的就是建立这条转发链路。冒号左边是想对外暴露的宿主机端口右边是容器内应用真正监听的端口。写反了最常见的结果是端口冲突或者访问报错。挂载数据卷和注入环境变量dockerrun--namemysql8\-p3306:3306\-eMYSQL_ROOT_PASSWORD123456\-vmysql-data:/var/lib/mysql\-dmysql:8.0-e把启动参数传进容器MySQL 官方镜像就是靠MYSQL_ROOT_PASSWORD这类环境变量完成初始化的。-v mysql-data:/var/lib/mysql把命名数据卷挂到容器的数据目录容器删了数据还在数据卷的细节在数据卷那篇展开。-it一般不用在run上长期跑服务它的典型场景是临时开一个容器进去操作dockerrun-it--nametmp ubuntubash这条命令创建容器后直接丢一个 bash 终端给你退出 bash 容器也就结束了。run / start / exec 三个命令的差别这三个命令最容易被混着用但其实它们作用的对象和时机完全不同命令作用对象前置条件做什么典型场景docker run镜像镜像存在用镜像创建一个新容器并启动第一次把服务跑起来docker start容器容器已存在停止态让已有容器重新运行服务停过之后重启docker exec容器容器正在运行在容器内执行一条命令进容器查看/改文件、连数据库几个判断要点run每次执行都会产生一个新容器。同一句docker run --name mn ...跑第二遍会报名字冲突因为mn已经存在了。start只是把已有容器重新启动不会创建新的所以没有--name、-p这些参数——那些东西在run的时候就已经定死在容器上了。exec是在一个已经在跑的容器里执行命令它自己不改容器状态。docker exec -it mn bash就是进去开一个交互终端。一个很常见的误用容器改了配置想重启直接再敲一遍docker run想覆盖。正确做法是docker stop mn docker start mn或者干脆docker restart mn。生命周期切换命令docker pause 容器名运行 → 暂停进程挂起、内存保留。docker unpause 容器名暂停 → 运行恢复挂起前的现场。docker stop 容器名运行/暂停 → 停止进程被杀、内存回收。docker start 容器名停止 → 运行拉起一个全新进程。docker rm 容器名停止 → 删除文件系统也一并清掉。docker rm -f 容器名运行中直接强杀并删除。这里有个命名上的不一致值得记一下暂停用pause/unpause但停止用的是stop/start而不是unstop。原因就是上面说的语义差异——暂停是挂起后原地恢复所以用un-表示取反停止是进程已经死了只能重新开一个所以用start而不是unstop。docker rm和镜像命令docker rmi别搞混rmi里的i是 images删的是镜像rm删的是容器。删容器是把这个容器从进程、内存、到硬盘上的文件系统全部清干净。看容器ps、logs、inspectdocker ps只列正在运行的容器dockerps想连停止的一起看加-adockerps-a这是排查我的容器跑哪去了的第一反应命令。很多时候容器已经因为主进程退出而停止了光docker ps是看不到的必须docker ps -a才找得到。看容器日志常用两个参数叠加# 持续跟随输出类似 tail -fdockerlogs-fmn# 只看最后 100 行dockerlogs--tail100mn# 带时间戳、从某个时间点开始看dockerlogs-f--tail50-tmn-f跟随输出适合启动服务后盯着看有没有异常--tail N限制行数避免把几万行历史日志一次糊满屏幕。容器启动失败时日志是第一手信息。想看容器的细节配置IP、挂载、环境变量、端口、状态等用inspectdockerinspect mn它输出一大段 JSON常用--format或配合 jq 提字段比如拿到容器 IPdockerinspect-f{{.NetworkSettings.IPAddress}}mn容器为什么会自己停容器不是跑着就不管了它的生命周期绑在主进程上容器里作为 PID 1 的那个进程一退出容器就自动进入停止状态。所以 nginx 容器里 nginx 崩了、Java 应用抛异常退出了容器都会从 running 变成 stoppeddocker ps里就看不见了。排查这类问题先看退出码dockerps-adockerinspect-f{{.State.ExitCode}}mn0是正常退出非0一般意味着主进程异常终止再去docker logs --tail 100 mn翻日志定位原因。想让容器在异常退出后自动重启run的时候加--restartdockerrun--namemn--restartalways-p80:80-dnginx--restartalways表示不管什么原因停了都自动拉起on-failure则只在非 0 退出时才重启。注意这个策略是创建容器时定死的事后想改得用docker update。完整案例跑一个 nginx 并进容器改文件需求启动 nginx 容器进容器把首页内容改掉。第一步创建并后台运行dockerrun--namemn-p80:80-dnginx第二步进入容器。容器里没有vi但可以起一个 bashdockerexec-itmnbash命令拆解exec表示在容器内执行命令-it给这次进入分配标准输入输出终端能交互mn是要进的容器名bash是进去后要执行的命令。第三步进 nginx 的 html 目录。容器内部模拟了一套独立的 Linux 文件系统nginx 的页面就在/usr/share/nginx/htmlcd/usr/share/nginx/htmlls第四步容器里没有编辑器用sed直接改sed-i-es#Welcome to nginx#欢迎您#g-es#head#headmeta charsetutf-8#gindex.html第二个-e顺手补上了utf-8声明不然中文会乱码。改完在浏览器访问宿主机地址就能看到结果。目录结构参考课程资料里跟容器命令相关的文件组织如下day03-Docker/资料 ├── Centos7安装Docker.md # 安装与镜像加速配置 ├── Dockerfile # 自定义镜像用后续章节 ├── docker-demo.jar # 待部署的 Spring Boot 应用 ├── jdk8.tar.gz # 容器内用到的 JDK ├── mysql.tar # MySQL 镜像离线包 ├── redis.tar.gz # Redis 镜像离线包 ├── nginx.conf # nginx 配置挂载用 ├── hmy.cnf # MySQL 配置挂载用 ├── docker-compose │ └── ... # Compose 编排文件 └── cloud-demo ├── docker-compose.yml ├── gateway/ ├── mysql/ ├── order-service/ └── user-service/容器跑起来之后它内部又是一套独立的 Linux 目录nginx 容器大致是这样/ ├── bin/ etc/ lib/ usr/ var/ # 基础 Linux 目录 └── usr/share/nginx/ └── html/ └── index.html # 可被 exec 进容器后修改的页面实战踩坑清单不加-d前台跑CtrlC 就停。前台运行适合调试服务要长跑必须带-d否则终端一断、一按 CtrlC容器就没了。-p 8080:80顺序写反。左边宿主机、右边容器。写成-p 80:8080就变成访问宿主机 80 转发到容器 8080容器里没监听 8080 自然不通。宿主机端口还被别的进程占了会直接报port is already allocated。run时忘了--name事后改不了。容器名只能在创建时指定跑起来之后没有重命名这种操作只能删掉重建Docker 新版本有docker rename但课程环境按没有来处理。所以养成run就写--name的习惯。exec进不去已停止的容器。容器停止后docker exec -it mn bash会直接报错因为它压根没在运行。要么docker start mn起来再进要么用docker run -it另开一个。docker rm删不掉运行中的容器。会报You cannot remove a running container先docker stop或者用docker rm -f强制删数据会一起没。误以为stop之后start能接着原来的状态跑。不会start拉起的是新进程进程内存里的东西本来就该丢。持久化要靠数据卷。docker ps看不到容器就以为容器没创建。多半是容器已经停止加-a再看。API 速览命令作用关键参数docker run创建并启动容器-d后台、--name命名、-p端口映射、-v挂载、-e环境变量、-it交互终端docker create只创建不启动参数同rundocker start启动已存在的容器容器名 / IDdocker stop停止运行中的容器容器名 / IDdocker restart重启容器容器名 / IDdocker pause暂停容器容器名 / IDdocker unpause恢复暂停的容器容器名 / IDdocker exec在运行中的容器内执行命令-it交互终端docker ps查看运行中的容器-a含已停止docker logs查看容器日志-f跟随、--tail N行数、-t时间戳docker inspect查看容器详细信息-f/--format提取字段docker rm删除容器-f强制删运行中的官方文档docker container rundocker container execdocker container ls (ps)docker container logsdocker container inspect总结容器命令的关键不是记多少个而是记住每个命令改的是哪个状态。run从镜像造出一个新容器并让它跑起来start把已停止的容器重新拉起新进程exec只对运行中的容器生效。pause/unpause是挂起与原地恢复stop/start是杀进程与重开。参数层面-d决定容器的生死是否绑在终端上-p的左宿主机右容器顺序、--name的创建即定死这三处是实际运维里最常翻车的地方。日志和状态用docker ps -a、docker logs -f --tail、docker inspect三板斧基本够用。
延伸阅读

更多相关文章

2026/10/12 3:49:59

SAP ABAP CDS SQL-Based Scalar Function 深度解析,从函数签名到 AMDP SQLScript 实现

在实际的 SAP S/4HANA 数据建模里,经常会碰到一种尴尬情况。业务需要的计算逻辑并不复杂到必须返回一整张表,但它又已经超出了普通 CDS 内置函数最适合处理的范围。可能是某种特殊字符串转换,也可能是业务评分、复杂金额计算、特定日期规则,甚至是一段更适合放进 SAP HANA …

2026/10/12 3:49:59

深入理解 SAP ABAP CDS Simple Type 的定义、类型继承与语义复用

在 ADT 里创建一个新的 CDS Type 时,编辑器最终给出的核心代码可能只有一行 define type。代码看起来非常简单,但如果把它仅仅理解成 ABAP CDS 版本的 TYPES,很容易低估它在现代 ABAP 数据模型中的作用。 SAP 引入 CDS Simple Type 的一个重要目的,是让「类型」不仅描述一…

2026/10/12 4:55:02

【Linux系统】06 进程概念

目录 ​编辑 1 冯・诺依曼体系结构 2 操作系统 (OS) 定位 2.1 广义与狭义操作系统 2.2 OS 两大目标 2.3 系统调用 & 库函数 3 进程基础概念 & PCB (task_struct) 3.1 什么是进程 3.2 PCB task_struct(Linux 的进程控制块) 3.3 查看进程…

2026/10/12 4:55:02

年终奖不发之后:绩效目标、系数规则与激励修复策略

一进十二月,办公室的气温就跟着年终奖的消息一起浮动。今年我们公司的情况很直接:官方通知就一句话——“鉴于今年公司销量、利润率等指标未达成年终目标,所以今年没有年终激励奖”。没有展开解释,没有缓冲余地,消息一…

2026/10/12 4:55:02

【Linux系统】05 Linux开发工具(下)

目录 1 make 与 Makefile 自动化构建 1.1 为什么需要 Makefile 1.2 Makefile 基础规则 1.3 make 工具推演执行逻辑 1.4 伪目标 .PHONY 1.5 Makefile 进阶语法 自定义变量 三大自动变量(高频面试) wildcard 通配符 后缀替换 模式规则 %.o:%.c …

2026/10/12 4:50:01

page_alloc zone_statistics

zone_statistics() 是页面分配路径上用于更新 NUMA 命中/未命中统计的辅助函数。它追踪分配请求的“首选 zone”与实际分配到的 zone 之间的关系,为 /proc/vmstat 提供 numa_hit、numa_miss、numa_foreign 等计数。核心作用它的职责是:当一次分配发生在 …

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/12 0:04:22

绝缘子缺陷检测数据集清洗与工业级训练实战指南

简介:本资源是面向电力AI研发人员、工业视觉工程师及智能巡检系统开发者的绝缘子缺陷检测专用YOLO格式数据集,解决无人机航拍场景下绝缘子破损、污闪、积雪等9类典型缺陷的精准识别与定位难题。数据集共2139张真实巡检图像(含训练/验证/测试集…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑