Skip to content

在 Docker 的世界里,镜像就像是保存在硬盘上的“游戏安装包”,而容器则是“运行中的游戏”。

要管理好这些容器,必须精通四个最基础也最核心的命令:runstartstoprestart

一、 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:latest

1. -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:唤醒“沉睡的英雄”

很多新手会把 runstart 搞混。

  • 区别run 每次都会创建一个全新的容器;而 start 是启动一个已经存在但处于停止状态的容器。
  • 优势start 会保留容器之前的“存档”。你在容器里产生的临时文件、日志,在 start 之后依然存在。

比喻run 是重新买了一台装好游戏的电脑;start 是把上次关掉的电脑重新按下了开机键。

四、 docker restart:一键“原地复活”

这个命令相当于连续执行了 stopstart

  • 实战意义:在生产环境中,我们经常会遇到“程序卡死了”或者“改了外部配置文件需要生效”的情况。
  • 自动机制:配合 docker run 里的 --restart always 参数,可以让你的 my-server 在崩溃时实现“无人值守自愈”。

五、应用场景

如果你还在纠结用哪个命令,请看下表:

你的需求推荐命令关键点
第一次部署新功能docker run记得加 -d-p
代码更新了,要换新镜像docker rm -f 后再 run旧的不去,新的不来
服务器内存满了,暂时关掉docker stop数据还在,不占 CPU
改了 Spring Boot 的外部配置docker restart快速重启生效
把刚才关掉的应用再开起来docker start保留上次运行的痕迹