Docker:具有通用容器的多个站点
Docker: multiple sites with common containers
我正在创建作品集,我想 运行 我的所有网站都在 DigitalOcean Droplet 上。我在新项目中使用 PHP7,但一些旧项目只能使用 PHP5。当我在寻找如何 运行 多个版本时,我找到了 Docker 平台。
让我们考虑几个站点:
- 站点 1 -> PHP5、MySQL
- 站点 2 -> PHP7、MySQL
- 站点 3 -> PHP7,Redis
在创建独立容器的典型方法中,将有两个 MySQL 和两个 PHP7 实例,但对于我的小型服务器,我负担不起。站点不必隔离,因此它们应该使用公共容器来消耗更少的内存。这是目标架构:
目前我想到了这个:
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
docker-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/Docker文件:
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/sites-available/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 上创建反向代理容器,但目前我不知道具体怎么做。
我终于用 jwilder/nginx-proxy
做到了。您可以从我的 repository.
获取完整代码
docker-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
现在我可以访问具有友好 url 的站点。
我正在创建作品集,我想 运行 我的所有网站都在 DigitalOcean Droplet 上。我在新项目中使用 PHP7,但一些旧项目只能使用 PHP5。当我在寻找如何 运行 多个版本时,我找到了 Docker 平台。
让我们考虑几个站点:
- 站点 1 -> PHP5、MySQL
- 站点 2 -> PHP7、MySQL
- 站点 3 -> PHP7,Redis
在创建独立容器的典型方法中,将有两个 MySQL 和两个 PHP7 实例,但对于我的小型服务器,我负担不起。站点不必隔离,因此它们应该使用公共容器来消耗更少的内存。这是目标架构:
目前我想到了这个:
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
docker-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/Docker文件:
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/sites-available/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 上创建反向代理容器,但目前我不知道具体怎么做。
我终于用 jwilder/nginx-proxy
做到了。您可以从我的 repository.
docker-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
现在我可以访问具有友好 url 的站点。