现在,我有一个运行在docker容器中的静态站点,在端口80上提供服务。这很好用,因为80是公共交通的默认值。
因此,在我的/etc/hosts文件中,我可以添加一个条目,比如127.0.0.1 example.dev并导航到example.dev,它会自动使用端口80。
如果我需要向我的环境中添加额外的2-3个停靠的开发站点,该怎么办?要避免仅通过端口访问这些站点,例如81、82、83等,最佳的行动方案是什么?而且,在这种情况下,我似乎只能将绑定到端口80的开发站点重写为特定的主机名?有没有办法克服这个问题?从不同端口管理多个扩展坞站点的最佳方式是什么?
注意,我希望通过容器的IP地址访问docker容器,即172.21.0.4,然后简单地将主机名项添加到我的主机文件中,但是通过IP地址访问容器在Mac上不起作用。
docker-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提前感谢
发布于 2017-09-04 23:38:11
您的问题最好使用反向代理来处理,例如nginx。您可以在端口80上运行反向代理,然后将其配置为将请求路由到特定站点。例如,
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上运行你的站点...
发布于 2017-09-05 00:11:50
具体解决方案
基于问题中的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环境变量。
通用解决方案
使用具有多个服务器条目的单个nginx
如果你不想为每个网站使用一个带有子路径的反向代理,你可以设置一个nginx反向代理监听你的主机80端口,每个站点/容器都有一个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请求不同的域,而无需更改/etc/hosts
curl -H 'Host: example-2.dev' localhost如果您正在进行web开发,因此需要查看web页面,则可以在每个页面请求时使用a browser extension to customize the Host header。
已经使用nginx和docker服务实现了解决方案
对所有的都使用docker-compose文件,并使用jwilder/nginx-proxy镜像,该镜像将使用环境变量为您自动配置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:roApache解决方案
使用apache virtual hosts设置多个网站,方法与nginx相同。确保启用the Apache ProxyPreserveHost Directive将Host报头转发到代理服务器。
https://stackoverflow.com/questions/46040152
复制相似问题