无法访问 docker-compose 在 docker 中创建的容器
Unable to access docker-compose containers created inside docker
我有一个 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 运行ner 编写相同的场景,它会失败。
我试图在 GitLab here 上引起对这个问题的关注,但结果有限: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容器[=59]打开的端口=]构建,可用于该容器。
Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800
^ Not here ^ I want port 8800 accessible here
编辑: 此外,如果我将 shell 附加到 运行ning 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
所以它 "sees" 容器,端口映射看起来没问题,但端口实际上并没有在监听。
容器是 运行 在 "docker host" 上,在您的情况下,这是支持 Gitlab 构建的另一个容器:
services:
- docker:dind
如果我没记错的话,它的主机名是docker
。所以这样访问:
echo "Hello world" | nc docker 8800
要弄清楚 docker 守护程序的主机是什么,请使用:
script:
- echo $DOCKER_HOST
我有一个 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 运行ner 编写相同的场景,它会失败。
我试图在 GitLab here 上引起对这个问题的关注,但结果有限: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容器[=59]打开的端口=]构建,可用于该容器。
Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800
^ Not here ^ I want port 8800 accessible here
编辑: 此外,如果我将 shell 附加到 运行ning 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
所以它 "sees" 容器,端口映射看起来没问题,但端口实际上并没有在监听。
容器是 运行 在 "docker host" 上,在您的情况下,这是支持 Gitlab 构建的另一个容器:
services:
- docker:dind
如果我没记错的话,它的主机名是docker
。所以这样访问:
echo "Hello world" | nc docker 8800
要弄清楚 docker 守护程序的主机是什么,请使用:
script:
- echo $DOCKER_HOST