无法访问在docker中创建的docker-compose容器

Cra*_*tis 12 docker gitlab-ci gitlab-ci-runner docker-compose

我有一个docker-compose.yml文件在端口上启动简单的HTTP回显服务8800.

version: '2'

services:
    echo-server:
        image: luisbebop/echo-server
        container_name: echo-server
        ports:
        - "8800:8800"
Run Code Online (Sandbox Code Playgroud)

超级简单的东西.如果我docker-compose up在本地计算机上运行并运行:

echo "Hello World" | nc 127.0.0.1 8800
Run Code Online (Sandbox Code Playgroud)

然后我看到回声.但是:如果我在docker容器中运行同一个compose场景,通过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
Run Code Online (Sandbox Code Playgroud)

输出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
Run Code Online (Sandbox Code Playgroud)

因此看起来这些端口在docker容器中不可用,它负责docker-compose服务.难道我做错了什么?

希望在主机级别暴露端口,而只是希望运行构建的docker容器打开的端口可用于该容器.

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

  ^ Not here        ^ I want port 8800 accessible here 
Run Code Online (Sandbox Code Playgroud)

编辑:此外,如果我将shell附加到正在运行的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
Run Code Online (Sandbox Code Playgroud)

所以它"看到"容器,并且端口映射看起来没问题,但端口实际上并没有正在侦听.

Rob*_*ert 13

容器正在"docker host"上运行,在您的情况下,这是支持Gitlab构建的另一个容器:

services:
  - docker:dind
Run Code Online (Sandbox Code Playgroud)

如果我没错,它的主机名是docker.所以访问如下:

echo "Hello world" | nc docker 8800
Run Code Online (Sandbox Code Playgroud)

要弄清楚docker守护程序的主机是什么,请使用:

script:
  - echo $DOCKER_HOST
Run Code Online (Sandbox Code Playgroud)

  • 这样做了.在我最近的Docker问题上你是2比2.:-) Bounty在~23小时内. (4认同)
  • 很酷,但是如果我需要 http 连接到已启动的 docker(`docker run --detach -p 8000:8000`),我该怎么办?`$DOCKER_HOST` 显示 `unix:///var/run/docker.sock`。连接到“http://docker:8000”或“unix:///var/run/docker.sock:8000”失败。一切都在 GitLab-CI 下运行。 (3认同)