Docker-重用不同项目的Docker compose配置

Docker-重用不同项目的Docker compose配置,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我有一个大型Docker项目,在经过数周的更改和测试后,配置了针对nginx、apache2、varnish、redis的Dockerfiles,并且运行良好 现在,我将项目设置为使用docker compose和override.yml文件,以便轻松设置: 我正在尝试对多个项目(网站)使用相同的docker compose设置 正常启动(使用docker-compose.yml和可选的docker-compose.override.yml) docker compose up-d 自定义启动(

我有一个大型Docker项目,在经过数周的更改和测试后,配置了针对
nginx、apache2、varnish、redis的Dockerfiles,并且运行良好

现在,我将项目设置为使用docker compose和override.yml文件,以便轻松设置:

我正在尝试对多个项目(网站)使用相同的docker compose设置

正常启动(使用
docker-compose.yml和可选的docker-compose.override.yml
docker compose up-d

自定义启动(使用特定的docker compose文件)
docker-compose-f docker-compose.yml-f custom/docker-compose.website1.yml up-d

这两种方法都可以很好地启动:
docker-compose-ps

               Name                       Command          State                Ports
  ------------------------------------------------------------------------------------------------
  nginx-proxy              /usr/bin/supervisord   Up      0.0.0.0:443->443/tcp,
                                                          0.0.0.0:80->80/tcp
  redis-cache              /usr/bin/supervisord   Up      0.0.0.0:6379->6379/tcp
  varnish-cache            /usr/bin/supervisord   Up      0.0.0.0:6081->6081/tcp,
                                                          0.0.0.0:6082->6082/tcp
  web-server-              /usr/bin/supervisord   Up      0.0.0.0:8080->8080/tcp
  apache2
  nginx-proxy              /usr/bin/supervisord   Up      0.0.0.0:443->443/tcp,
                                                          0.0.0.0:80->80/tcp
  redis-cache-delete       /usr/bin/supervisord   Up      0.0.0.0:6379->6379/tcp
  varnish-cache-delete     /usr/bin/supervisord   Up      0.0.0.0:6081->6081/tcp,
                                                          0.0.0.0:6082->6082/tcp
  web-server-              /usr/bin/supervisord   Up      0.0.0.0:8080->8080/tcp
  apache2-delete
忽略它们是退出0的事实-我使用
docker compose stop停止它们,容器工作正常
nginx代理/usr/bin/supervisordexit 0 redis缓存/usr/bin/supervisordexit 0 清漆缓存/usr/bin/supervisordexit 0 web-server-apache2/usr/bin/supervisordexit 0

现在,我希望第二个项目(网站)使用相同的docker/docker compose配置设置:

docker-compose-f docker-compose.yml-f其他自定义文件夹/docker-compose.website2.yml-up-d

令我惊讶的是,docker编写了重新创建的容器,但没有创建一组新的容器:

有关如何设置内容,请参见“当前设置”部分。

  Creating network "delete-network-frontend" with the default driver
  Recreating nginx-proxy        ... done
  Recreating varnish-cache      ... done
  Recreating web-server         ... done
  Recreating redis-cache        ... done
在第二个设置文件夹中运行
docker compose ps
时:

注意名称与上述不同(这是第二次测试设置)

docker compose似乎做了两件事:1。重新创建(替换)项目1容器,使用项目1容器名称说明它们已“重新创建”,以及2。删除项目1容器,将其重命名为项目2容器

当前设置
  • 我创建了一个完整的docker文件项目,配置了docker-compose.yml和两个override docker-compose文件(
    docker-compose.website1.yml和
    docker compose.website2.yml`)
  • 我制作了工作Dockerfile/docker-compose.yml项目的完整副本,并创建了一个新文件夹:换句话说,这两个文件夹将使用相同的docker设置,但使用不同的docker-compose.yml覆盖文件。
    /var/www/docker/site1
    /var/www/docker/site2
问题: TLDR:如何在同一主机操作系统上为多个项目使用正在工作的
docker compose
项目。。。而不是替换另一个项目的容器

我希望能够同时看到(使用两者),例如,能够看到: 忽略端口在这里是相同的这一事实,我知道它们不会同时运行,我会在工作时更新项目docker-compose.yml自定义文件

docker-compose-ps

               Name                       Command          State                Ports
  ------------------------------------------------------------------------------------------------
  nginx-proxy              /usr/bin/supervisord   Up      0.0.0.0:443->443/tcp,
                                                          0.0.0.0:80->80/tcp
  redis-cache              /usr/bin/supervisord   Up      0.0.0.0:6379->6379/tcp
  varnish-cache            /usr/bin/supervisord   Up      0.0.0.0:6081->6081/tcp,
                                                          0.0.0.0:6082->6082/tcp
  web-server-              /usr/bin/supervisord   Up      0.0.0.0:8080->8080/tcp
  apache2
  nginx-proxy              /usr/bin/supervisord   Up      0.0.0.0:443->443/tcp,
                                                          0.0.0.0:80->80/tcp
  redis-cache-delete       /usr/bin/supervisord   Up      0.0.0.0:6379->6379/tcp
  varnish-cache-delete     /usr/bin/supervisord   Up      0.0.0.0:6081->6081/tcp,
                                                          0.0.0.0:6082->6082/tcp
  web-server-              /usr/bin/supervisord   Up      0.0.0.0:8080->8080/tcp
  apache2-delete
如果有人问:为什么不把网站放在同一个容器中?? 有人可能会问这个问题,我知道我可以将多个网站添加到
/etc/apache2/sites enabled
(或nginx)中,并使用Dockerfile中的
add
为每个网站添加自定义配置文件,但使用该方法我无法测试不同的设置

通过引用“覆盖docker compose files”中的另一个不同图像可以使用的不同设置


例如,我可以创建一个Dockerfile来安装所需的所有php7.3库并在其上运行Magento 2.3,然后创建另一个Dockerfile来测试php7.4,并创建另一个Dockerfile来在PHP5.6安装上运行较旧的Magento 1站点,依此类推。

感谢David Maze
的建议,我在配置docker compose设置以处理多个项目时遇到了进一步的困难

基于docker compose v1.25.0(2020年7月)的信息

当您想要重用(持久化)容器(启动/停止,而不是只向上/向下删除)时,此讨论尤其重要

正如在我的问题中最初指出的,如果您尝试使用
docker compose up-d
创建容器,那么目前该工具根本不支持一些陷阱

陷阱 当前DOCKER-COMPOSE实现的陷阱:

   networks:
      network_frontend:
          name: stage6-network-frontend
   networks:
      network_frontend:
          name: magento2.3-network-frontend
  • 如果您仅使用覆盖的
    docker compose*.yml
    和不同的容器名称(每个“项目”)以及相同文件夹中的文件
  • docker compose up
    将按照我的问题中的解释,简单地替换现有的容器。

      Creating network "delete-network-frontend" with the default driver
      Recreating nginx-proxy        ... done
      Recreating varnish-cache      ... done
      Recreating web-server         ... done
      Recreating redis-cache        ... done
    
  • 您可以执行以下操作:
    docker compose-p CUSTOM_PROJECT_NAME-f file1.yml-f file2.yml up-d
    ,但是:
  • 这本身是无用的-这些容器只有在您想要停止它们之前才会工作。只要您想执行
    docker compose start
    (重新启动现有容器集),它就会失败,并出现
    错误:没有要启动的容器

  • 如果对同一docker compose项目(即克隆项目)使用两个不同的文件夹:例如
    /dc-project1
    /dc-project2
  • ,但使用
    docker compose.*.yml文件中的
    容器名
    字段: 当您尝试运行
    docker compose-f f1.yml-f f2.yml up-d
    内部
    /dc-project1
    和相同的内部
    /dc-project2
    文件夹时,您将得到以下错误:
    您必须删除(或重命名)该容器才能重新使用该名称

  • 使用覆盖的文件时,Docker compose将出现与您的Docker网络类似的问题: 已删除大多数自定义设置,以使网络设置更清晰:
  • 网络将从您在
    docker compose up上覆盖的文件中正确连接
    
         web_server:
           container_name: web-server-apache2-magento2.3.5
           networks:
             - network_frontend
           build:
             args:
           volumes:
             - website_data:/var/www/html
           ports:
             - "8080:8080"
    
       networks:
         network_frontend:
           driver: bridge
           ipam:
             driver: default
             config:
               - subnet: 172.100.0.0/16
           driver_opts:
             # Custom name for host-side network : for instance on Ubuntu : ip addr | ifconfig
      com.docker.network.bridge.name: d-glo-femag2_35 # Seems limit of 15 characters only
           name: glo-magento2.3-network-frontend
    
      sudo service docker stop
      find /var/lib/docker/containers/ -type f -name "config.v2.json" -exec sed -i "s|wrong-network-name|overridden-network-name|g" '{}' \;
      sudo service docker start