对Docker合成进行版本控制

时间:2018-10-31 15:33:00

标签: docker deployment docker-compose

我通常使用简单的生产映像合成来管理生产部署,因此完全依赖docker-compose。

我不使用Kubernetes或其他工具,因为我想对我的简单应用程序保持简单(我不部署在多个主机上,也不管理负载平衡或执行CD / CI)

这是我的作品构图:

version: '3'

services:
    php:
        image: ${CONTAINER_REGISTRY_BASE}/php:${VERSION}
        depends_on:
          - db
        env_file:
          - ./api.env

    api:
        image: ${CONTAINER_REGISTRY_BASE}/api:${VERSION}
        depends_on:
          - php
          - db

    db:
        image: mariadb:10.2

    client:
        image: ${CONTAINER_REGISTRY_BASE}/client-prod:${VERSION}
        env_file:
          - ./client.env

    admin:
        image: ${CONTAINER_REGISTRY_BASE}/admin-prod:${VERSION}
        env_file:
          - ./admin.env

.env文件中为应用程序堆栈保留一个全局版本,当我更新此版本时,我只需要这样做:

docker-compose build
docker-compose push

在生产服务器中(更新版本后)

docker-compose up -d

您可以想象,问题在于,即使其中一项服务进行了很小的修改,我也要运送整个堆栈。

我曾考虑为每种服务使用不同的版本,但维护起来似乎很复杂,因为我们无法真正确定每种服务的最新版本。

我看错了吗?我不应该在生产中使用docker-compose吗?在那种情况下我应该使用什么?

有人可以建议我一种基于Docker注册表的简单部署方式吗?

1 个答案:

答案 0 :(得分:1)

简短答案: 实际上,您应该为每一个提供单独的服务,我建议您将生产的普通Docker服务器转移到Swarm。

长答案: 如果您移至Docker Swarm,则可以使用相同的compose文件,并进行一些更改以使其成为堆栈文件。这是由Swarm单独创建的一系列服务。

在构建过程中,建议您为每个新构建分配一个特定的版本号,然后将其专门标记为最新版本或开发版本。将最新版本或开发版本推送到存储库。

这样做的原因有两个:

  1. 更新堆栈文件时,您需要指定要使用的图像的离散版本。 IE 1.2.3或任何最新的服务,都适用于您刚刚更改的服务。这是因为,如果您尝试使用“最新”,则存在很大的变化,Swarm甚至不会尝试在部署时拉映像。我一直发现最好避免在生产意义上产生歧义
    1. 对于开发人员而言,无论何时开始工作或在本地环境中工作时,他们始终可以通过composer覆盖(基本上依次调用两个撰写文件,第一个具有核心定义,第二个有更改或添加等)

每当您进行docker stack部署时,它只会查看服务中的差异以进行更改。我会尝试一下,但是我认为它会更好地适合您的工作流程。

旁注: 我从来没有真正为Docker中现有的数据库找到一个好的用例,而没有(1)缺乏资源或(2)集成测试。