Подавление работы с сетью докеров с помощью docker compose для изоляции выполнения теста - PullRequest
0 голосов
/ 14 ноября 2018

Как подавить docker-compose up сопоставление с диапазоном IP-адресов хоста (для нескольких экземпляров)?

Контекст: я ищучтобы запустить модульные тесты в Jenkins, где у нас есть механизм докера на главном и каждом ведомом устройствах.

Я хочу раскрутить несколько контейнеров для тестирования интеграции модулей и отключить их после.

Я хочу, чтобы несколько тестов могли одновременно запускать один и тот же файл компоновки Docker.

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

Я обнаружил, что первая сеть связывается с 0.0.0.0/ <порт>, что вызывает конфликты при повторном выполнении.

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-адресов хоста, а затем получение IP-адреса извне сети с использованием docker ps и docker inspect в сочетании.

Идеальным вариантом будет:

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, чтобы удалить все внешние сопоставления сети, что является болезненным, или создать докер внутри докера, чтобы полностью изолировать сеть.Болезненно.

Любые предложения о том, как в значительной степени указать --network=none, чтобы мы не получали привязки 0.0.0.0/, были бы хорошими.Я отмечаю, что в этой области есть докерская библиотека golang (libcompose), но, к сожалению, она больше не поддерживается.

Спасибо,

alex

1 Ответ

0 голосов
/ 14 ноября 2018

Хорошо, я решил это (на самом деле это заслуга товарища по команде).

Решение состоит в том, чтобы заменить ports на expose в файле docker-compose.yml.

Звучит просто, но это имеет следующий результат:

До: (таблица 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, чтобы получить соответствующий IP для каждого хоста, объявленного в файле docker-compose.yml, и разрешить коду запускать каждый тест изолированно, включая все тесты, вызывающие один и тот же файл.

Результат.

...