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

无法访问在docker中创建的docker compose容器,docker,docker-compose,gitlab-ci,gitlab-ci-runner,Docker,Docker Compose,Gitlab Ci,Gitlab Ci Runner,我有一个docker compose.yml文件,它在端口8800上启动了一个简单的HTTP echo服务 version: '2' services: echo-server: image: luisbebop/echo-server container_name: echo-server ports: - "8800:8800" 超级简单的东西。如果我运行docker compose up并在本地计算机上运行: ec

我有一个
docker compose.yml
文件,它在端口
8800
上启动了一个简单的HTTP echo服务

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 runner运行相同的撰写场景,它就会失败

我试图在GitLab上引起大家对这个问题的注意,但效果有限:

我的
.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容器负责docker compose服务。我做错什么了吗

我不希望端口在主机级别公开,而只希望运行构建的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主机”上,在您的情况下,该主机是支持Gitlab构建的另一个容器:

services:
  - docker:dind
如果我没有错的话,它的主机名是
docker
。因此,访问权限如下所示:

echo "Hello world" | nc docker 8800
要了解docker守护程序的主机,请使用以下命令:

script:
  - echo $DOCKER_HOST

这是因为“内部”docker仍然在外部docker引擎上运行——因此端口绑定实际上绑定到“根”主机的本地主机。但是,您应该能够指定要在docker compose文件中使用的docker网络,并将其设置为连接到GitLab容器的docker网络。您将能够连接到
nc echo服务器8800
到我之前的评论,最有可能的是GitLab容器将使用
网桥
网络。在docker-compose.yml中将
network\u mode:bridge
添加到
echo服务器
。然后将命令更改为
nc echo server 8800
。它可能仍然无法解析域名。在这种情况下,您可以通过
$(docker inspect-f'{range.NetworkSettings.Networks}}{{.IPAddress}}{end}}}echo服务器)获取IP
Hi@LukášDoležal,我不完全确定情况是否如此。如果我在“根”主机上运行
docker ps
,我会看到两个容器--
docker:dind
服务和
docker:latest
图像。如果我在
docker:dind
容器内运行
docker ps
,我会看到由
docker compose
启动的三个容器,因此这两组容器看起来是独立的。此外,我无法从“根”主机(我的Mac)访问
8800
上的web服务,即使我知道它正在运行。(但我可以手动运行
docker compose
,如问题顶部所示。)您是否检查了
docker:dind
docker:latest
图像中是否存在nc命令?这个错误可能就是因为这个。正常情况下,nc不安装在images@TarunLalwani
nc
命令是预先安装在
docker:latest
中的,这就是我运行它的地方。就是这样。在我最近的Docker问题上,你是二比二。:-)23小时内悬赏。$echo$DOCKER\u主持人tcp://docker:2375Cool,但如果我需要http连接到已启动的docker(
docker run--detach-p 8000:8000
),我必须做什么<代码>$DOCKER\u主机正在显示
unix:///var/run/docker.sock
。连接到
http://docker:8000
unix:///var/run/docker.sock:8000
失败。一切都在GitLab CI下运行。