docker - 使用 docker compose 抑制 docker 网络以进行测试执行隔离

标签 docker testing networking docker-compose isolation

如何抑制 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 psdocker 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/

相关文章:

linux - Bash 脚本,用于循环打开和关闭无线接口(interface)

Azure 网络 ActiveFTP 问题

android - 在 WiFi 网络上查找另一台 Android 设备

mysql - wordpress docker 立即退出

docker - 如何监控在 Bluemix 容器组中运行的 JVM?

docker - 为什么将容器标准输出重定向到文件不起作用?

unit-testing - vstest.executionengine.x86.exe 未关闭

selenium - 在 docker 容器中运行 firefox 时,Selenium webdriver 的连接被拒绝错误

python - 使用假设生成随机对象列表

javascript - Cypress 与 cy.wait 的良好实践