Dockerizing 2个独立的依赖服务

时间:2018-12-20 17:22:18

标签: docker docker-compose

我目前有一个运行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

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内部,两个主机名proxybackend将解析为Docker内部地址,并且我们已经设置了这两个服务(通过假设的环境变量设置)以侦听普通的HTTP端口80。