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头转发到代理服务器。