我目前有一个运行2个服务的VM。前端httpd / apache2服务,可将所有请求代理到我的后端服务。
我的银行服务仅监听127.0.0.1:7878
。这意味着只能通过本地主机访问它。这就是我使用前端的原因,以便我可以使用该前端将我的请求代理到127.0.0.1:7878
所以我在VM上的apache2配置看起来像:
root@vm:/etc/apache2/sites-enabled# cat backend.conf
<VirtualHost *:443>
ServerName my.domain.com
ProxyPass / http://localhost:7878/
ProxyPassReverse / http://localhost:7878/
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/ssl_cert.crt
SSLCertificateKeyFile /etc/apache2/ssl/ssl_cert.key
</VirtualHost>
现在,我想对这两项服务进行docker化并使用docker-compose
我已经设置了后端服务,例如:
version: '3'
services:
backend:
build: backend/.
ports:
- "7878:7878"
我的backend/
文件夹包含我的后端服务所需的所有文件,包括Dockerfile。我能够通过docker image成功构建并可以成功运行它。当我执行到Pod中时,我可以向curl
127.0.0.1:7878/some-end-point
命令
现在,我也需要对前端服务进行docker化。可能是Apache,甚至可能是Nginx。但是由于我的后端服务仅监听127.0.0.1
如果我像这样扩展docker-compose文件:
version: '3'
services:
backend:
build: backend/.
ports:
- "7878:7878"
frontend:
build: frontend/.
ports:
- "80:80"
- "443:443"
我相信它将启动自己的网络,并且无法使用127.0.0.1:7878
那么在这种情况下,最好的方法是什么?如何使用docker-compose在SAME网络上启动不同的容器,以便它们共享127.0.0.1
?
答案 0 :(得分:1)
您不能像描述的那样执行该操作:IPv4地址127.0.0.1是一个魔术地址,始终表示“我”,而在Docker上下文中则表示“此容器”。
set up a private Docker-internal network for your containers很简单;实际上,Docker Compose会自动为您执行此操作。您的后端服务必须在0.0.0.0上进行侦听,才能从其他容器进行访问。不过,您不需要在容器上设置外部发布的ports:
(或使用docker run -p
选项)。如果不这样做,则只能使用docker-compose.yml
文件中的服务名称作为DNS名称,使用相同Docker内部网络上的其他容器访问容器,无论该容器内的进程发生在哪个端口上要听。
最简单的例子如下:
version: '3'
services:
proxy:
image: 'my/proxy:20181220.01'
environment:
BACKEND_URL: 'http://backend'
BIND_ADDRESS: '0.0.0.0:80'
ports:
- '8080:80'
backend:
image: 'my/backend:20181220.01'
environment:
BIND_ADDRESS: '0.0.0.0:80'
从Docker外部,您可以通过http://server-hostname.example.com:8080
到达代理。在Docker内部,两个主机名proxy
和backend
将解析为Docker内部地址,并且我们已经设置了这两个服务(通过假设的环境变量设置)以侦听普通的HTTP端口80。