忘了 `docker run` 命令?别慌!教你用 `docker inspect` 完美复原!
内容
## 背景
在日常的开发和运维工作中,我们经常会遇到这样的场景:一个重要的 Docker 容器正在线上稳定运行,但随着时间的推移,创建它的 `docker run` 命令或者 `docker-compose.yml` 文件已经丢失。当需要迁移服务、进行灾备或在测试环境中复现时,我们就面临着如何精确复原这个容器配置的挑战。幸运的是,Docker 提供了一个强大的内省工具——`docker inspect`,它能让我们像侦探一样,从正在运行的容器中挖掘出所有配置细节。
本文由 DP@lib00 撰写,将通过一个具体的 MinIO 容器实例,向你展示如何利用 `docker inspect` 的输出,一步步重建原始的 `docker run` 命令,并额外介绍如何验证容器内的时区设置。
---
## 第一步:获取容器的详细信息
首先,我们需要使用 `docker inspect` 命令,并指定目标容器的名称或ID。这将返回一个包含该容器所有配置信息的 JSON 对象。
```bash
docker inspect minio_lib00
```
你会得到一个庞大的 JSON 输出。别担心,我们只需要关注其中的关键部分。
---
## 第二步:解析 JSON 输出并重建命令
我们将逐项分析 `docker inspect` 输出的关键字段,并将它们映射回 `docker run` 命令的相应参数。
### 1. 容器名称 (`--name`)
在 JSON 中查找 `Name` 字段。它通常以 `/` 开头。
```json
{
"Name": "/minio_lib00"
}
```
这对应于 `docker run` 的 `--name` 参数。
> **复原部分**: `--name minio_lib00`
### 2. 后台运行 (`-d`)
检查 `State` 对象中的 `Status` 以及 `Config` 中的 `AttachStdin` 和 `Tty`。如果容器正在运行 (`"Status": "running"`) 并且不是交互模式 (`"AttachStdin": false`, `"Tty": false`),那么它很可能是在后台(detached)模式下启动的。
> **复原部分**: `-d`
### 3. 端口映射 (`-p`)
`HostConfig.PortBindings` 对象详细记录了宿主机与容器之间的端口映射关系。
```json
"PortBindings": {
"9000/tcp": [
{
"HostIp": "",
"HostPort": "39000"
}
],
"9001/tcp": [
{
"HostIp": "",
"HostPort": "39001"
}
]
}
```
这里,宿主机的 `39000` 端口映射到容器的 `9000` 端口,`39001` 映射到 `9001`。
> **复原部分**: `-p 39000:9000 -p 39001:9001`
### 4. 数据卷挂载 (`-v`)
`HostConfig.Binds` 数组包含了所有绑定挂载(bind mounts)的信息。
```json
"Binds": [
"/data/wiki.lib00.com/minio/data:/data"
]
```
这表示将宿主机的 `/data/wiki.lib00.com/minio/data` 目录挂载到了容器的 `/data` 目录。
> **复原部分**: `-v /data/wiki.lib00.com/minio/data:/data`
### 5. 环境变量 (`-e`)
`Config.Env` 数组列出了所有注入容器的环境变量。我们通常只关心那些在启动时由用户自定义的变量。
```json
"Env": [
"TZ=Asia/Shanghai",
"MINIO_ROOT_USER=admin_dp",
"MINIO_ROOT_PASSWORD=admin_dp_password",
"MINIO_SERVER_URL=https://s3.lib00.com",
"MINIO_BROWSER_REDIRECT_URL=https://s3.lib00.com",
...
]
```
> **复原部分**:
> ```shell
> -e "TZ=Asia/Shanghai" \
> -e "MINIO_ROOT_USER=admin_dp" \
> -e "MINIO_ROOT_PASSWORD=admin_dp_password" \
> -e "MINIO_SERVER_URL=https://s3.lib00.com" \
> -e "MINIO_BROWSER_REDIRECT_URL=https://s3.lib00.com"
> ```
### 6. 网络配置 (`--network`)
`HostConfig.NetworkMode` 字段指明了容器连接的 Docker 网络。
```json
"NetworkMode": "lib00_net"
```
> **复原部分**: `--network lib00_net`
### 7. 镜像名称和启动命令
`Config.Image` 字段是容器使用的镜像,而 `Config.Cmd` 或 `Args` 则是容器启动时执行的命令。
```json
{
"Image": "minio/minio:RELEASE.2025-04-22T22-12-26Z",
"Cmd": [
"server",
"/data",
"--console-address",
":9001"
]
}
```
> **复原部分**: `minio/minio:RELEASE.2025-04-22T22-12-26Z server /data --console-address :9001`
---
## 最终复原的命令
将以上所有部分组合起来,我们就得到了完整的 `docker run` 命令:
```bash
docker run -d \
--name minio_lib00 \
-p 39000:9000 \
-p 39001:9001 \
-v /data/wiki.lib00.com/minio/data:/data \
-e "TZ=Asia/Shanghai" \
-e "MINIO_ROOT_USER=admin_dp" \
-e "MINIO_ROOT_PASSWORD=admin_dp_password" \
-e "MINIO_SERVER_URL=https://s3.lib00.com" \
-e "MINIO_BROWSER_REDIRECT_URL=https://s3.lib00.com" \
--network lib00_net \
minio/minio:RELEASE.2025-04-22T22-12-26Z \
server /data --console-address :9001
```
---
## 附加技巧:如何验证容器内的时区?
在上面的命令中,我们通过 `-e "TZ=Asia/Shanghai"` 设置了时区。如何验证它是否生效呢?我们可以使用 `docker exec` 在容器内执行命令。
### 方法 1:使用 `date` 命令 (最常用)
这是最快捷的方法。
```bash
docker exec minio_lib00 date
# 预期输出将包含 CST (China Standard Time) 标识
# Mon Oct 28 15:30:00 CST 2024
```
### 方法 2:检查 `/etc/localtime` 软链接
查看该文件是否正确链接到指定的时区文件。
```bash
docker exec minio_lib00 ls -l /etc/localtime
# 预期输出
# lrwxrwxrwx 1 root root 32 Oct 28 10:10 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
```
### 方法 3:打印 `TZ` 环境变量
确认环境变量已成功注入。
```bash
docker exec minio_lib00 sh -c 'echo $TZ'
# 预期输出
# Asia/Shanghai
```
---
## 结论
`docker inspect` 是一个功能强大的工具,它是每个 Docker 用户都应该掌握的“超级英雄”技能。通过深入分析其输出,我们不仅可以复原丢失的启动命令,还能更深刻地理解容器的内部工作原理。希望这篇来自 wiki.lib00 的指南能帮助你更自信地管理你的容器化应用。
关联内容
解决 PHP 报错 "could not find driver":PDO 数据库驱动缺失的终极排查指南
时长: 00:00 | DP | 2026-07-04 08:03:00解决 Nginx 访问 PHP Imagick 生成的 WebP 图片提示 Permission Denied (13) 错误
时长: 00:00 | DP | 2026-07-05 21:17:00解决 Mac mini 无法接收手机短信 (SMS) 及 iMessage 同步卡死的问题
时长: 00:00 | DP | 2026-07-06 22:07:00群晖 NAS 安装与配置 Git 服务的完整指南:从基础到进阶
时长: 00:00 | DP | 2026-07-16 20:39:02Mac SMB 共享删除文件后出现 .smbdelete 隐藏文件?原因与终极解决办法
时长: 00:00 | DP | 2026-06-27 19:10:00Docker容器修改时区为东八区(UTC+8)的完整指南与避坑
时长: 00:00 | DP | 2026-06-30 20:43:30Nginx [warn] conflicting server name 警告的彻底排查与修复指南
时长: 00:00 | DP | 2026-07-21 09:02:28解决 PHP 8 Docker (Debian Trixie) 无法安装 openjdk-17-jdk 的问题
时长: 00:00 | DP | 2026-07-25 09:23:18Docker Compose 进阶:如何配置固定 IP 与跨容器 SOCKS5 代理
时长: 00:00 | DP | 2026-07-26 09:28:30Nginx反向代理实战:如何将指定子目录路径(如/ais)优雅转发到Docker容器
时长: 00:00 | DP | 2026-07-26 21:31:06运维实战:如何安全清空运行中的 Docker 容器日志?
时长: 00:00 | DP | 2026-07-27 09:33:42CentOS服务器代理配置全指南:从全局设置到常见故障排查
时长: 00:00 | DP | 2026-07-27 21:36:19实用指南:如何将复杂的 Docker Compose 完美转换为 Docker Run 命令
时长: 00:00 | DP | 2026-07-29 09:44:07Docker Cron 日志终极指南:主机重定向 vs. 容器内重定向,你用对了吗?
时长: 00:00 | DP | 2026-01-05 08:03:52Cron 任务执行失败?解密“docker: command not found”的终极解决方案
时长: 00:00 | DP | 2026-08-01 09:59:44“连接被拒绝”的终极解密:当 PHP PDO 遇上 Docker 和一个被遗忘的端口
时长: 00:00 | DP | 2025-12-03 09:03:20群晖 NAS 部署 MySQL Docker 踩坑记:轻松搞定“Permission Denied”权限错误
时长: 00:00 | DP | 2025-12-03 21:19:10Docker 容器如何访问 Mac 主机?终极指南:轻松连接 Nginx 服务
时长: 00:00 | DP | 2025-12-08 23:57:30相关推荐
PHP常量存在性检查:`defined()` vs `isset()` 的终极对决
00:00 | 195次在PHP开发中,如何安全地检查一个用`define()`定义的常量是否存在?本文将深入探讨正确的方法...
YouTube 创作者必看:Google AdSense 中美税收协定 10% 预扣税详解与 W-8BEN 填报指南
00:00 | 15次针对中国大陆 YouTube 创作者和站长,详细解析 Google AdSense 中的“中美税收协...
PHP 依赖注入实战:解决 Controller 的 'Too Few Arguments' 致命错误
00:00 | 83次在 PHP MVC 架构中,通过构造函数注入 Request 对象是一种优雅的实践,但常会遇到 'T...
PHP中 `self::` 与 `static::` 的天壤之别:深入解析后期静态绑定
00:00 | 156次深入探讨PHP中`self`和`static`关键字在继承上下文中的核心区别。本文通过清晰的代码示例...