泊坞窗:将结构拆分成有用的网络

时间:2018-11-13 17:00:32

标签: docker reverse-proxy docker-networking

我不确定docker网络的正确用法。

我正在运行(单个托管)反向代理和应用程序本身的容器,但是我想设置诸如proxyfrontendbackend之类的网络。假设最后有多个项目,则为project1的最后一个项目。 但是我什至不确定这种结构是否应该完成。我认为后端只能访问前端,而前端只能访问代理。

这是我目前只有一个网络(网桥)的工作结构-这没有意义:

  1. 反向代理(网络:反向代理):
    • jwilder / nginx-proxy
    • jrcs / letsencrypt-nginx-proxy-companion
  2. 数据库
    • mongo:3.6.2
  3. 项目1
    • 一个/前端
    • 一个/后端
    • 两个/前端
    • 两个/后端

所以我的第一个docker-compose看起来像这样:

version: '3.5'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    networks:
      - reverse-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/docker/nginx-proxy/vhost.d:/etc/nginx/vhost.d:rw
      - html:/usr/share/nginx/html
      - /opt/nginx/certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro

  nginx-letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-letsencrypt
    networks:
      - reverse-proxy
    depends_on:
      - nginx-proxy
    volumes:
      - /var/docker/nginx-proxy/vhost.d:/etc/nginx/vhost.d:rw
      - html:/usr/share/nginx/html
      - /opt/nginx/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:rw
    environment:
      NGINX_PROXY_CONTAINER: "nginx-proxy"

  mongodb:
    container_name: mongodb
    image: mongo:3.6.2
    networks:
      - reverse-proxy

volumes:
  html:

networks:
  reverse-proxy:
    external:
      name: reverse-proxy

这意味着我必须先创建 reverse-proxy 。我不确定到目前为止是否正确。

项目应用程序-前端容器和后端容器-由我的CI使用docker命令(不是docker compose)创建:

docker run
  --name project1-one-frontend
  --network reverse-proxy
  --detach
  -e VIRTUAL_HOST=project1.my-server.com
  -e LETSENCRYPT_HOST=project1.my-server.com
  -e LETSENCRYPT_EMAIL=mail@my-server.com
  project1-one-frontend:latest

我应该如何将其划分为有用的网络?

2 个答案:

答案 0 :(得分:1)

TL; DR;您可以将多个网络连接到一个给定的容器,这样就可以在很大程度上隔离流量。

  

有用的网络

从上下文的角度出发,我从一个问题中推断出“有用”表示服务之间存在一定程度的隔离。

  

我认为后端只能用于前端,而前端只能用于代理。

使用docker-compose非常简单。就像在reverse-proxy中所做的一样,只需在顶层指定所需的网络即可:

networks:
  reverse-proxy:
    external:
      name: reverse-proxy
  frontend:
  backend:

然后这样:

version: '3.5'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    networks:
      - reverse-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      ...

  frontend1:
    image: some/image
    networks:
      - reverse-proxy
      - backend

  backend1:
    image: some/otherimage
    networks:
      - backend

  backend2:
    image: some/otherimage
    networks:
      - backend

  ...

这样设置,只有 frontend1 可以到达 backend1 backend2 我知道这不是一个选择,因为您说过您正在通过docker run运行应用程序容器(前端和后端)。但是我认为这很好地说明了如何在Docker的网络中大致实现您所追求的目标。

那么您如何执行上面docker-compose.yml所示的操作?我发现了这个:https://success.docker.com/article/multiple-docker-networks

总而言之,您只能使用docker run连接一个网络,但是可以使用docker network connect <container> <network>将运行中的容器启动后将它们连接到更多网络。

创建网络,运行docker-compose up或在管道中运行各种容器的顺序由您决定。您可以根据需要在docker-compose.yml内创建网络,也可以使用docker network create并将其导入到docker-compose堆栈中。这取决于您如何使用此堆栈,这将决定此处的操作顺序。

指导原则可能很明显,那就是在尝试将网络连接到容器之前,网络必须存在。最直接的管道可能看起来像..

  1. docker-compose up,其中所有网络在docker-compose.yml
  2. 中定义
  3. 对于每个应用容器:

    docker run容器

    docker network attach正确的网络

答案 1 :(得分:1)

  

...想要设置代理,前端和后端之类的网络。 ...我认为后端只能访问前端,而前端只能访问代理。

泊坞窗中的网络不会与其他泊坞窗网络通信,因此我不确定以上内容是否与网络或这些网络上的容器有关。您可以在多个docker网络上拥有一个容器,并且它可以与任一网络上的服务进行通讯。

关于使用docker设计网络布局的重要部分是,同一网络上的任何两个容器都可以相互通信,并且可以使用DNS相互查找。人们经常搞砸的地方是为反向代理创建诸如代理网络之类的东西,将多个微服务附加到代理网络,突然发现该代理网络上的所有东西都可以找到对方。因此,如果您有多个需要相互隔离的项目,则它们不能存在于同一网络中。

换句话说,如果app-a和app-b不能相互通信,但确实需要与共享代理通信,则共享代理需要位于​​多个特定于应用程序的网络上,而不是每个应用程序都位于相同的共享代理网络。

根据您的体系结构,这可能变得更加复杂。例如。我一直试图使用的一种设计是让每个堆栈都有自己的反向代理,该代理连接到应用程序专用网络和共享代理网络,而不发布任何端口。然后,全局反向代理发布端口并与每个特定于堆栈的反向代理进行对话。这样做的好处是,全局逆向代理无需预先知道所有潜在的应用程序网络,而仍然允许您仅公开一个端口,而无需微服务通过共享代理网络相互连接。