Docker Контейнерные сети с Docker-in-Docker
Я хотел бы подключиться к сети с дочерним док-контейнером из родительского док-контейнера с настройкой docker-in-docker.
Допустим, я пытаюсь подключиться к простому серверу Apache httpd. Когда я запускаю контейнер httpd на моей хост-машине, все работает нормально:
asnyder:~$ docker run -d -p 8080:80 httpd:alpine
asnyder:~$ curl localhost:8080
<html><body><h1>It works!</h1></body></html>
Но когда я делаю то же самое в настройке Docker-in-Docker, я получаю Connection refused
ошибка:
asnyder:~$ docker run -d --name mydind --privileged docker:dind
asnyder:~$ docker run -it --link mydind:docker docker:latest sh
/ # docker run -d -p 8080:80 httpd:alpine
/ # curl localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused
Я попытался пару изменений без удачи. Указание 0.0.0.0
интерфейс:
asnyder:~$ docker run -d --name mydind --privileged docker:dind
asnyder:~$ docker run -it --link mydind:docker docker:latest sh
/ # docker run -d -p 0.0.0.0:8080:80 httpd:alpine
/ # curl 0.0.0.0:8080
curl: (7) Failed to connect to 0.0.0.0 port 8080: Connection refused
Используя сеть хоста:
asnyder:~$ docker run -d --name mydind --privileged docker:dind
asnyder:~$ docker run -it --link mydind:docker docker:latest sh
/ # docker run -d --network host httpd:alpine
/ # curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused
Удивительно, но я не смог найти ни одной существующей статьи по этому вопросу. У кого-нибудь есть понимание?
Спасибо!
1 ответ
Есть плюсы и минусы как для установки DinD, так и для bind на разъем Docker, и, безусловно, есть варианты использования для обоих. В качестве примера, посмотрите этот набор постов в блоге, который хорошо объясняет один из вариантов использования.
Учитывая приведенную выше примерную настройку docker-in-docker, вы можете получить доступ к серверу Apache httpd одним из двух способов:
1) Изнутри docker:dind
контейнер, он будет доступен на localhost:8080
,
2) Изнутри docker:latest
Контейнер, в котором вы пытались получить доступ к нему изначально, он будет доступен на любом имени хоста, установленном для docker:dind
контейнер. В этом случае вы использовали --name mydind
, следовательно curl mydind:8080
даст вам стандартный Apache <html><body><h1>It works!</h1></body></html>
,
Надеюсь, это имеет смысл!
Опираясь на ответ Юрия:
2) Изнутри
docker:latest container
, [...] оно будет доступно на любом имени хоста, установленном дляdocker:dind
контейнер. В этом случае вы использовали--name mydind
, следовательноcurl mydind:8080
[...]
В конфигурации Gitlab CI вы можете обращаться к контейнеру DinD по имени его изображения (в дополнение к имени его контейнера, который генерируется автоматически):
Доступ к услугам
Допустим, вам нужен экземпляр Wordpress для проверки интеграции API с вашим приложением.
Затем вы можете использовать, например, изображение пачки / WordPress в вашем
.gitlab-ci.yml
:services: - tutum/wordpress:latest
Если вы не укажете псевдоним службы, при запуске задания
tutum/wordpress
будет запущен, и у вас будет доступ к нему из вашего сборочного контейнера под двумя именами хостов на выбор:
tutum-wordpress
tutum__wordpress
С помощью
service:
- docker:dind
позволит вам получить доступ к этому контейнеру как docker:8080
:
script:
- docker run -d -p 8080:80 httpd:alpine
- curl docker:8080
Изменить: Если вы предпочитаете более точное имя хоста, вы можете, как указано в документации, использовать alias
:
services:
- name: docker:dind
alias: dind-service
а потом
script:
- docker run -d -p 8080:80 httpd:alpine
- curl dind-service:8080
Hth, DTK
Я очень уверен, что ответ @Yuriy Znatokov - то, что я хочу, но я понял это в течение долгого времени. Чтобы облегчить понимание последующим людям, я экспортировал полные шаги.
1) Внутри докера: контейнер dind
docker run -d --name mydind --privileged docker:dind
/ # docker run -d -p 8080:80 httpd:alpine
/ # curl localhost:8080
<html><body><h1>It works!</h1></body></html>
2) Изнутри докера: последний контейнер
docker run -d --name mydind --privileged docker:dind
docker run -it --link mydind:docker docker:latest sh
/ # docker run -d -p 8080:80 httpd:alpine
/ # curl mydind:8080
<html><body><h1>It works!</h1></body></html>