के अंदर बनाए गए डॉकर-कंपोज़ कंटेनर तक पहुंचने में असमर्थ मेरे पास docker-compose.yml
फ़ाइल है जो पोर्ट 8800
पर एक साधारण HTTP इको सेवा शुरू करती है।डॉकर
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
तब मैं गूंज देखते हैं। हालांकि: यदि मैं गिटलैब धावक के माध्यम से एक डॉकर कंटेनर के अंदर एक ही रचना परिदृश्य चलाता हूं, तो यह विफल हो जाता है।
मैं यहाँ 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
तो ऐसा लगता है जैसे ये बंदरगाह डॉकर कंटेनर के अंदर उपलब्ध नहीं हैं, जो डॉक के प्रभारी हैं आर-रचना सेवाओं। क्या मुझसे कुछ गलत हो रही है?
मुझे क्या करना मेजबान स्तर पर उजागर बंदरगाहों नहीं चाहते हैं, बल्कि मैं तो बस बंदरगाहों डोकर निर्माण, कि कंटेनर के लिए उपलब्ध चल कंटेनर द्वारा खोला चाहते हैं।
Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800
^Not here ^I want port 8800 accessible here
संपादित करें: इसके अलावा, अगर मैं चल रहा सीआई कंटेनर के लिए एक खोल देते हैं, मैं देख रहा हूँ:
/ # 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
यदि मैं गलत नहीं हूँ, अपने मेजबान:
यह बात यह है कि "अंदर" डोकर अभी भी बाहर डोकर इंजन पर चलता है - तो बंदरगाह बांध वास्तव में "रूट" मेजबान मशीन के localhost से बांधता है। हालांकि आपको डॉकर-कंपोज़ फ़ाइल में उपयोग करने के लिए डॉकर नेटवर्क निर्दिष्ट करने में सक्षम होना चाहिए और इसे गिटलैब कंटेनर से डॉकर नेटवर्क से जुड़ा हुआ सेट करने के लिए सेट करना चाहिए। आप मेरी पिछली टिप्पणी में 'एनसी इको-सर्वर 8800' –
से कनेक्ट करने में सक्षम होंगे, संभवतः गिटलैब कंटेनर' ब्रिज 'नेटवर्क का उपयोग करेगा। अपने docker-compose.yml में 'echo-server' में' network_mode: bridge' जोड़ें। फिर आदेशों को 'एनसी इको-सर्वर 8800' में बदलें। यह अभी भी डोमेन नाम को हल नहीं कर सकता है। उस स्थिति में आप '$ (डॉकर निरीक्षण-एफ '{{श्रेणी .NetworkSettings.Networks}} {{के माध्यम से आईपी प्राप्त कर सकते हैं।IPAddress}} {{end}} 'echo-server) ' –
हाय @ लुकासडोलेज़ल, मुझे पूरा यकीन नहीं है कि यह मामला है। यदि मैं "रूट" होस्ट मशीन पर 'डॉकर पीएस' चलाता हूं, तो मुझे दो कंटेनर दिखाई देते हैं - 'डॉकर: डिंड' सेवा, और 'डॉकर: नवीनतम' छवि। यदि मैं 'डॉकर: डाइंड' कंटेनर के अंदर 'डॉकर पीएस' चलाता हूं, तो मुझे 'डॉकर-कंपोज़' द्वारा शुरू किए गए तीन कंटेनर दिखाई देते हैं - इसलिए कंटेनर के दो सेट स्वतंत्र लगते हैं। इसके अलावा, मैं "रूट" होस्ट (मेरे मैक) से '8800' पर वेब सेवा तक नहीं पहुंच सकता, भले ही मुझे पता चल जाए कि यह चल रहा है। (लेकिन अगर मैं सिर्फ 'डॉकर-कंपोज़' को मैन्युअल रूप से चलाता हूं, जैसा कि प्रश्न के शीर्ष पर देखा गया है।) –