Моя цель была в том, чтобыДженкинсконтейнер будет «разговаривать» сАнсибльконтейнер для созданияДженкинсфайл дляДженкинструбопровод.
Я ожидал, что эти два контейнера «присоединятся» кмостсеть и получить 2 IP-адреса с одинаковым идентификатором сети, но вместо этого были созданы дополнительные две сети, и каждый контейнер получил IP с разным идентификатором сети.
Также ожидается, что эти два контейнера будут иметь доступ к Интернету.
Итак, в моем Windows 10 я использую Docker Desktop, у меня есть 2 файла docker-compose.yml,
один дляДженкинсконтейнер:
version: '3.7'
services:
jenkins:
image: jenkins/jenkins:lts
privileged: true
user: root
ports:
- 8080:8080
- 50000:50000
container_name: jenkins
Другой, дляАнсибльконтейнер:
version: '2'
services:
ansible:
container_name: ansible
hostname: ansible
image: ansible
volumes:
- ~/product/ansible:/ansible
working_dir: /ansible
build:
context: .
dockerfile: Dockerfile
dns:
- 200.20.200.20
Я выполнил следующую команду для каждого файла docker-compose.yml, чтобы у меня было две отдельные машины:
docker-compose up --build
Я проверил сетевые данные моего контейнера и обнаружил, что у каждого контейнера свой сетевой идентификатор, см. ниже:
PS > docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ansible
172.18.0.2
PS > docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' jenkins
172.19.0.2
проверьте мой раздел сетей Docker, обнаружилось, что были созданы еще 2 сети, кромемост,хозяининикто:
PS > docker network ls
NETWORK ID NAME DRIVER SCOPE
8cefaed24885 ansible_default bridge local
44bedcd1622d bridge bridge local
61e1c7f7051e host host local
b5a7a7a424a4 jenkins_default bridge local
4e5d6c77cb5a none null local
Конечно, осмотрмостсеть показывает, чтоконтейнерключ пуст:
{
"Name": "bridge",
"Id": "44bedcd1622d820ce4e29a5cd545f244ba2d303102f1956fe76069a63e7c220e",
"Created": "2021-08-25T13:13:57.6577149Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {},
"CreatedTime": 1629897237657
}
У меня такие вопросы:
а) Почему при запуске docker-compose up --build
команды были созданы еще две сети Docker?
б)Как мне заставить эти контейнеры работать смостсеть и получить IP-адреса с тем же идентификатором сети(идентификатор мостовой сети 172.17.xx) для того, чтобы они могли общаться друг с другом?
решение1
Решением для соединения нескольких экземпляров docker-compose является использование внешних сетей.
Сначала создайте новую сеть с помощью команды:
docker network create my-network
Затем добавьте в оба docker-compose.yml следующее:
networks:
my_network:
external: true
А в сетевом разделе услуг:
(...)
networks:
- my_network
(...)
Docker-compose для Jenkins будет выглядеть следующим образом:
version: '3.7'
networks:
my_network:
external: true
services:
jenkins:
image: jenkins/jenkins:lts
privileged: true
user: root
networks:
- my_network
ports:
- 8080:8080
- 50000:50000
container_name: jenkins
Повторите ту же идею для другого docker-compose.yml.