Docker:具有公共容器的多个站点

时间:2017-05-06 18:27:05

标签: docker docker-compose reverse-proxy

我正在创建投资组合,我想在DigitalOcean Droplet上运行我的所有网站。我在新项目中使用PHP7,但是一些旧的只使用PHP5。当我在寻找如何运行多个版本时,我找到了Docker平台。

让我们考虑几个网站:

  • 网站1 - > PHP5,MySQL
  • 网站2 - > PHP7,MySQL
  • 网站3 - > PHP7,Redis

在创建独立容器的典型方法中,将有两个MySQL和两个PHP7实例,但是对于我的小型服务器,我负担不起。站点不必隔离,因此他们应该使用公共容器来消耗更少的内存。这是目标架构: target architecture

目前我想出了这个:

php5.6/
    src/
        site1/ #site1 files
            ...
    sites-available/ #virtual hosts for php5.6
        site1.conf
    a2ensites.sh #script enabling all sites
    Dockerfile
php7.1/
    src/
        site2/ #site2 files
            ...
        site3/ #site3 files
            ...
    sites-available/ #virtual hosts for php7.1
        site2.conf
        site3.conf
    a2ensites.sh #script enabling all sites
    Dockerfile
docker-compose.yml

搬运工-compose.yml:

version: '2'
services:
  redis:
    image: redis:3.0.7
    ports:
      - 6379
  mysql:
    image: mysql:5.7
    ports:
      - 3306
    volumes:
      - /var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secretpass
  php5.6:
    build: ./php5.6
    ports:
      - 8001:80
    volumes:
      - ./php5.6/src:/var/www/html
  php7.1:
    build: ./php7.1
    ports:
      - 8002:80
    volumes:
      - ./php7.1/src:/var/www/html

  site1:
    image: tianon/true #minimal image
    depends_on:
      - php5.6
      - mysql
  site2:
    image: tianon/true #minimal image
    depends_on:
      - php7.1
      - mysql
  site3:
    image: tianon/true #minimal image
    depends_on:
      - php7.1
      - redis

php5.6 / Dockerfile:

FROM php:5.6-apache

RUN a2enmod rewrite \
    && docker-php-ext-install pdo pdo_mysql mysql

EXPOSE 80

ADD ./sites-available /etc/apache2/sites-available/

COPY a2ensites.sh /a2ensites.sh
RUN /a2ensites.sh && rm /a2ensites.sh

php5.6 /位点可用/ site1.conf:

<VirtualHost *:80>
    ServerName site1.dev
    DocumentRoot /var/www/html/site1
    <Directory "/var/www/html/site1">
        Options -Indexes
        AllowOverride All
    </Directory>
</VirtualHost>

您可以从repo获取所有文件并自行测试。

现在我可以使用 localhost:8001 / site localhost:8001 / site2 localhost:8002 / site3 访问所有三个站点,但我希望它可以在 site1.dev site2.dev site3.dev 上工作。我怎么能这样做?

编辑:我想我应该在端口80上创建反向代理容器,但目前我还不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

最后,我设法用jwilder/nginx-proxy做到了。您可以从我的repository获取完整代码。

<强>搬运工-compose.yml:

version: '2'
services:
  # Reverse proxy
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

  # Services
  redis:
    image: redis:3.0.7
    ports:
      - 6379
  mysql:
    image: mysql:5.7
    ports:
      - 3306
    volumes:
      - /var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secretpass
  php5.6:
    build: ./php5.6
    ports:
      - 8001:80
    volumes:
      - ./php5.6/src:/var/www/html
    environment:
      - VIRTUAL_HOST=site1.dev
  php7.1:
    build: ./php7.1
    ports:
      - 8002:80
    volumes:
      - ./php7.1/src:/var/www/html
    environment:
      - VIRTUAL_HOST=site2.dev,site3.dev

  # Sites
  site1:
    image: tianon/true #minimal image
    depends_on:
      - nginx-proxy
      - php5.6
      - mysql
  site2:
    image: tianon/true #minimal image
    depends_on:
      - nginx-proxy
      - php7.1
      - mysql
  site3:
    image: tianon/true #minimal image
    depends_on:
      - nginx-proxy
      - php7.1
      - redis

我还在/etc/hosts/添加了以下行:

 127.0.0.1   site1.dev
 127.0.0.1   site2.dev
 127.0.0.1   site3.dev

现在我可以使用friendly-urls访问网站了。