我不确定docker网络的正确用法。
我正在运行(单个托管)反向代理和应用程序本身的容器,但是我想设置诸如proxy
,frontend
和backend
之类的网络。假设最后有多个项目,则为project1的最后一个项目。
但是我什至不确定这种结构是否应该完成。我认为后端只能访问前端,而前端只能访问代理。
这是我目前只有一个网络(网桥)的工作结构-这没有意义:
所以我的第一个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
我应该如何将其划分为有用的网络?
答案 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
堆栈中。这取决于您如何使用此堆栈,这将决定此处的操作顺序。
指导原则可能很明显,那就是在尝试将网络连接到容器之前,网络必须存在。最直接的管道可能看起来像..
docker-compose up
,其中所有网络在docker-compose.yml
对于每个应用容器:
docker run
容器
docker network attach
正确的网络
答案 1 :(得分:1)
...想要设置代理,前端和后端之类的网络。 ...我认为后端只能访问前端,而前端只能访问代理。
泊坞窗中的网络不会与其他泊坞窗网络通信,因此我不确定以上内容是否与网络或这些网络上的容器有关。您可以在多个docker网络上拥有一个容器,并且它可以与任一网络上的服务进行通讯。
关于使用docker设计网络布局的重要部分是,同一网络上的任何两个容器都可以相互通信,并且可以使用DNS相互查找。人们经常搞砸的地方是为反向代理创建诸如代理网络之类的东西,将多个微服务附加到代理网络,突然发现该代理网络上的所有东西都可以找到对方。因此,如果您有多个需要相互隔离的项目,则它们不能存在于同一网络中。
换句话说,如果app-a和app-b不能相互通信,但确实需要与共享代理通信,则共享代理需要位于多个特定于应用程序的网络上,而不是每个应用程序都位于相同的共享代理网络。
根据您的体系结构,这可能变得更加复杂。例如。我一直试图使用的一种设计是让每个堆栈都有自己的反向代理,该代理连接到应用程序专用网络和共享代理网络,而不发布任何端口。然后,全局反向代理发布端口并与每个特定于堆栈的反向代理进行对话。这样做的好处是,全局逆向代理无需预先知道所有潜在的应用程序网络,而仍然允许您仅公开一个端口,而无需微服务通过共享代理网络相互连接。>