如何使 nginx docker 容器可通过代理访问?
How to make ngnix docker containers accessible through proxy?
假设我有三个 docker 个装有 nginx 的容器。它们的暴露端口分别映射到 8080、8181 和 8282。我想在 8080 上配置服务器,它将 /example01 和 /example02 代理到其他两个应用程序。这是我的配置文件:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
}
location /example01 {
proxy_pass http://localhost:8181/;
}
location /example02 {
proxy_pass http://localhost:8282/;
}
}
因此,如果我 运行 个容器,则每个应用程序都可以访问 (http://localhost:8080, http://localhost:8181 and http://localhost:8282)。
现在,我真的不明白为什么 http://localhost:8080/example01 and http://localhost:8080/example02 没有正确重定向。相反,我收到 502 错误网关错误。是不是和我暴露的端口和VIRTUAL_PORT有关?
提前致谢。
这是因为容器网络范围。这些容器的 localhost
分别位于每个容器内 - 这不是您的端口映射到的位置。相反:
$ ifconfig
在您的主机上找到您的本地 IP 地址并将流量代理到您的主机 - 已映射端口。
配置文件:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
}
location /example01 {
proxy_pass http://192.168.1.2:8181/;
}
location /example02 {
proxy_pass http://192.168.1.2:8282/;
}
}
其中 192.168.1.2
是您自己机器的本地 ip 地址。
另一种方法是 link 这些容器,而不是通过本地主机代理 - 但是您在 link 定义中提供的别名。如果你选择这种方法,我可以详细说明。
-- 用linking 方法编辑--
为了让您的服务 linked,您需要使用 docker 工具 docker-compose
。假设您熟悉它是什么(底部的 doc refs),您可以像这样编写一个 compose 文件:
first-nginx:
build: first-nginx/
ports:
- 8080:80
links:
- second-nginx
- third-nginx
second-nginx:
build: second-nginx/
ports:
- 8081:80
third-nginx:
build: third-nginx/
ports:
- 8082:80
像这样放在你项目的根目录下:
root
- first-nginx
+ nginx.conf
+ Dockerfile
+ some-other.files
- second-nginx
+ some.files
+ another-nginx.conf
+ Dockerfile
- third-nginx
+ some-nginx.conf
+ Dockerfile
+ docker-compose.yml
然后您将 "main" nginx 配置为使用创建的 links,如下所示:
配置文件:
server {
listen 80;
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
}
location /example01 {
proxy_pass http://second-nginx/;
}
location /example02 {
proxy_pass http://third-nginx/;
}
}
有什么不明白的地方一定要问。
假设我有三个 docker 个装有 nginx 的容器。它们的暴露端口分别映射到 8080、8181 和 8282。我想在 8080 上配置服务器,它将 /example01 和 /example02 代理到其他两个应用程序。这是我的配置文件:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
}
location /example01 {
proxy_pass http://localhost:8181/;
}
location /example02 {
proxy_pass http://localhost:8282/;
}
}
因此,如果我 运行 个容器,则每个应用程序都可以访问 (http://localhost:8080, http://localhost:8181 and http://localhost:8282)。
现在,我真的不明白为什么 http://localhost:8080/example01 and http://localhost:8080/example02 没有正确重定向。相反,我收到 502 错误网关错误。是不是和我暴露的端口和VIRTUAL_PORT有关?
提前致谢。
这是因为容器网络范围。这些容器的 localhost
分别位于每个容器内 - 这不是您的端口映射到的位置。相反:
$ ifconfig
在您的主机上找到您的本地 IP 地址并将流量代理到您的主机 - 已映射端口。
配置文件:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
}
location /example01 {
proxy_pass http://192.168.1.2:8181/;
}
location /example02 {
proxy_pass http://192.168.1.2:8282/;
}
}
其中 192.168.1.2
是您自己机器的本地 ip 地址。
另一种方法是 link 这些容器,而不是通过本地主机代理 - 但是您在 link 定义中提供的别名。如果你选择这种方法,我可以详细说明。
-- 用linking 方法编辑--
为了让您的服务 linked,您需要使用 docker 工具 docker-compose
。假设您熟悉它是什么(底部的 doc refs),您可以像这样编写一个 compose 文件:
first-nginx:
build: first-nginx/
ports:
- 8080:80
links:
- second-nginx
- third-nginx
second-nginx:
build: second-nginx/
ports:
- 8081:80
third-nginx:
build: third-nginx/
ports:
- 8082:80
像这样放在你项目的根目录下:
root
- first-nginx
+ nginx.conf
+ Dockerfile
+ some-other.files
- second-nginx
+ some.files
+ another-nginx.conf
+ Dockerfile
- third-nginx
+ some-nginx.conf
+ Dockerfile
+ docker-compose.yml
然后您将 "main" nginx 配置为使用创建的 links,如下所示:
配置文件:
server {
listen 80;
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
}
location /example01 {
proxy_pass http://second-nginx/;
}
location /example02 {
proxy_pass http://third-nginx/;
}
}
有什么不明白的地方一定要问。