【发布时间】:2020-08-05 10:08:54
【问题描述】:
我有一个大型 Docker 项目,其 Dockerfiles for nginx, apache2, varnish, redis 经过数周的更改和测试后配置并运行良好。
我现在正在设置项目以使用 docker-compose 和 override.yml 文件以便于设置:
我正在尝试对多个项目(网站)使用相同的 docker-compose 设置
正常启动(使用docker-compose.yml and optional 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
忽略它们是 0 号出口这一事实 - 我使用 docker-compose stop, the containers work fine 阻止了它们
nginx-proxy /usr/bin/supervisord 退出 0
redis-cache /usr/bin/supervisord 退出 0
清漆缓存 /usr/bin/supervisord 退出 0
web-server-apache2 /usr/bin/supervisord 退出 0
现在我想要一个第二个项目(网站)来使用相同的 docker/docker-compose 配置设置:
docker-compose -f docker-compose.yml -f anothercustomfolder/docker-compose.website2.yml up -d
令我惊讶的是 docker-compose 重新创建了容器并且不创建新的容器集:
请参阅“当前设置”部分了解我如何设置。
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 个容器。
当前设置
- 我创建了一个完整的 Dockerfile 项目,配置了 docker-compose.yml 和两个覆盖 docker-compose 文件 (
docker-compose.website1.yml anddocker-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 文件”中引用另一个不同的图像来使用不同的设置
例如,我可以创建一个 Dockerfile 来安装 所需的所有 php7.3 库并在其上运行 Magento 2.3,然后有另一个 Dockerfile 来 测试 php7.4,并运行另一个PHP5.6 安装上的旧 Magento 1 站点等等。
【问题讨论】:
-
只是想看看是否有人对使用具有相同 docker-compose 项目配置的多个项目有建议
-
你是从同一个目录运行这一切吗?您是否设置了
COMPOSE_PROJECT_NAME环境变量?您是否覆盖了docker-compose.yml文件中的container_name:? -
我想我是从两个不同的文件夹运行它的。将看看
COMPOSE_PROJECT_NAME,对此不确定 - 构建我将使用docker-compose build --no-cache --build-arg ARG_I_NEED=val并用于创建容器:(具有覆盖值)docker-compose -f docker-compose.yml -f docker-compose.overrides/docker-override-webserver1.yml up -d -
参考您刚刚提供的关于
container_name的其他答案,是的,我愿意:This docker question -
是的,
docker-compose -p和$COMPOSE_PROJECT_NAME做同样的事情。您需要记住将-p选项提供给 everydocker-compose命令。
标签: docker docker-compose dockerfile