首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头-重用码头-不同项目的组合配置

码头-重用码头-不同项目的组合配置
EN

Stack Overflow用户
提问于 2020-08-05 10:08:54
回答 1查看 1.3K关注 0票数 0

我有一个大型的Docker项目,其中包含用于nginx, apache2, varnish, redis的Dockerfiles,经过几周的更改和测试后运行良好。

现在,为了便于安装,我设置了使用docker和override.yml文件的项目:

我试图使用相同的对接-组合设置为多个项目(网站)。

正常启动(使用docker-compose.yml and optional docker-compose.override.yml) docker-compose up -d

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

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

我使用docker-compose stop, the containers work fine nginx代理/usr/bin/Ignore退出0 redis-cache /usr/bin/Ignore退出0清漆-cache /usr/bin/supervisord退出0 web-server-apache2 /usr/bin/退出0。

现在,我想要一个第二个项目(网站)使用相同的docker/docker-复合配置设置:

docker-compose -f docker-compose.yml -f anothercustomfolder/docker-compose.website2.yml up -d

让我感到意外的是,我并不创建一个新的容器集,而是创建重新创建的容器,这让我感到意外:

关于我是如何设置东西的,请参见“当前安装”一节.

代码语言:javascript
复制
  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时:

注意:名称与上面的不一样(这是第二个测试设置)

代码语言:javascript
复制
         Name                       Command          State                Ports
  ------------------------------------------------------------------------------------------------
  nginx-proxy-delete       /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

看起来,docker-compose做了两件事: 1.重新创建(替换)项目1容器,使用项目1容器名称来说明它们是“重新创建的”,2.移除项目1容器,将其重命名为项目2容器。

电流设置

  • I创建了一个完整的Dockerfile项目,配置了docker-compose.yml和两个重写的docker -复合文件(docker-compose.website1.yml and
  • 创建了一个工作Dockerfile / docker-compose.yml项目完整副本,并创建了一个新文件夹:换句话说,这两个文件都将使用相同的停靠设置,但使用不同的docker-come.yml重写文件。/var/www/docker/site1 /var/www/docker/site2

问题

如何在同一个主机操作系统上为多个项目使用工作的docker-compose项目.而不替换另一个项目的容器。

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

docker-compose ps

代码语言:javascript
复制
               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的自定义配置文件,但是使用这种方法,我不能测试不同的微小设置。

不同的设置,可通过在“重写停靠-撰写文件”中引用另一个不同的图像来使用。

例如,我可以创建一个Dockerfile,它安装所有必需的php7.3库并在其上运行Magento2.3,然后有另一个Dockerfile来测试php7.4,还有另一个在PHP5.6安装上运行一个旧的Magento 1站点,等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-17 16:00:14

多亏了David Maze的建议,我在配置docker设置以处理多个项目方面做了进一步的努力。

基于码头的信息-compose v1.25.0 (2020年7月)

当您想要重用(持久化)您的容器(开始/停止而不仅仅是向上/向下删除)时,这种讨论特别重要。

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

陷阱

当前DOCKER-组合实现的缺陷:

如果您只对同一个folder中的文件使用带有不同container_names (按“项目”)的重写docker-compose*.yml

正如我在问题中所解释的,

docker-compose up将简单地替换现有的容器。

  1. 您可以执行以下操作:docker-compose -p CUSTOM_PROJECT_NAME -f file1.yml -f file2.yml up -d,但是:

本身是无用的-这些容器只有在您想要停止它们时才能工作。只要您想要执行docker-compose start (重新启动现有容器集),它就会在中失败

如果使用两个不同的文件夹(即克隆项目),则使用两个不同的文件夹(即克隆项目):例如,在docker-compose.*.yml file中使用container_name字段的./dc-project1 ./dc-project2

当您尝试在docker-compose -f f1.yml -f f2.yml up -d中运行和在./dc-project2文件夹中运行相同的./dc-project2文件夹时,您将得到以下错误:You have to remove (or rename) that container to be able to reuse that name

当您使用重写的文件时,您的

  1. 与Docker网络将发生类似的问题:删除了大多数自定义设置,以使网络设置更加清晰

docker-compose start网络将正确地从docker-compose up、上的重写文件中附加,但只要您想要,它就会查找默认的网络名称:在默认的docker-compose.yml中,甚至在存在的docker-compose.override.yml文件中。换句话说-它忽略了您的自定义停靠程序-编写重写文件(参见下面的示例):

docker-compose.yml**:**

代码语言:javascript
复制
   networks:
      network_frontend:
          name: stage6-network-frontend

customfolder/docker-compose.custom.yml**:**

代码语言:javascript
复制
   networks:
      network_frontend:
          name: magento2.3-network-frontend

解决方案

示例

目的:为了使docker-compose start/stop能够正确地使用多个设置(也称为项目/网站/工具),使用相同的对接者-组合项目。

假设您有以下docker-compose文件:

**主文件:** docker-compose.yml

代码语言:javascript
复制
   web_server:
       image: current_timezone/full-supervisord-web-server/php7.3:1.00
       container_name: web-server-apache2
       networks:
         - network_frontend
       build:
         context: "./all-services/"
         dockerfile: ./web-server/Dockerfile.webserver.apache2
         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
       name: stage6-network-frontend
       driver_opts:
         # Custom name for host-side network : for instance on Ubuntu : ip addr | ifconfig
  com.docker.network.bridge.name: docker-custom # Seems limit of 15 characters only

,然后是覆盖文件:customfolder/magento2.override.yml

代码语言:javascript
复制
     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

做以下工作:

  1. 将完整Docker项目(Dockerfiles/ADDs/docker-come.yml文件等)复制到一个新的单独文件夹中:

/var/docker/project1 /var/docker/project2

  1. 确保中的container_name条目在两个项目之间是唯一的。

  1. In project1 run docker-compose -f docker-compose.yml -f customfolder/magento2.override.yml up -d && docker-compose stop,导航到project2并执行相同的操作。

正如David所建议的那样,使用-p标志并不能独立工作,JSON文件仍然来源于./foldername on docker-compose start/stop

  1. 由于网络在start/stop上有类似的问题,在正确使用覆盖文件中定义的自定义名称之前,.不幸的是,您需要将主基docker-compose.yml更新为重写的文件!

扩展解释:无法从docker-compose start调用正确的自定义网络名称,因此由于docker忽略start上的重写文件,您需要确保更新基文件docker-compose.ymldocker-compose.override.yml具有您的自定义网络名称。

如果在使用up -d之前还没有更新名称,则需要替换每个/var/lib/docker/containers/*/config.v2.json的内容。

例如,您可以这样做:您必须先停止停靠。

sudo服务停靠停止查找/var/lib/ docker /

/ -type f -name "config.v2.json“-exec sed -i '{}‘\;sudo服务码头启动

如果操作正确,您应该有唯一的容器名称,并且现在可以正确地单独访问每个文件夹,而不会破坏彼此的容器:docker-compose start__、docker-compose stop__、

注意:您仍然需要导航到单独的文件夹来运行这些命令

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63262898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档