Docker - nginx 代理 - 访问容器之间的主机
Docker - nginx proxy - access hosts between containers
我有网络应用程序。
- Public 网络应用程序 (app1)
- api 网络应用程序 (app2)
我为此应用程序进行了 docker 配置。每个应用程序都在其容器中。要从 Web 访问此应用程序,请使用 nginx 配置容器,其中 nginx 代理所有请求。
所以我可以 运行 - http://app1.dev/ and http://app2.dev/
但我需要从 app1 访问 http://app2.dev/(从 app1 容器访问主机 app2.dev)。
Ping(来自 app1 容器):
PING app2.dev (127.0.53.53) 56(84) bytes of data.
64 bytes from 127.0.53.53: icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from 127.0.53.53: icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from 127.0.53.53: icmp_seq=3 ttl=64 time=0.038 ms
我还应该配置什么,才能从 app1 容器访问 http://app2.dev/ 主机?
Nginx 代理配置
upstream app1_upstream {
server app1;
}
upstream app1_upstream {
server app2;
}
server {
listen 80;
server_name app1.dev
app2.dev;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection '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;
proxy_cache_bypass $http_upgrade;
if ($host = "app1.dev") {
proxy_pass http://app1;
}
if ($host = "app2.dev") {
proxy_pass http://app2;
}
}
error_log /var/log/nginx/proxy_error.log;
access_log /var/log/nginx/proxy_access.log;
}
Docker撰写
version: '2'
services:
proxy:
build: ./proxy/
ports:
- "80:80"
- "443:443"
links:
- app1
- app2
- app1:app1
- app2:app2
hostname: proxy
app1:
build: ./app1/
volumes:
- ../app1/:/var/www/app1
hostname: app1
app2:
build: ./app2/
volumes:
- ../app2/:/var/www/app2
hostname: app2
docker-compose ps
app1 /sbin/my_init Up 80/tcp
app2 /sbin/my_init Up 80/tcp
proxy_1 /sbin/my_init Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
ports:
- "80:80"
- "443:443"
向主机公开端口。当你做
docker ps -a
您将看到列出这些端口
但是,要在容器之间公开端口,您需要在 dockerfile 中使用 EXPOSE 命令。
https://docs.docker.com/engine/reference/builder/#expose
What i should configure else, to have access to http://app2.dev/ host from app1 container?
您必须在 dockerfile 中公开端口!
如果你做一个...
docker exec -it containerName bash
您将能够探索。
查看容器内的hosts文件。
cat /etc/hosts
如果您有 --link 正确的容器,您将在主机文件中看到另一个容器的条目。
可以ping通hosts文件中的域名
不确定您 运行 的 docker 版本是什么,但是如果您是(或能够)运行 1.10,您应该改用 docker 网络使用 "link".
如果您 运行 所有三个容器都在同一个 docker 网络上,那么它们将可以通过容器名称相互访问。
这将允许您从 app1 调用 app2 而无需通过您的代理返回(尽管我将其称为反模式,就像您要将接口更改为 app2 一样,您必须更新 app1 和代理,我会让 app1 通过您的代理调用 app2,以便您维护一个接口)。
有关 Docker 网络的更多信息:https://docs.docker.com/engine/userguide/networking/dockernetworks/
TLDR:
# create bridge network (for single host)
docker networks create my-network
然后也更改您的撰写:
version: '2'
services:
proxy:
build: ./proxy/
ports:
- "80:80"
- "443:443"
networks:
- my-network
hostname: proxy
app1:
build: ./app1/
volumes:
- ../app1/:/var/www/app1
networks:
- my-network
hostname: app1
app2:
build: ./app2/
volumes:
- ../app2/:/var/www/app2
networks:
- my-network
hostname: app2
networks:
my-network:
external: true
我有网络应用程序。
- Public 网络应用程序 (app1)
- api 网络应用程序 (app2)
我为此应用程序进行了 docker 配置。每个应用程序都在其容器中。要从 Web 访问此应用程序,请使用 nginx 配置容器,其中 nginx 代理所有请求。
所以我可以 运行 - http://app1.dev/ and http://app2.dev/
但我需要从 app1 访问 http://app2.dev/(从 app1 容器访问主机 app2.dev)。
Ping(来自 app1 容器):
PING app2.dev (127.0.53.53) 56(84) bytes of data.
64 bytes from 127.0.53.53: icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from 127.0.53.53: icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from 127.0.53.53: icmp_seq=3 ttl=64 time=0.038 ms
我还应该配置什么,才能从 app1 容器访问 http://app2.dev/ 主机?
Nginx 代理配置
upstream app1_upstream {
server app1;
}
upstream app1_upstream {
server app2;
}
server {
listen 80;
server_name app1.dev
app2.dev;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection '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;
proxy_cache_bypass $http_upgrade;
if ($host = "app1.dev") {
proxy_pass http://app1;
}
if ($host = "app2.dev") {
proxy_pass http://app2;
}
}
error_log /var/log/nginx/proxy_error.log;
access_log /var/log/nginx/proxy_access.log;
}
Docker撰写
version: '2'
services:
proxy:
build: ./proxy/
ports:
- "80:80"
- "443:443"
links:
- app1
- app2
- app1:app1
- app2:app2
hostname: proxy
app1:
build: ./app1/
volumes:
- ../app1/:/var/www/app1
hostname: app1
app2:
build: ./app2/
volumes:
- ../app2/:/var/www/app2
hostname: app2
docker-compose ps
app1 /sbin/my_init Up 80/tcp
app2 /sbin/my_init Up 80/tcp
proxy_1 /sbin/my_init Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
ports:
- "80:80"
- "443:443"
向主机公开端口。当你做
docker ps -a
您将看到列出这些端口
但是,要在容器之间公开端口,您需要在 dockerfile 中使用 EXPOSE 命令。
https://docs.docker.com/engine/reference/builder/#expose
What i should configure else, to have access to http://app2.dev/ host from app1 container?
您必须在 dockerfile 中公开端口!
如果你做一个...
docker exec -it containerName bash
您将能够探索。
查看容器内的hosts文件。
cat /etc/hosts
如果您有 --link 正确的容器,您将在主机文件中看到另一个容器的条目。
可以ping通hosts文件中的域名
不确定您 运行 的 docker 版本是什么,但是如果您是(或能够)运行 1.10,您应该改用 docker 网络使用 "link".
如果您 运行 所有三个容器都在同一个 docker 网络上,那么它们将可以通过容器名称相互访问。
这将允许您从 app1 调用 app2 而无需通过您的代理返回(尽管我将其称为反模式,就像您要将接口更改为 app2 一样,您必须更新 app1 和代理,我会让 app1 通过您的代理调用 app2,以便您维护一个接口)。
有关 Docker 网络的更多信息:https://docs.docker.com/engine/userguide/networking/dockernetworks/
TLDR:
# create bridge network (for single host)
docker networks create my-network
然后也更改您的撰写:
version: '2'
services:
proxy:
build: ./proxy/
ports:
- "80:80"
- "443:443"
networks:
- my-network
hostname: proxy
app1:
build: ./app1/
volumes:
- ../app1/:/var/www/app1
networks:
- my-network
hostname: app1
app2:
build: ./app2/
volumes:
- ../app2/:/var/www/app2
networks:
- my-network
hostname: app2
networks:
my-network:
external: true