为什么要把docker run改成Compose?
部署文档里的一长串命令,隔一段时间再看,往往很难分清端口、目录和环境变量。改成compose.yaml后,每项配置都有明确的位置,便于代码审查、备份部署方案和迁移服务器。
这个在线转换器从一条命令生成一个服务定义,不会扫描正在运行的容器,也不会自动拼出多个服务的依赖关系。已有容器不会因转换而被修改。
从命令到配置文件,怎么操作?
粘贴以docker run或docker container run开头的命令。需要换行时,在行尾保留反斜杠;带空格的参数值要用引号括起来。可选服务名只修改services下的键,显式指定的--name仍保留为container_name。
复制或下载配置后,先核对下方转换说明,把相关目录和环境变量文件放在正确位置,再运行docker compose config。长期运行的服务可用docker compose up -d启动;如果原命令包含--rm,应按一次性任务的方式处理。
Nginx示例:端口映射和重启策略
下面把主机8080端口映射到容器80端口,并保留unless-stopped重启策略。-d控制启动时是否后台运行,不是Compose服务中的配置字段。
docker run -d --name web -p 8080:80 \
--restart unless-stopped nginx:alpineservices:
web:
image: "nginx:alpine"
container_name: "web"
ports:
- "8080:80"
restart: "unless-stopped"
network_mode: "bridge"
迁移时,先确认数据卷和网络
-v data:/data引用命名数据卷,输出会用原名声明并设置external: true,避免误用带项目名前缀的新卷。该卷必须已经存在;全新部署可先建卷,或移除external: true。这只保留引用关系,不会复制数据。
相对挂载路径以Compose文件所在目录为基准;移动文件后要重新核对路径。自定义网络同样按已有外部网络处理。未指定网络时保留network_mode: bridge;如果希望使用Compose项目网络和服务名发现,可主动移除这个字段。
哪些命令需要先手动整理?
支持POSIX风格引号、转义和续行,不支持PowerShell、CMD、管道、多条命令或Docker全局选项。浏览器不能展开$(pwd)或读取本机Shell变量,应先替换为实际值。字面量美元符号要加单引号或转义,生成时会用$$保留其含义。
--env-file转换为format: raw,需要Docker Compose 2.30.0及以上版本。转换器不读取文件、检查镜像或探测端口占用;语法校验通过也不代表应用一定能启动。
Docker命令参数与Compose配置对照
| 命令参数 | Compose字段 | 含义 |
|---|---|---|
IMAGE | image | 镜像和标签保持不变 |
--name | container_name | 容器名与服务名分别处理 |
-p, --publish | ports | 主机端口到容器端口的映射 |
-e, --env | environment | 环境变量键值;省略值时由部署环境提供 |
-v, --volume / --mount | volumes | 挂载目录、命名卷或匿名卷 |
--network | networks / network_mode | 网络名称或网络模式 |
--restart | restart | 容器重启策略 |
IMAGE [COMMAND] [ARG…] | command | 容器内的启动参数按数组保留 |
转换时常见的问题
为什么没有version字段?
输出采用Compose Specification,以services为顶层入口,不添加旧式version字段。请使用现代docker compose命令检查配置。
--rm应该怎么迁移?
一次性任务用docker compose run --rm --service-ports SERVICE,把SERVICE换成实际服务名。--service-ports让该启动方式应用配置中的端口映射。
为什么--gpus不能直接转换?
GPU、旧式链接和部分高级挂载参数需要手动配置。遇到不支持的参数会停止输出,不会把参数悄悄丢掉。
可以把多个容器合并成一个Compose文件吗?
请逐条转换,再合并服务定义,同时检查共享数据卷和网络。服务依赖及启动顺序需要自行补充。
密码会发送到服务器吗?
转换逻辑在浏览器内运行,不上传输入命令,也不连接Docker守护进程。下载文件可能包含命令中的密码,保存和提交代码前请检查内容。
原来的容器还能继续运行吗?
生成配置不会操作容器。但启动Compose时,已有容器名或已占用端口可能产生冲突,需要先处理。
Docker官方文档: docker run · Compose · $$
