Невозможно получить доступ к Docker-составить контейнеры, созданные внутри Docker

У меня есть docker-compose.yml файл, который запускает простую службу HTTP echo на порту 8800,

version: '2'

services:
    echo-server:
        image: luisbebop/echo-server
        container_name: echo-server
        ports:
        - "8800:8800"

Супер простые вещи. Если я бегу docker-compose up и запустить на моей локальной машине:

echo "Hello World" | nc 127.0.0.1 8800

Тогда я вижу эхо. Однако: если я запускаю этот же сценарий компоновки внутри контейнера докера через GitLab, он завершается неудачно.

Я попытался привлечь внимание к этой проблеме в GitLab здесь, но с ограниченными результатами: https://gitlab.com/gitlab-org/gitlab-ce/issues/26566

мой .gitlab-ci.yml файл выглядит так:

---

stages:
  - docker_test

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: docker:latest
  script:
  - docker version
  - apk update
  - apk add py-pip
  - pip install docker-compose
  - docker-compose up -d
  - sleep 10
  - netstat -tulpn
  - docker-compose port echo-server 8800
  - echo "Hello world" | nc 127.0.0.1 8800

И выход gitlab-ci-multi-runner exec docker --docker-privileged docker_test является:

$ netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

$ docker-compose port echo-server 8800
0.0.0.0:8800

$ echo "Hello world" | nc 127.0.0.1 8800
ERROR: Build failed: exit code 1

Таким образом, кажется, что эти порты недоступны в контейнере Docker, который отвечает за сервисы docker-compose. Я делаю что-то неправильно?

Я не хочу, чтобы порты отображались на уровне хоста, скорее, я просто хочу, чтобы порты, открытые контейнером Docker, выполняющим сборку, были доступны этому контейнеру.

Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800

  ^ Not here        ^ I want port 8800 accessible here 

Изменить: Далее, если я присоединяю оболочку к работающему контейнеру CI, я вижу:

/ # docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
ab192edf5872        luisbebop/echo-server   "/opt/echo-server/..."   2 minutes ago       Up About a minute   0.0.0.0:8800->8800/tcp   echo-server
/ # netstat -nltup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

Таким образом, он "видит" контейнер, и сопоставления портов выглядят нормально, но на самом деле порт не прослушивает.

1 ответ

Решение

Контейнер работает на "узле докера", который, в вашем случае, является другим контейнером, поддерживающим сборку Gitlab:

services:
  - docker:dind

Если я не ошибаюсь, его имя хоста docker, Так что доступ как это:

echo "Hello world" | nc docker 8800

Чтобы выяснить, что является хостом демона docker, используйте это:

script:
  - echo $DOCKER_HOST
Другие вопросы по тегам