停止编写 docker run 命令——改用 Docker Compose
大多数 docker run 命令会变成难以维护的参数堆叠。本指南将展示如何将 docker run 转换为 docker compose——并附带参数参考表、实际转换示例以及一个免费的转换工具。
每个Docker工作流都从相同的方式开始: docker run一个标志,两个标志——可以管理。但当你运行一个容器,包含端口、环境变量、卷、重启策略和自定义网络时,这条命令会达到400个字符,没有人能记住,也无法通过版本控制或在没有Slack线程满是羞愧的情况下交给队友。
Docker Compose是解决方案。一个YAML文件替代了整个命令——并且你可以将其提交到Git中。
为什么docker run无法扩展
以下是一个典型的 docker run Node.js应用的命令:
docker run -d \
--name my-app \
-p 3000:3000 \
-e NODE_ENV=production \
-e DATABASE_URL=postgres://user:pass@db:5432/mydb \
-v ./data:/app/data \
--network app-network \
--restart always \
my-app:latest
这可以工作。只一次。然后你关闭终端,三天后打开一个新的终端,却完全不知道你用了哪些标志。没有东西可以 git diff。没有东西可以分享给新员工。无法验证预发布环境与生产环境是否一致。
Docker Compose能为你提供什么
Docker Compose将之前那个 docker run 命令中所有内容都放入一个名为 docker-compose.yml的YAML文件中。
- 该文件位于你的代码仓库中,与代码并列存放
- 通过一个单一命令运行
docker compose up -d - 在每台机器和每个环境中运行效果完全一致
- 可扩展到多服务设置(应用+数据库+缓存),无需复杂的标志操作
如何将docker run命令转换为Docker Compose
上面那个命令现在变成这样 docker-compose.yml:
version: "3.9"
services:
my-app:
image: my-app:latest
container_name: my-app
ports:
- "3000:3000"
environment:
NODE_ENV: production
DATABASE_URL: postgres://user:pass@db:5432/mydb
volumes:
- ./data:/app/data
networks:
- app-network
restart: always
networks:
app-network:
相同行为。但现在它可读、可提交、可重现。
启动它:
docker compose up -d
停止它:
docker compose down
docker run标志转换为docker-compose.yml键值
最常遇到标志的参考列表:
| docker run标志 | docker-compose.yml键值 | 例子 |
|---|---|---|
-p 8080:80 | ports: | - "8080:80" |
-e FOO=bar | environment: | FOO: bar |
-v ./data:/data | volumes: | - ./data:/data |
--network mynet | networks: | mynet |
--restart always | restart: | always |
--name mycontainer | container_name: | mycontainer |
--memory 512m | mem_limit: | 512m |
--cpus 1.5 | deploy.resources.limits.cpus | cpus: "1.5" |
-d | 使用 -d 运行时标志 | docker compose up -d |
自动转换
如果你有一个很长的现有 docker run 命令——特别是从README或一个CI脚本继承而来的,该脚本已经两年未被任何人修改——你不需要手动映射每个标志。使用 Docker Run 转 Compose 工具:将命令粘贴进去,得到一个有效的 docker-compose.yml 输出。
它能处理端口、环境变量、卷、网络、重启策略等。在迁移旧的单行命令时非常有用,避免在转换过程中引入拼写错误。
如果你在Compose文件中配置资源限制, Docker 容器资源计算器 将帮助你根据工作负载选择合理的内存和CPU值——在你提交那些凭空想象的数值之前。
顺便检查Dockerfile
一旦你的Compose文件整理完毕,检查它所构建的Dockerfile。未锁定的基础镜像、缺失的 WORKDIR、冗余的 RUN 分层——这些很容易被忽略,而且后期调试会很麻烦。通过 Dockerfile检查工具 可以在这些问题变成生产问题之前就发现它们。
