我不太确定码头网络的正确使用。
我正在运行一个(单一托管的)反向代理和应用程序本身的容器,但我希望设置像proxy、frontend和backend这样的网络。最后一个项目是project1,假设最后可能有多个项目。但我甚至不确定,这个结构是否应该这样做。我认为后端应该只能访问前端,而前端应该可以访问代理。
因此,这就是我目前的工作结构,只有一个网络(桥)--这是没有意义的:
所以我的第一个船坞组合看起来是这样的:
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这意味着我之前必须创建反向代理。我不确定到目前为止这是否正确。
项目应用程序--前端容器和后端容器--是由我的CI使用docker命令(不是docker组合)创建的:
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我应该如何把它分成有用的网络呢?
发布于 2018-11-19 16:08:22
您可以将多个网络附加到给定的容器上,这让我们在很大程度上隔离了通信量。
有用网络
上下文点,我从“有用”表示服务之间存在某种程度的隔离的问题中推断。
我认为后端应该只能访问前端,而前端应该可以访问代理。
对于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.ymldocker run容器
docker network attach正确的网络发布于 2018-11-19 16:23:49
..。希望建立像代理、前端和后端这样的网络。..。我认为后端应该只能访问前端,而前端应该可以访问代理。
码头的网络不与其他码头网络交谈,所以我不确定上面提到的是那些网络上的网络还是容器。您可以拥有的是多个码头网络上的容器,它可以与任何一个网络上的服务进行对话。
使用码头设计网络布局的重要部分是,在同一个网络上的任何两个容器都可以相互通信,并使用DNS找到彼此。人们经常搞砸的地方是为反向代理创建一个类似于代理网络的东西,将多个微服务附加到代理网络上,突然发现代理网络上的所有东西都可以找到对方。因此,如果您有多个需要彼此隔离的项目,它们就不可能存在于同一个网络上。
换句话说,如果app-a和app-b不能相互交谈,但确实需要与共享代理对话,那么共享代理就需要在多个特定于应用程序的网络上,而不是每个应用程序都在同一个共享代理网络上。
这可能会变得更加复杂,取决于您的架构。例如,我曾经尝试使用的一个设计是让每个堆栈都有自己的反向代理,该代理连接到应用程序专用网络和共享代理网络,而不发布任何端口。然后,全局反向代理发布端口,并与每个堆栈特定的反向代理进行对话。其优点是全球反向代理不需要预先了解所有潜在的应用程序网络,同时仍然允许您只公开一个端口,而不需要通过共享代理网络相互连接微服务。
https://stackoverflow.com/questions/53286056
复制相似问题