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

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

 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 

然后我看到回声。 但是:如果我在Docker容器内通过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-compose服务的docker容器内是不可用的。 难道我做错了什么?

希望在主机级暴露端口,而只是想运行构build的Docker容器打开的端口可用于该容器。

 Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800 ^ Not here ^ I want port 8800 accessible here 

编辑:此外,如果我将一个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 

所以它“看到”容器,并且端口映射看起来没问题,但端口实际上并没有在听。

容器在“docker host”上运行,在你的情况下,它是支持Gitlab构build的另一个容器:

 services: - docker:dind 

如果我没有错,它的主机名是docker 。 所以这样访问:

 echo "Hello world" | nc docker 8800 

为了找出docker守护进程的主机是什么,使用这个:

 script: - echo $DOCKER_HOST