我的目标是让多个具有不同apache或PHP配置的站点/容器并排运行,并且可以由唯一的虚拟主机访问。这样,我可以根据需要在站点/客户端/容器之间快速切换。
我目前在本地开发网站和应用程序时使用LAMP。有时我需要安装额外的PHP软件包或在PHP版本之间切换。最近,我需要进行很多切换,甚至还需要安装需要Memcache的站点。我一直在研究使用Docker,我喜欢一个可以为每个项目保存的配置文件的想法,因此当客户端在6个月后回来时,我可以快速设置相同的环境。
我已经安装了Docker,并创建了一些容器来学习如何使用它。但是我在当前配置中遇到了一些问题。我的本地设置是:
我读了一堆教程,观看了几个小时的LinkedIn学习视频,并从WordPress设置开始,以快速确认MySql和Web容器是否正常工作。我发现了以下问题。
[从我读过的东西以及从docker-compose的学习中,我已经确定了以下配置。
Main NGINX docker-compose.yml
version: "3.1"
services:
# ngix so we can have multiple sites running with virtualhosts
nginx-proxy:
container_name: nginx
image: jwilder/nginx-proxy:alpine
ports:
- "80:80"
- "443:443"
#- "3305:3305"
#- "8025:8025"
extra_hosts:
- "dockerhost:192.100.10.3"
volumes:
- ./certs:/etc/nginx/certs
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: unless-stopped
# mailhog
mailhog:
container_name: mailhog
image: mailhog/mailhog
ports:
- 8025:8025 # web ui
environment:
VIRTUAL_PORT: 8025
expose:
- 8025
# stop here
networks:
default:
external:
name: nginx-proxy
Clients docker-compose.yml
version: '3.1'
# containers/ instances
services:
# wordpress container
wordpress:
container_name: clientname
image: wordpress:latest
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: mysqldb
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: wptest
VIRTUAL_HOST: docker-second-text.local
VIRTUAL_PORT: 80
volumes:
- ./wordpress:/var/www/html
expose:
- 80
- 443
# stop here
volumes:
wordpress: {}
networks:
default:
external:
name: nginx-proxy
回顾一下,两个配置文件正常工作。我可以使用不同的文件,数据库和主机名并排运行两个站点/ Web容器。什么是行不通的:
我愿意接受其他配置,任何建议都值得赞赏。同样,我的目标是让多个站点/容器具有不同的apache或PHP配置并排运行,并且可以由唯一的虚拟主机访问。
您无法同时使用apache和容器的原因是,您在docker-compose.yml中公开了端口。因此端口被阻塞。公开意味着您的容器将可以在hostIP:Port下访问,但是一个端口只能同时被一个应用程序使用。
我想,我正在运行您请求的设置。我将nginx用作安装在docker主机上的反向代理,以在subdmoains下公开不同的容器,例如。 app1.example.com,app2.example.com
我为容器使用了不同的docker网络,因此它们保持隔离状态。
首先创建外部docker网络:
docker network create --driver=bridge --subnet=192.168.1.0/29 --gateway=192.168.1.1 app1net
docker network create --driver=bridge --subnet=192.168.1.8/29 --gateway=192.168.1.9 app2net
如果需要,您可以使用较小或较大的蚊帐。不要忘了允许进出网络的流量通过您的主机防火墙。
样本docker-compose.yml:
version: '3.1'
services:
wordpress:
image: wordpress:5.3.2-php7.4-apache
restart: always
links:
- db:db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: Pa$$w0rd
WORDPRESS_DB_NAME: wordpressdb
WORDPRESS_TABLE_PREFIX: wp_
volumes:
- ./html:/var/www/html
networks:
app1net:
ipv4_address: 192.168.1.2
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- db:db
networks:
app1net:
ipv4_address: 192.168.1.3
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpressdb
MYSQL_USER: wordpress
MYSQL_PASSWORD: Pa$$w0rd
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./mysql:/var/lib/mysql
networks:
app1net:
ipv4_address: 192.168.1.4
networks:
app1net:
external:
name: app1net
可以从主机通过192.168.1.0/29网络访问不同的服务。
接下来配置nginx虚拟服务器,但您也可以将Apache用作代理:
NGINX代理:
server {
listen 1.2.3.4:80 http2;
listen 1.2.3.4:443 ssl http2;
server_name app1.example.com;
index index.php index.html index.htm;
ssl_certificate /ssl/sslcert.pem;
ssl_certificate_key /ssl/privkey.pem;
location / {
try_files $uri @wordpress;
}
location / {
try_files $uri @phpmyadmin;
}
location @wordpress{
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://192.168.1.2;
}
location @phpmyadmin{
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://192.168.1.3;
}
}
Apache2代理:
<VirtualHost 1.2.3.4:443>
ServerName app1.example.com
SSLEngine on
SSLHonorCipherOrder on
SSLCertificateFile /ssl/sslcert.pem
SSLCertificateKeyFile /ssl/privkey.pem
ProxyPreserveHost On
ProxyPass / http://192.168.1.2
ProxyPassReverse / http://192.168.1.2
</VirtualHost>
<VirtualHost 1.2.3.4:80>
ServerName app1.example.com
ProxyPreserveHost On
ProxyPass / http://192.168.1.2
ProxyPassReverse / http://192.168.1.2
</VirtualHost>
您可能必须在/etc/apache2/ports.conf下编辑apache默认配置,以设置侦听ip /端口或禁用apache complete。这就是为什么您不能同时运行两个服务器的原因。 Apache正在使用它们。但是,如果您使用apache作为代理,则不需要。
Listen 127.0.0.1:80
<IfModule ssl_module>
Listen 127.0.0.1:443
</IfModule>
<IfModule mod_gnutls.c>
Listen 127.0.0.1:443
</IfModule>
希望这有帮助...