部署docker-compose容器

9

我试图部署一个使用docker-compose构建的应用程序,但感觉完全走错了方向。

  1. 在本地环境中一切都运行良好——docker-compose up命令可以启动我的应用程序,并创建相应的网络和主机。
  2. 我想在生产环境中使用相同的容器和网络配置,只需要使用不同的.env文件即可。

我的当前工作流程大致如下:

docker save [web image] [db image] > containers.tar
zip deploy.zip containers.tar docker-compose.yml
rsync deploy.zip user@server

ssh user@server
unzip deploy.zip ./
docker load -i containers.tar

docker-compose up

此时,我希望当他们到达时能够再次运行docker-compose up,但这会根据docker-compose.yml文件尝试重新构建容器。

我有一种明显的感觉,我缺少某些东西。我应该将完整的应用程序发送过去,然后在服务器上构建镜像吗?如果您从注册表中存储/加载图像,该如何启动组合容器?


我没有看到任何与D相关的内容? - Bauss
2
@Bauss 很好的发现,只是在输入 Docker 标签时打错了一个字。 - Dan Prince
1
我不明白,你说docker-compose尝试从docker-compose.yml重建容器,这没有意义,除非有什么东西使用docker-compose up --build调用它。我的唯一想法是在你的生产环境中运行docker images命令,并检查镜像名称和标签是否与docker-compose.yml中的匹配。 - Stratos
@Stratos 我认为问题在于从tar文件中docker load后,docker镜像不再有标签。 - Dan Prince
@DanPrince,这正是我怀疑的问题,全部修复了吗? - Stratos
@Stratos 我最终放弃了保存/加载和手动传输选项,改用注册表。今晚我会写一篇答案。 - Dan Prince
1个回答

7
问题在于我在开发和生产中使用了同一个docker-compose.yml文件。
应用程序服务没有指定存储库名称或标签,因此当我在服务器上运行 docker-compose up 时,它会尝试构建我的应用程序源代码目录中的Dockerfile(该目录在服务器上不存在)。
最终,我通过向本地的docker-compose.yml文件添加显式图像字段来解决了这个问题。
version: '2'
services:
  web:
    image: 'my-private-docker-registry:latest'
    build: ./app

然后为生产创建了一个替代的编排文件:

version: '2'
services:
  web:
    image: 'my-private-docker-registry:latest'
    # no build field!

在本地运行 docker-compose build 后,网页服务镜像将使用仓库名称为 my-private-docker-registry,标签为 latest 进行构建。

之后只需要将镜像推送到仓库即可。

docker push 'my-private-docker-registry:latest'

运行docker pull后,停止并重新创建正在运行的容器,使用新镜像是安全的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接