Docker不同端口上的多个站点
现在,我有一个静态站点在docker集装箱中运行,在端口80上运行。这很好玩,因为80是公共交通的默认设置。
因此,在我的/etc/hosts
文件中,我可以添加一个条目,如127.0.0.1 example.dev
并导航到example.dev
,并自动使用端口80。
如果我需要为我的环境添加额外的2-3个dockerized dev网站,该怎么办? 最好采取什么行动来防止仅通过港口访问这些网站,即81,82,83等? 另外,似乎在这种情况下,我将仅限于能够将与端口80绑定的开发站点重写为特定的主机名? 有没有办法解决这个问题? 从不同端口pipe理多个docker站点的最佳方式是什么?
请注意,我希望通过容器的IP地址(即172.21.0.4
访问docker容器,然后只需将一个主机名添加到我的主机文件,但通过IP地址访问容器在Mac上不起作用。
泊坞窗,compose.yml
version: '3' services: mysql: container_name: mysql build: ./mysql environment: - MYSQL_DATABASE=example_dev - MYSQL_USER=test - MYSQL_PASSWORD=test - MYSQL_ROOT_PASSWORD=0000 ports: - 3307:3306 phpmyadmin: container_name: myadmin image: phpmyadmin/phpmyadmin ports: - 8080:80 links: - "mysql:db" apache_site1: container_name: apache_site1 build: ./php-apache ports: - 80:80 volumes: - ../:/var/www/html links: - mysql:db
./php-apache/Dockerfile
FROM php:7-apache COPY ./config/php.ini /usr/local/etc/php/ EXPOSE 80
提前致谢
您的问题最好使用反向代理(如nginx)来处理 。 您可以在端口80上运行反向代理,然后将其configuration为将请求路由到特定站点。 例如,
http://example.dev/site1 route to site1 at http://example.dev:8080 http://example.dev/site2 route to site2 at http://example.dev:8081
因此,您在端口8080,8081上运行您的网站…
具体解决scheme
根据问题中的docker-compose文件。 编辑docker-compose.yml
文件,添加这个服务:
nginx-proxy: image: jwilder/nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro
然后,以这种方式更改apache_site1
服务:
apache_site1: container_name: apache_site1 build: ./php-apache volumes: - ../:/var/www/html links: - mysql:db environment: - VIRTUAL_HOST=apache-1.dev
运行docker-compose文件并检查您的apache-1网站是否可以访问:
curl -H 'Host: apache-1.dev' localhost
或者使用Chrome扩展程序,如下所述。
更多的网站
当您需要添加更多网站时,只需添加一个apache_site2
条目,并确保在其定义中设置VIRTUAL_HOST
环境variables。
通用解决scheme
使用单个nginx与多个服务器条目
如果您不想为每个网站使用具有子path的反向代理,则可以设置一个监听主机80
端口的nginx反向代理,并为每个站点/容器分配一个server
条目。
server { listen 80; server_name example-1.dev; location / { proxy_pass http://website-1-container:port; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name example-2.dev; location / { proxy_pass http://website-2-container:port; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ... and so on
然后,您可以使用Host
头向localhost
Host
请求不同的域,而无需更改/etc/hosts
:
curl -H 'Host: example-2.dev' localhost
如果您正在进行Web开发,并且需要查看网页,则可以使用浏览器扩展来在每个页面请求中定制Host标头 。
已经用nginx和docker服务做了解决scheme
使用docker -compose文件,并使用jwilder / nginx-proxy映像,它将使用环境variables自动为您configuration一个nginx代理。 这是一个示例docker-compose.yml
文件:
version: "3" services: website-1: image: website-1:latest environment: - VIRTUAL_HOST=example-1.dev website-2: image: website-2:latest environment: - VIRTUAL_HOST=example-2.dev nginx-proxy: image: jwilder/nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro
Apache解决scheme
使用apache虚拟主机以与nginx相同的方式设置多个网站。 确保启用Apache ProxyPreserveHost指令将Host
头转发到代理服务器。