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>
Другие вопросы по тегам