在我的Mac上,我使用流浪汉运行Ubuntu和apache,并为我的各种代码存储库提供虚拟主机条目。在OSX方面,我为每个v-host条目创建/ etc / hosts条目。
我试图用docker实现相同的效果,但是我在努力解决它而不必在访问应用程序时指定端口号,我不想这样做。例如:我的/ etc / hosts中有127.0.0.1 dockertest.com
,然后可以访问http://dockertest.com:8080
。我希望能够在没有指定端口的情况下去http://dockertest.com
。我怎样才能做到这一点?我知道端口号不能在/ etc / hosts文件中使用,所以我正在寻找一种可以模仿效果的方法。我需要能够同时运行多个docker应用程序,因为一些代码库彼此通信并且每个代码库都需要有自己唯一的主机名,所以我不认为只是在docker-compose文件中将端口设置为80:80
将工作,因为每个应用程序将(尝试)在127.0.0.1:80
上运行。
对于上下文,我跟着this tutorial在docker上运行apache,php和mysql。我的所有文件都与该网站上显示的完全一致。
更新
我用以下502 Bad Gateway
文件得到docker-compose.yml
nginx错误。
version: "3.3"
services:
php:
build: './php/'
networks:
- backend
volumes:
- ./public_html/:/var/www/html/
apache:
build: './apache/'
depends_on:
- php
- mysql
networks:
- frontend
- backend
volumes:
- ./public_html/:/var/www/html/
environment:
- VIRTUAL_PORT=3000
- VIRTUAL_HOST=dockertest.com
mysql:
image: mysql:5.6.40
networks:
- backend
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- 80:80
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
frontend:
backend:
更新2
解决了'502 Bad Gateway'错误,这是更新的docker-compose.yml
文件。我不得不将nginx-proxy添加到我引用的其中一个网络中。我的问题没有完全解决,但我确实有一部分工作。对于读这个寻找解决方案的人,我创建了另一个问题here,以防止这个问题变得太长。
version: "3.3"
services:
php:
build: './php/'
networks:
- backend
volumes:
- ./public_html/:/var/www/html/
apache:
build: './apache/'
depends_on:
- php
- mysql
networks:
- frontend
- backend
volumes:
- ./public_html/:/var/www/html/
environment:
- VIRTUAL_HOST=dockertest.com
mysql:
image: mysql:5.6.40
networks:
- backend
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
nginx-proxy:
image: jwilder/nginx-proxy
networks:
- backend
ports:
- 80:80
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
frontend:
backend:
你可以使用jwilder/nginx-proxy,它是由其他容器的env vars自动配置的反向代理,因此你不需要手动编写nginx代理配置。同样根据要求,它允许使用特定端口转发请求。
# docker-compose.yml
version: '3.3'
services:
lamp:
environment:
VIRTUAL_HOST: some_domain.dev
VIRTUAL_PORT: 9999
image: my_lamp_image
app:
environment:
VIRTUAL_HOST: another_domain.dev
VIRTUAL_PORT: 3000
image: my_app_image
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- 80:80
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
# /etc/hosts
127.0.0.1 some_domain.dev
127.0.0.1 another_domain.dev
jwilder/nginx-proxy
有许多更好的功能,如ssl,uwsgi,fastcgi,也可以用于生产。还有像let's encrypt ssl和man in the middle proxy这样的“伴侣”补充。
看起来您的apache服务器在容器内的端口80上运行。如果你想在你的/ etc / hosts条目之外使用dockertest.com
,那么你也必须在外面使用端口80。
/etc/hosts
条目-p 80:80
or运行它ports:
- "80:80"
一种可能性是将所有应用程序设置在单独的容器中,然后通过docker network连接它们。
为了到达所有容器,我建议将nginx webserver容器作为反向代理添加到网络中,然后可以将其绑定到计算机的端口80。
然后,您可以单独为每个应用程序定义location
,也可以定义一个通用位置
# sample.conf
server {
listen 80 default_server;
server_name ~ (?<docker_host_name>.+);
location ~ {
# for actual request forwarding
proxy_pass http://$docker_host_name$1$is_args$args;
# some stuff I figured out I have to use in order for service to work properly
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
此配置必须内嵌在原始/etc/nginx/nginx.conf
中,或者放在http
配置块中包含的单独文件中。
重新启动nginx服务或容器后(取决于容器设置),您应该能够访问docker网络内的所有服务,并且所有服务应该能够相互通信而不会出现问题。
当然,您仍然必须将条目保留在hosts文件中,因此您的计算机知道它必须在本地处理请求。
原始配置(可能)不会执行它应该执行的操作。所以,我想出了一个更新的版本,它应该完成工作:
# sample.conf
server {
listen 80 default_server;
location ~ {
# for actual request forwarding
proxy_pass http://$host$1$is_args$args;
# some stuff I figured out I have to use in order for service to work properly
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
使用此配置,nginx服务器将侦听端口80上的所有传入请求,并将它们转发到网络内的适当容器。您也不必自己配置主机解析,因为docker容器名称也代表容器的主机(-name)。
希望这对你有用。