使用 docker-compose 在服务器上构建多容器 docker 图像
Building multi-container docker image on server with docker-compose
我正在处理一个多服务 docker 图像,它在本地运行良好,但在服务器端构建它时遇到问题(可能是知识差距)。一项服务是 运行ning 我的 mysql 数据库,而另一个是我的主要应用程序(每个都有自己的 Dockerfile,尽管我想这是给定的),两者都通过 docker-compose 链接并使用depends_on 到 运行 首先设置 mysql 并确保它处于健康状态。
我已成功在本地构建和 运行 镜像,并在推送到 docker 中心后将其拉到服务器,但找不到任何关于如何正确执行的指导在生产中使用我的 docker-compose.yml 文件。我花了一段时间才意识到我需要将 docker-compose 文件单独上传到生产环境,但现在我对 'build' 设置感到困惑。
在本地,我正在使用一个类似于下面的 docker-compose.yml 文件,'build' 设置指向项目中的 db_config 文件夹目录。
version: '2.1'
services:
mysql:
image: username/my_image:latest
container_name: db
build: ./db_config
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_USER: "dbuser"
MYSQL_PASSWORD: "12345"
MYSQL_DATABASE: "my_db"
healthcheck:
test: "exit 0"
my_app:
container_name: app
build: .
depends_on:
mysql:
condition: service_healthy
entrypoint:
- /usr/local/bin/docker-entrypoint.sh
ports:
- "80:8080"
尝试在生产环境中使用此文件构建 (docker-compose build
) 时出现以下错误(名称已更改):
build path /home/user/my_app/db_config either does not exist, is not
accessible, or is not a valid URL.
'build' 在生产中应该指向什么?我应该以某种方式指向 docker 图像本身中的 Dockerfile,还是此配置在生产中应该完全不同?其他配置是否也需要更改?
问题是您不应该为生产构建 docker 映像。
通常的设置是构建一个可以 运行 在多个环境中运行的映像。
在 UAT 上你测试这个镜像,当它没问题的时候,你让生产环境停止当前的容器,然后基于新的镜像启动新的容器。
要存储图像,您可以使用 docker 注册表。
至于你的错误,它们的发生是因为在你执行 docker-compose build 的机器上你没有 db_config 文件。类似于将compose上传到生产环境的必要性,为了在生产环境构建镜像,您需要提供构建所需的所有必要项目文件。
如果你想做到 "clean" 那么正确的方法是在构建环境中构建镜像,将镜像推送到注册表,然后在生产环境中进行部署。
是的,对于生产部署,您需要撰写文件。但是,您不需要进行构建。如果可以访问 docker 注册表,您应该首先停止 运行ning 容器,然后重新启动它们。
如果你在 swarm 上操作,应该更容易,因为 swarm 会检查容器是否有更新的镜像库,并且只有在需要更新镜像时才会停止它们。
我正在处理一个多服务 docker 图像,它在本地运行良好,但在服务器端构建它时遇到问题(可能是知识差距)。一项服务是 运行ning 我的 mysql 数据库,而另一个是我的主要应用程序(每个都有自己的 Dockerfile,尽管我想这是给定的),两者都通过 docker-compose 链接并使用depends_on 到 运行 首先设置 mysql 并确保它处于健康状态。
我已成功在本地构建和 运行 镜像,并在推送到 docker 中心后将其拉到服务器,但找不到任何关于如何正确执行的指导在生产中使用我的 docker-compose.yml 文件。我花了一段时间才意识到我需要将 docker-compose 文件单独上传到生产环境,但现在我对 'build' 设置感到困惑。
在本地,我正在使用一个类似于下面的 docker-compose.yml 文件,'build' 设置指向项目中的 db_config 文件夹目录。
version: '2.1'
services:
mysql:
image: username/my_image:latest
container_name: db
build: ./db_config
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_USER: "dbuser"
MYSQL_PASSWORD: "12345"
MYSQL_DATABASE: "my_db"
healthcheck:
test: "exit 0"
my_app:
container_name: app
build: .
depends_on:
mysql:
condition: service_healthy
entrypoint:
- /usr/local/bin/docker-entrypoint.sh
ports:
- "80:8080"
尝试在生产环境中使用此文件构建 (docker-compose build
) 时出现以下错误(名称已更改):
build path /home/user/my_app/db_config either does not exist, is not accessible, or is not a valid URL.
'build' 在生产中应该指向什么?我应该以某种方式指向 docker 图像本身中的 Dockerfile,还是此配置在生产中应该完全不同?其他配置是否也需要更改?
问题是您不应该为生产构建 docker 映像。
通常的设置是构建一个可以 运行 在多个环境中运行的映像。 在 UAT 上你测试这个镜像,当它没问题的时候,你让生产环境停止当前的容器,然后基于新的镜像启动新的容器。
要存储图像,您可以使用 docker 注册表。
至于你的错误,它们的发生是因为在你执行 docker-compose build 的机器上你没有 db_config 文件。类似于将compose上传到生产环境的必要性,为了在生产环境构建镜像,您需要提供构建所需的所有必要项目文件。
如果你想做到 "clean" 那么正确的方法是在构建环境中构建镜像,将镜像推送到注册表,然后在生产环境中进行部署。
是的,对于生产部署,您需要撰写文件。但是,您不需要进行构建。如果可以访问 docker 注册表,您应该首先停止 运行ning 容器,然后重新启动它们。
如果你在 swarm 上操作,应该更容易,因为 swarm 会检查容器是否有更新的镜像库,并且只有在需要更新镜像时才会停止它们。