2017-07-29 24 views
6

के अंदर बनाए गए डॉकर-कंपोज़ कंटेनर तक पहुंचने में असमर्थ मेरे पास 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 

यदि मैं गलत नहीं हूँ, अपने मेजबान:

+0

यह बात यह है कि "अंदर" डोकर अभी भी बाहर डोकर इंजन पर चलता है - तो बंदरगाह बांध वास्तव में "रूट" मेजबान मशीन के localhost से बांधता है। हालांकि आपको डॉकर-कंपोज़ फ़ाइल में उपयोग करने के लिए डॉकर नेटवर्क निर्दिष्ट करने में सक्षम होना चाहिए और इसे गिटलैब कंटेनर से डॉकर नेटवर्क से जुड़ा हुआ सेट करने के लिए सेट करना चाहिए। आप मेरी पिछली टिप्पणी में 'एनसी इको-सर्वर 8800' –

+0

से कनेक्ट करने में सक्षम होंगे, संभवतः गिटलैब कंटेनर' ब्रिज 'नेटवर्क का उपयोग करेगा। अपने docker-compose.yml में 'echo-server' में' network_mode: bridge' जोड़ें। फिर आदेशों को 'एनसी इको-सर्वर 8800' में बदलें। यह अभी भी डोमेन नाम को हल नहीं कर सकता है। उस स्थिति में आप '$ (डॉकर निरीक्षण-एफ '{{श्रेणी .NetworkSettings.Networks}} {{के माध्यम से आईपी प्राप्त कर सकते हैं।IPAddress}} {{end}} 'echo-server) ' –

+0

हाय @ लुकासडोलेज़ल, मुझे पूरा यकीन नहीं है कि यह मामला है। यदि मैं "रूट" होस्ट मशीन पर 'डॉकर पीएस' चलाता हूं, तो मुझे दो कंटेनर दिखाई देते हैं - 'डॉकर: डिंड' सेवा, और 'डॉकर: नवीनतम' छवि। यदि मैं 'डॉकर: डाइंड' कंटेनर के अंदर 'डॉकर पीएस' चलाता हूं, तो मुझे 'डॉकर-कंपोज़' द्वारा शुरू किए गए तीन कंटेनर दिखाई देते हैं - इसलिए कंटेनर के दो सेट स्वतंत्र लगते हैं। इसके अलावा, मैं "रूट" होस्ट (मेरे मैक) से '8800' पर वेब सेवा तक नहीं पहुंच सकता, भले ही मुझे पता चल जाए कि यह चल रहा है। (लेकिन अगर मैं सिर्फ 'डॉकर-कंपोज़' को मैन्युअल रूप से चलाता हूं, जैसा कि प्रश्न के शीर्ष पर देखा गया है।) –

उत्तर

6

कंटेनर "डोकर मेजबान" जो है, आपके मामले में, अन्य कंटेनर कि Gitlab निर्माण समर्थन कर रहा है पर चल रहा है नाम docker है। तो इस के रूप में उपयोग कर सकते:

echo "Hello world" | nc docker 8800 

पता लगाने के लिए डोकर डेमॉन के मेजबान है क्या, इस का उपयोग करें:

script: 
    - echo $DOCKER_HOST 
+2

उसने ऐसा किया। मेरे हालिया डॉकर प्रश्नों पर आप 2 के लिए 2 हैं। :-) ~ 23 घंटे में बाउंटी। –

+0

सुनकर खुशी हुई! @ क्रेगेटिस, बहुत धन्यवाद;)! – Robert