现在,我有一个静态站点在docker容器中运行,在端口80上提供服务。这很好用,因为80是公共流量的默认值。
因此,在我的/etc/hosts
文件中,我可以添加类似127.0.0.1 example.dev
的条目并导航到example.dev
,并自动使用端口80。
如果我需要在我的环境中添加额外的2-3个dockerized dev站点,该怎么办?什么是最好的行动方式,以防止必须通过港口,即81,82,83等访问这些网站?此外,在这些情况下,我似乎只能将仅绑定到端口80的开发站点重写为特定的主机名?有没有办法克服这个?从不同端口管理多个docker站点的最佳方法是什么?
注意,我希望通过容器的IP地址(即172.21.0.4
)访问docker容器,然后只需在我的hosts文件中添加一个主机名条目,但是按IP地址访问容器并不是“{1}}。在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-阿帕奇/ Dockerfile
FROM php:7-apache
COPY ./config/php.ini /usr/local/etc/php/
EXPOSE 80
提前致谢
答案 0 :(得分:1)
最好使用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上运行您的网站......
答案 1 :(得分:1)
基于问题中的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
环境变量。
如果您不想为每个网站使用带有子路径的反向代理,
您可以在主机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
请求不同的域名,而无需更改/etc/hosts
:
curl -H 'Host: example-2.dev' localhost
如果您正在进行网页开发,因此需要查看网页,则可以在每个网页请求时使用a browser extension to customize the Host header。
在您的所有文件中使用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:ro
使用apache virtual hosts以与nginx相同的方式设置多个网站。请务必启用the Apache ProxyPreserveHost Directive将Host
标头转发到代理服务器。