同时运行多个基于Docker的项目,使用PHP、MySQL、nginx。

7

问题

我有一些使用相同配置(PHP、MySQL、nginx)的 docker-compose 项目。当我运行一个项目时,使用docker-compose up 没有任何问题,但是因为需要进行开发,我每天需要在这些项目之间进行切换。

存在的问题:

  • nginx 共享端口的配置
  • 默认数据库和连接的共享配置(名称和用户)
  • 每个项目的域名

我拥有

  • Docker for Mac - edge 版本

现在

目前只是每次运行 updown -v 命令来启动和停止容器。大多数情况下,这些项目都具有相同的 PHP 版本(应该如此)和 MySQL 版本。

想法

负载均衡器

其中一种想法是在主文件夹 workspace 中创建一个 docker-compose 配置,其中包含一些负载均衡器,它可以根据给定项目的规则生成域名,并将项目的卷作为主文件夹,还有一个 MySql 服务器和一些数据库 - 但这只是一个初步想法。

问题

什么解决方案适用于这种情况?

  • 提出任何结构或 Docker 配置来解决独立配置的问题吗?

更新

我的 docker-compose 文件

version: '2.1'

单服务器设置用于开发

services:
  app:
    image: ${PHP_IMAGE}
    volumes:
     - ${COMPOSE_DIR}/../../:/var/www:cached
     - ${COMPOSER_HOME}:/root/.composer:cached
    depends_on:
     - db
    environment:
     - SYMFONY_ENV=${SYMFONY_ENV-prod}
     - SYMFONY_DEBUG
     - SYMFONY_HTTP_CACHE
     - SYMFONY_HTTP_CACHE_CLASS
     - SYMFONY_TRUSTED_PROXIES
     - DATABASE_USER
     - DATABASE_PASSWORD
     - DATABASE_NAME
     - DATABASE_HOST=db

  web:
    image: ${NGINX_IMAGE}
    volumes_from:
     - app:ro
    ports:
     - "8080:80"
    environment:
     - SYMFONY_ENV=${SYMFONY_ENV-prod}
     - MAX_BODY_SIZE=20
     - FASTCGI_PASS=app:9000
     - TIMEOUT=190
     - DOCKER0NET
    command: /bin/bash -c "cd /var/www && cp -a doc/nginx/ez_params.d /etc/nginx && bin/vhost.sh --template-file=doc/nginx/vhost.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

  db:
    image: ${MYSQL_IMAGE}
    volumes:
     - ${COMPOSE_DIR}/entrypoint/mysql:/docker-entrypoint-initdb.d/:ro
    environment:
     - MYSQL_RANDOM_ROOT_PASSWORD=1
     - MYSQL_USER=$DATABASE_USER
     - MYSQL_PASSWORD=$DATABASE_PASSWORD
     - MYSQL_DATABASE=$DATABASE_NAME
     - TERM=dumb

考虑到这一点,正如我所说的,我希望能够在不同的PHP版本上运行多个项目。每个项目都有相同的nginx配置,然后需要有可能以容易且同时的方式运行它们。
理解@Vladimir Kovpak的答案,但手动操作将会产生大量的工作量。每个项目都有自己的docker-compose配置文件。
完美的情况应该是什么呢?
场景1:
- 进入项目,通过docker-compose正确构建 - 可以进行开发工作 - 可以通过一些动态域名访问页面 - 通过命令停止项目
场景2:
- 进入项目,通过docker-compose正确构建 - 进入其他项目,通过docker-compose正确构建 - 进入其他项目,通过docker-compose正确构建 - 可以进行开发工作 - 可以通过一些动态域名访问页面 - 通过命令停止项目
可以同时使用所有项目。第一步是提议 - 任何初始化和关闭都应该很好,因为不痛苦 - 应该快速且容易。

1
你可以做的一件事是为每个项目容器设置不同的端口集合。 - yahyazini
只是一个小提示:不要忘记设置多个虚拟主机,并注意在更改http/https协议时的端口冲突。我仍然不确定如果不是“主”域,而是多个子域以这种方式路由是否会起作用。 - Spears
只是一个更新 - 我刚开始使用docker-php(https://github.com/docker-php/docker-php),它允许您通过PHP代码控制容器(因此可编写脚本)。看起来很简单,但它会通过composer拉取很多库。 - Nigel Ren
2个回答

4
我开始使用 Portainer,一旦容器设置完成,它就有一个网页,允许您启动、停止和管理运行的容器。
Portainer 本身是一个 Docker 机器,所以我在机器启动时启动它,然后在 Web 浏览器中,我可以看到已经设置好的 MySQL、PHP 和 phpmyadmin 容器。您可以单独启动和停止它们,并通过浏览器执行机器控制台。
浏览器还显示您的机器使用统计信息、IP 地址和端口转发详细信息,因此您的浏览器中有大量有用的信息。
最后,它还允许您远程管理 Docker 机器,因此我已经在我的桌面上设置了 Docker,并且可以管理笔记本电脑上的容器。

我在考虑构建类似的东西。我一定会查看这个。谢谢。 - yahyazini
这看起来非常有趣,但需要测试一下是否真的能解决我的问题。 - timiTao
谢谢,我认为这是最接近我期望解决方案的。 - timiTao

4

对于 nginx
你可以指定不同的端口,例如:

docker run -ti --name nginx-1 -p 8081:80 nginx:latest
docker run -ti --name nginx-2 -p 8082:80 nginx:latest

或者在nginx配置中您可以指定不同的server_name,例如:

nginx-1 -> server_name one.dev;
nginx-2 -> server_name two.dev;

为了让 mysql 更加简单:

您可以像使用 nginx 一样使用不同的端口
或者不同的 主机名

docker run -it --rm -p 3308:3306 --name mysql-1 --hostname mysql-1 mysql:latest
docker run -it --rm -p 3308:3306 --name mysql-2 --hostname mysql-2 mysql:latest

你可以使用一个MySQL,但是拥有不同的数据库或不同的用户...
对于负载均衡: 你可以使用haproxy,并进行如下配置:
# nginx
mode tcp
balance roundrobin
server nginx-1 localhost:8081 check port 8081 inter 1000
server nginx-2 localhost:8082 check port 8082 inter 1000
# mysql
# etc

PS:我提供的示例不是docker-compose格式,但我希望你能理解大意……希望将这些命令转换为docker-compose格式并不难。


我在Docker方面经验不是很丰富 - 我感觉你的回答并不能很好地适应我的docker-compose配置。我已经更新了我的问题。 - timiTao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接