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.
đ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' –
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) ' –
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.) –