我有一個docker-compose.yml
文件,該文件在端口8800
上啓動一個簡單的HTTP echo服務。無法訪問在docker中創建的docker-compose容器
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
所以它看起來像這些端口是不可用的碼頭集裝箱內,它負責碼頭r-compose服務。難道我做錯了什麼?
我不要在主機級別暴露的端口,而我只是想通過端口運行構建,提供給該容器中的泊塢窗打開容器。
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
所以「看到」的容器,和端口映射還好,不過該端口實際上並未收聽。
services:
- docker:dind
如果我沒有錯,它的主機:
這件事是「內部」泊塢窗仍然運行在外面泊塢窗引擎 - 所以端口綁定實際上綁定到「根」主機的本地主機。但是,您應該能夠指定docker-compose文件中使用的docker網絡,並將其設置爲哪個docker網絡連接到GitLab容器。你將能夠連接到'nc echo-server 8800' –
到我以前的評論,很可能GitLab容器將使用'bridge'網絡。在您的docker-compose.yml中將'network_mode:bridge'添加到'echo-server'。然後將這些命令更改爲'nc echo-server 8800'。它可能仍然不能解析域名。在這種情況下,您可以通過'$(docker inspect -f'{{range .NetworkSettings.Networks}} {{。IPAddress}} {{end}}'echo-server)' –
Hi @LukášDoležal,我不完全確定是這種情況。如果我在「root」主機運行docker ps,我會看到兩個容器 - docker:dind服務和docker:latest圖像。如果我在'docker:dind'容器中運行docker ps',我會看到由'docker-compose'啓動的三個容器 - 所以這兩組容器看起來是獨立的。此外,即使知道它正在運行,我也無法從「根」主機(我的Mac)訪問'8800'上的Web服務。 (但是我可以,如果我只是手動運行'docker-compose',如問題的頂部所示。) –