2017-07-29 183 views
6

我有一個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 

如果我沒有錯,它的主機:

+0

這件事是「內部」泊塢窗仍然運行在外面泊塢窗引擎 - 所以端口綁定實際上綁定到「根」主機的本地主機。但是,您應該能夠指定docker-compose文件中使用的docker網絡,並將其設置爲哪個docker網絡連接到GitLab容器。你將能夠連接到'nc echo-server 8800' –

+0

到我以前的評論,很可能GitLab容器將使用'bridge'網絡。在您的docker-compose.yml中將'network_mode:bridge'添加到'echo-server'。然後將這些命令更改爲'nc echo-server 8800'。它可能仍然不能解析域名。在這種情況下,您可以通過'$(docker inspect -f'{{range .NetworkSettings.Networks}} {{。IPAddress}} {{end}}'echo-server)' –

+0

Hi @LukášDoležal,我不完全確定是這種情況。如果我在「root」主機運行docker ps,我會看到兩個容器 - docker:dind服務和docker:latest圖像。如果我在'docker:dind'容器中運行docker ps',我會看到由'docker-compose'啓動的三個容器 - 所以這兩組容器看起來是獨立的。此外,即使知道它正在運行,我也無法從「根」主機(我的Mac)訪問'8800'上的Web服務。 (但是我可以,如果我只是手動運行'docker-compose',如問題的頂部所示。) –

回答

6

容器是「泊塢窗主機」是,在你的情況,是支持Gitlab構建其他容器上運行名字是docker。所以訪問,因爲這:

echo "Hello world" | nc docker 8800 

要弄清楚什麼是泊塢窗守護程序的主機,使用此:

script: 
    - echo $DOCKER_HOST 
+2

這樣做。在我最近的Docker問題中,你是2。 :-)在23小時內賞金。 –

+0

很高興聽到! @CraigOtis,非常感謝;)! – Robert