Nik*_*nko 15 docker docker-compose
在最近的版本docker-compose中,它会自动为其创建的服务创建新网络.基本上,每个docker-compose设置都有自己的IP范围,因此理论上我可以使用预定义的端口在网络的IP地址上调用我的服务.这在同时开发多个项目时非常棒,因为不需要更改端口docker-compose.yml(即我可以nginx在不同接口上的端口8080上同时运行多个项目)
但是,这不能按预期工作:每个公开的端口仍然在0.0.0.0上公开,因此与多个项目存在端口冲突.可以将绑定IP放入docker-compose.yml,但这是可移植性的杀手 - 并非团队中的每个开发人员都使用相同的操作系统或在相同的项目上工作,因此不清楚要配置哪个IP.
根据为此特定项目创建的网络,定义将容器绑定到的IP非常棒.docker-compose应该知道它创建了哪个网络以及它的IP,所以这不应该是一个问题,但我找不到一个简单的方法来做到这一点.有没有办法或者这个东西还有待实施吗?
编辑:端口冲突的一个例子:想象两个项目,每个项目在端口8080上运行的应用服务器和在端口3306上运行的MySQL数据库,两者分别暴露为"8080:8080"和"3306:3306".运行第一个docker-compose创建一个名为app1_networkIP范围为172.18.0.0/16的网络.每个公开的端口都在0.0.0.0上公开,即在127.0.0.1上,在WAN地址,默认网桥(172.17.0.0/16)和172.18.0.0/16上公开.在这种情况下,我可以访问我的应用程序服务器127.0.0.1:8080,172.17.0.1:8080,172.18.0.1:8080和als on $WAN_IP:8080.如果我现在启动第二个应用程序,它会启动第二个网络app2_network172.19.0.0/16,但仍尝试绑定所有接口上的每个公开端口.当然已经采用了这些端口(172.19.0.1除外).如果有可能将每个应用程序限制在其网络中,则应用程序1可用于172.18.0.1:8080,第二个应用程序可用于172.19.0.1:8080,我不需要将端口映射分别更改为8081和3307同时运行两个应用程序.
Moh*_*din 18
在您的服务配置中,在docker-compose.yml中:
ports:
- "127.0.0.1:8001:8001"
Run Code Online (Sandbox Code Playgroud)
参考:https://docs.docker.com/compose/compose-file/#ports
BMi*_*tch 16
您可以通过在端口之前包含 IP 将端口发布到主机上的单个 IP 地址:
docker run -p 127.0.0.1:80:80 -d nginx
Run Code Online (Sandbox Code Playgroud)
上面在loopback接口上运行nginx。您可以在 docker-compose.yml 文件内使用类似的端口映射。例如:
ports:
- "127.0.0.1:80:80"
Run Code Online (Sandbox Code Playgroud)
docker-compose没有任何特殊的能力来根据 docker 网络推断要使用哪个网络接口。您需要指定在每个撰写文件中使用的唯一 IP 地址,并且该 IP 需要用于主机上的网络接口。对于开发人员计算机,当 DHCP 为笔记本电脑/工作站提供新地址时,该 IP 可能会发生变化。
由于实现目标很困难,大多数人都会将主机上的不同端口映射到不同的容器,因此容器 a 为 13307:3307,容器 b 为 23307:3307,容器 c 为 33307:3307,或者任何对容器有意义的数字方案你。当处理 HTTP 流量时,使用像 traefik 这样的反向代理通常是最有意义的。
JJ *_*man 16
可以通过在docker-compose文件中配置网络来实现。
请考虑以下两个 docker-compose 文件。仍然存在需要在您同时处理的所有项目中指定唯一的子网的缺点。另一方面,您需要知道您也连接了哪个服务 - 这就是它无法动态分配它的原因。
我的项目.yaml:
services:
nginx:
networks:
- my-project-network
image: nginx
ports:
- 80:80
networks:
my-project-network:
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "172.20.0.1"
ipam:
config:
- subnet: "172.20.0.0/16"
Run Code Online (Sandbox Code Playgroud)
我的其他项目.yaml
services:
nginx:
networks:
- my-other-project-network
image: nginx
ports:
- 80:80
networks:
my-other-project-network:
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "172.21.0.1"
ipam:
config:
- subnet: "172.21.0.0/16"
Run Code Online (Sandbox Code Playgroud)
注意:如果您有其他服务绑定到 *:80,例如主机上运行的 apache - 它也会绑定到 docker-compose 网络的接口,并且您将无法使用此端口。
运行上面两个服务:
docker-compose -f my-project.yaml up -d
docker-compose -f my-other-project.yaml up -d
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13465 次 |
| 最近记录: |