2017-07-29 44 views
6

Tôi có tệp docker-compose.yml khởi động dịch vụ echo HTTP đơn giản trên cổng 8800.Không thể truy cập vùng chứa docker-compose được tạo bên trong docker

version: '2' 

services: 
    echo-server: 
     image: luisbebop/echo-server 
     container_name: echo-server 
     ports: 
     - "8800:8800" 

Công cụ đơn giản. Nếu tôi chạy docker-compose up và chạy trên máy cục bộ của mình:

echo "Hello World" | nc 127.0.0.1 8800 

Sau đó, tôi thấy tiếng vọng. Tuy nhiên: Nếu tôi chạy cùng một kịch bản soạn thư này bên trong vùng chứa docker, thông qua nhân vật GitLab, nó không thành công.

Tôi đã cố gắng để thu hút sự chú ý cho vấn đề này tại GitLab ở đây, nhưng với kết quả hạn chế: https://gitlab.com/gitlab-org/gitlab-ce/issues/26566

tập tin .gitlab-ci.yml tôi trông như thế:

--- 

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 

Và đầu ra của gitlab-ci-multi-runner exec docker --docker-privileged docker_test là:

$ 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 

Vì vậy, có vẻ như các cổng này không có sẵn bên trong vùng chứa docker, phụ trách của docke dịch vụ soạn thảo. Tôi có làm điều gì sai?

tôi không muốn các cổng tiếp xúc ở cấp máy chủ, chứ không phải tôi chỉ muốn các cổng mở bằng container Docker chạy build, có sẵn để chứa đó.

Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800 

^Not here  ^I want port 8800 accessible here 

Edit: Hơn nữa, nếu tôi đính kèm một vỏ để chứa CI chạy, tôi thấy:

/ # 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 

Vì vậy, nó "nhìn thấy" các container, và ánh xạ cổng tìm được rồi, nhưng cổng không thực sự lắng nghe.

+0

điều này là "bên trong" Docker vẫn chạy trên các công cụ Docker bên ngoài - do đó, cổng ràng buộc thực sự liên kết với localhost của máy chủ "root". Tuy nhiên, bạn có thể chỉ định mạng docker để sử dụng trong tệp docker-compose và đặt nó vào mạng docker được gắn vào thùng chứa GitLab. Bạn sẽ có thể kết nối với 'nc echo-server 8800' –

+0

với bình luận trước đó của tôi, rất có thể thùng chứa GitLab sẽ sử dụng mạng' bridge'. Thêm 'network_mode: bridge' vào' echo-server' trong docker-compose.yml của bạn. Sau đó thay đổi lệnh thành 'nc echo-server 8800'. Nó vẫn có thể không giải quyết được tên miền. Trong trường hợp đó, bạn có thể nhận IP thông qua '$ (docker inspect -f '{{range .NetworkSettings.Networks}} {{.IPAddress}} {{end}} 'echo-server) ' –

+0

Xin chào @ LukášDoležal, tôi không hoàn toàn chắc chắn đó là trường hợp. Nếu tôi chạy 'docker ps' tại máy chủ" root ", tôi thấy hai thùng chứa - dịch vụ' docker: dind' và hình ảnh 'docker: latest'. Nếu tôi chạy 'docker ps' bên trong thùng chứa' docker: dind', tôi thấy ba thùng chứa bắt đầu bằng 'docker-compose' - vì vậy hai bộ chứa dường như độc lập. Hơn nữa, tôi không thể truy cập dịch vụ web trên '8800' từ máy chủ" root "(máy Mac của tôi) mặc dù tôi biết nó đang chạy. (Nhưng tôi có thể nếu tôi chỉ chạy 'docker-compose' theo cách thủ công, như đã thấy ở đầu câu hỏi.) –

Trả lời

6

container đang chạy trên "chủ Docker" đó, trong trường hợp của bạn, container khác đang hỗ trợ xây dựng Gitlab:

services: 
    - docker:dind 

Nếu tôi không sai, các máy chủ của nó tên là docker. Vì vậy, quyền truy cập như thế này:

echo "Hello world" | nc docker 8800 

Để tìm ra các máy chủ của daemon Docker là gì, sử dụng này:

script: 
    - echo $DOCKER_HOST 
+2

Điều đó đã xảy ra. Bạn đang 2 cho 2 câu hỏi Docker gần đây của tôi. :-) Tiền thưởng trong ~ 23 giờ. –

+0

Rất vui khi biết điều đó! @CraigOtis, cảm ơn rất nhiều;)! – Robert

Các vấn đề liên quan