我的目标是让多个站点/容器具有不同的apache或PHP配置并排运行,并且可以由唯一的虚拟主机访问。这样,我可以根据需要在站点/客户端/容器之间快速切换。
我目前在本地开发网站和应用程序时使用LAMP。有时我需要安装额外的PHP软件包或在PHP版本之间切换。最近,我需要进行很多切换,甚至还需要安装需要Memcache的站点。我一直在研究使用Docker,我喜欢这样的想法,即可以为每个项目保存一个配置文件,因此当客户端在6个月后回来时,我可以快速设置相同的环境。
我已经安装了Docker,并创建了一些容器来学习如何使用它。但是我在当前配置中遇到了一些问题。我的本地设置是:
我读了一堆教程,观看了几个小时的LinkedIn学习视频,并从WordPress设置开始,以快速确认MySql和Web容器是否正常工作。我发现了以下问题。
通过阅读和使用docker-compose,我确定了以下配置。
主要的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
客户端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>
希望这可以帮助...
关于mysql - 使用Docker进行本地Web开发的HTTPS和MySql问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59989428/