在 Docker 的世界里,镜像就像是保存在硬盘上的“游戏安装包”,而容器则是“运行中的游戏”。
要管理好这些容器,必须精通四个最基础也最核心的命令:run、start、stop 和 restart。
一、 docker run:从无到有的“造物主”
run 是 Docker 中最强大、最复杂的命令。
它的本质是:拉取镜像 + 创建容器 + 启动容器。
为了让你能够直接在服务器上运行并成功访问你的 my-server,这里给出一个生产环境中最标准、最完整的 docker run 命令。
bash
docker run -d \
--name my-server \
-p 8082:8082 \
-e TZ=Asia/Shanghai \
--restart always \
-v /home/app/logs:/app/logs \
personal.cr.aliyuncs.com/huanyu-app-space/my-server:latest1. -d (Detach) —— 后台静默运行
- 解释:告诉 Docker 在后台启动容器并返回一个容器 ID。
- 如果不加:你的终端会被 Spring Boot 的日志占满。一旦你关闭 SSH 窗口,程序就会跟着死掉。加上它,程序就像“服务”一样常驻后台。
2. --name my-server —— 给容器取个名
- 解释:为容器指定一个唯一的自定义名称。
- 意义:后续你查看日志(
docker logs my-server)或停止容器(docker stop my-server)时,直接用名字比记那串乱七八糟的 ID 要方便得多。
3. -p 8082:8082 —— 传菜口(端口映射)
- 格式:
宿主机端口:容器内端口 - 解释:你的 Spring Boot 代码里写的是
8082。这个参数就像是在服务器的围墙上开了一个 8082 号窗口,并把它连接到容器内部的 8082 端口。 - 注意:前面的端口是你在浏览器里输入的那个。
4. -e TZ=Asia/Shanghai —— 注入环境变量
- 解释:
-e代表 Environment。这里是强制容器使用“亚洲/上海”时区。 - 意义:解决“日志慢了 8 小时”的问题。让程序里的
new Date()和日志时间与北京时间完全同步。
5. --restart always —— 自动续命
- 解释:如果容器因为报错崩溃了,或者你的阿里云服务器重启了,Docker 引擎会自动帮你把这个容器拉起来。
- 意义:实现“无人值守”,保证服务高可用。
6. -v /home/app/logs:/app/logs —— 挂载卷(数据持久化)
- 格式:
宿主机路径:容器内路径 - 解释:把服务器硬盘上的文件夹“映射”到容器里。
- 意义:即便你执行
docker rm删掉了容器,你的历史日志依然保存在服务器的/home/app/logs里,不会丢失。
7. 镜像地址 —— 料理包来源
- 解释:最后这一长串是镜像在阿里云仓库的唯一路径。
:latest:代表取最新的那个版本。
二、 docker stop:优雅的“谢幕”
当你需要维护系统或更新配置时,需要停止容器。
- 原理:它并不会暴力拔电源,而是先发送一个
SIGTERM信号给程序,告诉它:“我们要关机了,请保存好数据,处理完剩下的请求。” - 超时机制:如果程序在 10 秒内还不退出,Docker 才会使出“暴力手段”强制杀掉(SIGKILL)。
适用场景:正常下班、准备导出数据库、或者需要临时释放内存。
三、 docker start:唤醒“沉睡的英雄”
很多新手会把 run 和 start 搞混。
- 区别:
run每次都会创建一个全新的容器;而start是启动一个已经存在但处于停止状态的容器。 - 优势:
start会保留容器之前的“存档”。你在容器里产生的临时文件、日志,在start之后依然存在。
比喻:
run是重新买了一台装好游戏的电脑;start是把上次关掉的电脑重新按下了开机键。
四、 docker restart:一键“原地复活”
这个命令相当于连续执行了 stop 和 start。
- 实战意义:在生产环境中,我们经常会遇到“程序卡死了”或者“改了外部配置文件需要生效”的情况。
- 自动机制:配合
docker run里的--restart always参数,可以让你的my-server在崩溃时实现“无人值守自愈”。
五、应用场景
如果你还在纠结用哪个命令,请看下表:
| 你的需求 | 推荐命令 | 关键点 |
|---|---|---|
| 第一次部署新功能 | docker run | 记得加 -d 和 -p |
| 代码更新了,要换新镜像 | docker rm -f 后再 run | 旧的不去,新的不来 |
| 服务器内存满了,暂时关掉 | docker stop | 数据还在,不占 CPU |
| 改了 Spring Boot 的外部配置 | docker restart | 快速重启生效 |
| 把刚才关掉的应用再开起来 | docker start | 保留上次运行的痕迹 |