我有一个大型的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
让我感到意外的是,我并不创建一个新的容器集,而是创建重新创建的容器,这让我感到意外:
关于我是如何设置东西的,请参见“当前安装”一节.
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时:
注意:名称与上面的不一样(这是第二个测试设置)
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容器。
电流设置
docker-compose.website1.yml and /var/www/docker/site1 /var/www/docker/site2问题
如何在同一个主机操作系统上为多个项目使用工作的docker-compose项目.而不替换另一个项目的容器。
我希望能够同时看到(同时使用),例如能够看到:忽略这里的端口是相同的事实,我知道它们不会同时运行,我将在此工作时更新项目docker-come.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的自定义配置文件,但是使用这种方法,我不能测试不同的微小设置。
不同的设置,可通过在“重写停靠-撰写文件”中引用另一个不同的图像来使用。
例如,我可以创建一个Dockerfile,它安装所有必需的php7.3库并在其上运行Magento2.3,然后有另一个Dockerfile来测试php7.4,还有另一个在PHP5.6安装上运行一个旧的Magento 1站点,等等。
发布于 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将简单地替换现有的容器。
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。
当您使用重写的文件时,您的
docker-compose start网络将正确地从docker-compose up、上的重写文件中附加,但只要您想要,它就会查找默认的网络名称:在默认的docker-compose.yml中,甚至在存在的docker-compose.override.yml文件中。换句话说-它忽略了您的自定义停靠程序-编写重写文件(参见下面的示例):
docker-compose.yml**:**
networks:
network_frontend:
name: stage6-network-frontendcustomfolder/docker-compose.custom.yml**:**
networks:
network_frontend:
name: magento2.3-network-frontend解决方案
示例
目的:为了使docker-compose start/stop能够正确地使用多个设置(也称为项目/网站/工具),使用相同的对接者-组合项目。
假设您有以下docker-compose文件:
**主文件:** docker-compose.yml
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
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做以下工作:
/var/docker/project1 /var/docker/project2
container_name条目在两个项目之间是唯一的。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
start/stop上有类似的问题,在正确使用覆盖文件中定义的自定义名称之前,.不幸的是,您需要将主基docker-compose.yml更新为重写的文件!扩展解释:无法从
docker-compose start调用正确的自定义网络名称,因此由于docker忽略start上的重写文件,您需要确保更新基文件docker-compose.yml或docker-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__、
注意:您仍然需要导航到单独的文件夹来运行这些命令
https://stackoverflow.com/questions/63262898
复制相似问题