Docker-重用不同项目的Docker compose配置
我有一个大型Docker项目,在经过数周的更改和测试后,配置了针对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 自定义启动(
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