docker - 使用docker-compose在服务器上构建多容器docker镜像

标签 docker docker-compose production

我正在处理一个多服务的docker镜像,该镜像在本地运行良好,但是在服务器端构建它时遇到了麻烦(可能是知识鸿沟)。一种服务正在运行我的mysql数据库,另一种服务是我的主应用程序(每个应用程序都有自己的Dockerfile,尽管我认为这是给定的),两者均通过docker-compose链接,并使用depends_on首先运行安装mysql并确保其处于正常状态。

我已经成功在本地构建和运行镜像,并在推送到docker hub后将其拉到服务器,但是找不到有关如何在生产中正确使用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.



生产中“构建”应该指向什么?我应该以某种方式指向Docker镜像本身中的Dockerfile,还是该配置在生产中完全不同?是否还有其他配置需要更改?

最佳答案

事实是,您不应该为生产构建docker镜像。

通常的设置是构建可在多种环境下运行的镜像。
在UAT上测试此镜像,如果还可以,则使生产环境停止当前容器,然后根据新镜像启动新容器。

要存储镜像,您可以使用docker注册表。

至于您的错误,是因为您在执行docker-compose build的机器上没有db_config文件而发生。与将撰写文件上传到生产环境类似,为了在生产环境上构建镜像,您需要提供构建所需的所有必要项目文件。

如果要使其“干净”,则正确的方法是在构建环境中构建镜像,将镜像推送到注册表,然后在生产环境中进行部署。

是的,对于生产部署,您需要撰写文件。但是,您不需要进行构建。如果可以访问Docker注册表,则应首先停止正在运行的容器,然后再次启动它们。

如果您对swarm进行操作,应该会更容易,因为swarm会检查容器是否具有较新的镜像库,并且仅在需要镜像更新时才停止它们。

关于docker - 使用docker-compose在服务器上构建多容器docker镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50642015/

相关文章:

postgresql - 使用pgadmin4将csv文件从本地机器导入到postgresql docker容器

php - PHP Docker镜像中的Apache vs FPM之间的区别?

ruby-on-rails - 无法打开到本地主机的 TCP 连接 :9200 (Cannot assign requested address - connect(2) for "localhost" port 9200)

python - 运行 sls deploy 时无服务器挂起。 Docker 命令未结束

windows - 如何在Windows中为Docker容器设置静态IP地址?

ruby-on-rails - Heroku 使用生产配置而不是暂存配置

docker - `docker-compose down` 和 Ctrl + C 的区别

docker - 如何处理VSCode Remote dev容器中的多个 `network_mode`?

production - 在 CloudKit 中将记录从开发移动到生产

Node.js - 部署 Node.js 应用程序时是否需要在生产服务器上重新安装所有模块