如何抑制 docker-compose up 映射到主机 IP 范围(对于多个实例)?
上下文:我希望在 Jenkins 中运行单元测试,我们在主服务器和每个从服务器上都有一个 docker 引擎。
我想启动一些容器进行单元集成测试,然后关闭它们。
我希望多个测试能够同时运行同一个 docker compose 文件,而不会发生争用。
docker-compose -f "my-test-docker-compose.yml" -p "ab2de2f38c" up -d -t 100
第二次执行:
docker-compose -f "my-test-docker-compose.yml" -p "34cd832b7" up -d -t 100
我发现第一个网络绑定(bind)到 0.0.0.0/< port >,这在第二次执行时会导致冲突。
Cannot start service zookeeper: driver failed programming external connectivity on endpoint 34cd832b7_zookeeper_1 (c2b928530cfdc7aee17): Bind for 0.0.0.0:22181 failed: port is already allocated
已尝试在每个服务和底部添加网络,然后使用 docker network create
创建网络。到目前为止,没有骰子。
理想情况下需要一个不需要更改 docker-compose.yml 文件的解决方案,因为这会给测试人员带来负担。
有没有办法抑制容器和主机 IP 范围之间的任何映射,然后结合使用 docker ps
和 docker inspect
从网络外部获取 IP .
理想的情况是:
c, err := docker.New("my-test-docker-compose.yml")
//handle err
c.Up()
//connect to a service..
s, err := service1.New(c.GetSocket("serv:1234"))
//handle connection error
//do testing
c.Down()
任何建议都是理想的。唯一的选择可能是重新处理每个 docker-compose.yml 以删除所有外部网络映射,这很痛苦,或者在 docker 中生成 docker 以完全隔离网络。很痛苦。
关于如何几乎指定 --network=none
以便我们没有 0.0.0.0/绑定(bind)的任何建议都很棒。我注意到这个区域有一个 golang docker 库 (libcompose),但遗憾的是它不再被维护。
谢谢,
亚历克斯
最佳答案
好的,我已经解决了这个问题(实际上归功于队友)。
解决方法是将docker-compose.yml文件中的ports
替换成expose
听起来很简单,但结果如下:
之前:(HTML 表格)
<table border=1>
<tr><th>CONTAINER_ID</th><th>....</th><th>PORTS</th></tr>
<tr><td>75a45ac5ef62</td><td>....</td><td>0.0.0.0:9094->9094/tcp, 0.0.0.0:33919->9092/tcp, 0.0.0.0:33918->9093/tcp, 0.0.0.0:33917->22888/tcp</td></tr>
<tr><td>1920786d77ed</td><td>....</td><td>0.0.0.0:9092->9092/tcp, 0.0.0.0:33909->9093/tcp, 0.0.0.0:33908->9094/tcp</td></tr>
</table>
之后:(HTML 表格)
<table border=1>
<tr><th>CONTAINER_ID</th><th>....</th><th>PORTS</th></tr>
<tr><td>75a45ac5ef62</td><td>....</td><td>9092-9094/tcp, 22888/tcp, 32888/tcp, 43888/tcp</td></tr>
<tr><td>1920786d77ed</td><td>....</td><td>2181/tcp, 2888/tcp, 3888/tcp, 22888/tcp, 33888/tcp, 42181/tcp, 43888/tcp</td></tr>
</table>
因此:“0.0.0.0:9094->9094/tcp”变为“9094-9094/tcp”。
问题是“端口”将每个已注册的端口推送到 IP 0.0.0.0 上的主机。 Expose 不会这样做。这样网络中的每个容器仍然可以相互看到并解析,但这不会发布到主机。
这现在可以与 docker ps => docker inspect
一起使用,以获取在 docker-compose.yml 文件中声明的每个主机的相关 IP,并允许代码单独运行每个测试,包括测试都调用同一个文件。
结果。
关于docker - 使用 docker compose 抑制 docker 网络以进行测试执行隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53300267/