子域、Nginx-proxy 和 Docker-compose
Subdomains, Nginx-proxy and Docker-compose
我正在寻找一种方法来配置 Nginx 以通过我服务器的子域访问托管服务。这些服务和 Nginx 使用 Docker-compose.
实例化
简而言之,当输入 jenkins.192.168.1.2
时,我应该访问托管在 192.168.1.2
上的 Jenkins,并使用 Nginx 代理重定向。
快速浏览一下我目前拥有的东西。它在没有顶级域名的情况下不起作用,因此它在play-with-docker.com上工作正常,但在本地不工作,例如192.168.1.2.
server {
server_name jenkins.REVERSE_PROXY_DOMAIN_NAME;
location / {
proxy_pass http://jenkins:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
看看我想要什么:https://github.com/Ivaprag/devtools-compose
我的总体目标是在不修改客户端 DNS 服务的情况下访问远程 docker 容器。
不幸的是,nginx 不支持这样的 IP 地址上的子域。
您要么必须修改客户端主机文件(您说您不想这样做)...
或者你可以像这样设置你的nginx重定向:
location /jenkins {
proxy_pass http://jenkins:8080;
...
}
location /other-container {
proxy_pass http://other-container:8080;
}
这将允许您在 192.168.1.2/jenkins
访问 jenkins
或您可以尝试通过不同的端口为不同的容器提供服务。例如:
server {
listen 8081;
location / {
proxy_pass http://jenkins:8080;
...
}
}
server {
listen 8082;
location / {
proxy_pass http://other-container:8080;
...
}
}
然后从 192.168.1.2:8081/
访问 jenkins
如果您已经在使用 docker-compose,我建议您使用 jwilder nginx-proxy 容器。
https://github.com/jwilder/nginx-proxy
这允许您向定义的 nginx 代理的后端添加无限数量的 Web 服务容器,例如:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- "/etc/nginx/vhost.d"
- "/usr/share/nginx/html"
- "/var/run/docker.sock:/tmp/docker.sock:ro"
- "nginx_certs:/etc/nginx/certs:rw"
nginx:
build:
context: ./docker/nginx/
dockerfile: Dockerfile
volumes_from:
- data
environment:
VIRTUAL_HOST: www.host1.com
nginx_2:
build:
context: ./docker/nginx_2/
dockerfile: Dockerfile
volumes_from:
- data
environment:
VIRTUAL_HOST: www.host2.com
apache_1:
build:
context: ./docker/apache_1/
dockerfile: Dockerfile
volumes_from:
- data
environment:
VIRTUAL_HOST: www.host3.com
nginx-proxy 挂载主机 docker sock 文件以获取有关其他容器的信息 运行,如果它们中的任何一个设置了 env 变量 VIRTUAL_HOST 则它会将其添加到其配置中。
我试图在 nginx(主机)中为一个 LXC 容器中的两个虚拟主机配置子域。
它对我有用的方式:
对于 apache(在容器中),我创建了两个虚拟主机:一个在端口 80,另一个在端口 90。
要在 apache2(容器)中启用端口 90,必须在 /etc/apache2/ports.conf
中的 "Listen 80" 下面添加行 "Listen 90"
对于 NGINX(主机),配置了两个域,都在端口 80 中创建独立的 .conf 文件 /etc/nginx/sites-available。为 /etc/nginx/sites-enabled 的每个文件创建符号 link。
在第一个 NGINX myfirstdomain.conf 文件中,重定向到 http://my.contai.ner.ip:80。
在第二个 NGINX myseconddomain.conf 文件中,重定向到 http://my.contai.ner.ip:90
我就是这样!
我正在寻找一种方法来配置 Nginx 以通过我服务器的子域访问托管服务。这些服务和 Nginx 使用 Docker-compose.
实例化简而言之,当输入 jenkins.192.168.1.2
时,我应该访问托管在 192.168.1.2
上的 Jenkins,并使用 Nginx 代理重定向。
快速浏览一下我目前拥有的东西。它在没有顶级域名的情况下不起作用,因此它在play-with-docker.com上工作正常,但在本地不工作,例如192.168.1.2.
server {
server_name jenkins.REVERSE_PROXY_DOMAIN_NAME;
location / {
proxy_pass http://jenkins:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
看看我想要什么:https://github.com/Ivaprag/devtools-compose
我的总体目标是在不修改客户端 DNS 服务的情况下访问远程 docker 容器。
不幸的是,nginx 不支持这样的 IP 地址上的子域。
您要么必须修改客户端主机文件(您说您不想这样做)...
或者你可以像这样设置你的nginx重定向:
location /jenkins {
proxy_pass http://jenkins:8080;
...
}
location /other-container {
proxy_pass http://other-container:8080;
}
这将允许您在 192.168.1.2/jenkins
或您可以尝试通过不同的端口为不同的容器提供服务。例如:
server {
listen 8081;
location / {
proxy_pass http://jenkins:8080;
...
}
}
server {
listen 8082;
location / {
proxy_pass http://other-container:8080;
...
}
}
然后从 192.168.1.2:8081/
如果您已经在使用 docker-compose,我建议您使用 jwilder nginx-proxy 容器。
https://github.com/jwilder/nginx-proxy
这允许您向定义的 nginx 代理的后端添加无限数量的 Web 服务容器,例如:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- "/etc/nginx/vhost.d"
- "/usr/share/nginx/html"
- "/var/run/docker.sock:/tmp/docker.sock:ro"
- "nginx_certs:/etc/nginx/certs:rw"
nginx:
build:
context: ./docker/nginx/
dockerfile: Dockerfile
volumes_from:
- data
environment:
VIRTUAL_HOST: www.host1.com
nginx_2:
build:
context: ./docker/nginx_2/
dockerfile: Dockerfile
volumes_from:
- data
environment:
VIRTUAL_HOST: www.host2.com
apache_1:
build:
context: ./docker/apache_1/
dockerfile: Dockerfile
volumes_from:
- data
environment:
VIRTUAL_HOST: www.host3.com
nginx-proxy 挂载主机 docker sock 文件以获取有关其他容器的信息 运行,如果它们中的任何一个设置了 env 变量 VIRTUAL_HOST 则它会将其添加到其配置中。
我试图在 nginx(主机)中为一个 LXC 容器中的两个虚拟主机配置子域。
它对我有用的方式:
对于 apache(在容器中),我创建了两个虚拟主机:一个在端口 80,另一个在端口 90。
要在 apache2(容器)中启用端口 90,必须在 /etc/apache2/ports.conf
对于 NGINX(主机),配置了两个域,都在端口 80 中创建独立的 .conf 文件 /etc/nginx/sites-available。为 /etc/nginx/sites-enabled 的每个文件创建符号 link。
在第一个 NGINX myfirstdomain.conf 文件中,重定向到 http://my.contai.ner.ip:80。
在第二个 NGINX myseconddomain.conf 文件中,重定向到 http://my.contai.ner.ip:90
我就是这样!