डॉकटर में एसएसएच कैसे करें?


90

मैं निम्नलिखित इंफ्रास्ट्रक्चर फ्लो बनाना चाहता हूँ:

डॉकर का उपयोग करके इसे कैसे प्राप्त किया जा सकता है?

जवाबों:


70

सबसे पहले आपको उन छवियों में एक SSH सर्वर स्थापित करना होगा जो आप ssh-में चाहते हैं। आप स्थापित किए गए ssh सर्वर के साथ अपने सभी कंटेनर के लिए आधार छवि का उपयोग कर सकते हैं। तब आपको केवल होस्ट के बंदरगाहों (आपकी छवि में दूरस्थ सर्वर) का उपयोग करके प्रत्येक कंटेनर को ssh पोर्ट (डिफ़ॉल्ट 22) को मैप करना होगा -p <hostPort>:<containerPort>। अर्थात:

docker run -p 52022:22 container1 
docker run -p 53022:22 container2

तब, यदि होस्ट से 52022 और 53022 पोर्ट बाहर से पहुँच योग्य हैं, तो आप सीधे होस्ट (रिमोट सर्वर) के आईपी का उपयोग करके कंटेनरों में ssh को पोर्ट के साथ निर्दिष्ट कर सकते हैं -p <port>। अर्थात:

ssh -p 52022 myuser@RemoteServer -> SSH से लेकर कंटेनर 1 तक

ssh -p 53022 myuser@RemoteServer -> SSH से लेकर कंटेनर 2 तक


और इन बंदरगाहों को बाहरी दुनिया में कैसे उजागर किया जाए? अगर nginx के बिना इसे कॉन्फ़िगर करने की संभावना है तो मेरा मतलब है?
कामिल लेलोनेक

2
@squixy: वे आपके होस्ट पर केवल पोर्ट हैं; बस उन्हें अन्य अनुप्रयोगों के लिए उसी तरह से उजागर करें। यह सिर्फ काम कर सकता है, या आपको अपने फ़ायरवॉल में पोर्ट खोलने की आवश्यकता हो सकती है।
एड्रियन मौट

मुझे लगता है कि, मुझे आश्चर्य है कि डोमेन नाम को बंदरगाहों में मैप करने का सबसे अच्छा तरीका क्या है, लेकिन मेरा मानना ​​है कि NginX वह समाधान है जिसे मैं आसानी से लागू कर सकता हूं।
कामिल लेलोनेक

कंटेनर 1 क्या है? जब मैं "docker run <name>" करता हूं, तो <name> की छवि नाम के रूप में व्याख्या की जा रही है, इसलिए docker repos में छवि की तलाश करता है। मेरा कंटेनर ID डॉक रन के साथ काम नहीं करता है। मैं कंटेनर शुरू करने के लिए "docker start <containerID>" का उपयोग करता हूं, लेकिन docker प्रारंभ -p पैरामीटर को स्वीकार नहीं करता है।
mvmn

1
यदि डॉक उपयोगकर्ता "रूट" है, तो आपको उपयोगकर्ता पासवर्ड को "पासवार्ड रूट" के माध्यम से देना होगा। इसके अलावा मुझे यह काम मिला: docker run -p 52022: 22 कंटेनर 1 सर्विस ssh स्टार्ट -D FOREGROUND
CMP

42

सूचना : यह उत्तर मेरे द्वारा लिखे गए टूल को बढ़ावा देता है।

यहां चयनित उत्तर हर छवि में एक SSH सर्वर स्थापित करने का सुझाव देता है। वैचारिक रूप से यह सही तरीका नहीं है ( https://docs.docker.com/articles/dockerfile_best-practices/ )।

मैंने एक कंटेनरीकृत SSH सर्वर बनाया है जिसे आप किसी भी चल रहे कंटेनर से 'स्टिक' कर सकते हैं। इस तरह आप हर कंटेनर के साथ रचनाएँ बना सकते हैं। केवल आवश्यकता यह है कि कंटेनर में बैश हो।

निम्न उदाहरण स्थानीय मशीन के पोर्ट 2222 पर उजागर एक एसएसएच सर्वर शुरू करेगा।

$ docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

$ ssh -p 2222 localhost

अधिक पॉइंटर्स और डॉक्यूमेंटेशन के लिए देखें: https://github.com/jeroenpeeters/docker-ssh

न केवल यह प्रति कंटेनर एक प्रक्रिया के विचार को पराजित करता है, यह डॉकटर हब से छवियों का उपयोग करते समय एक बोझिल दृष्टिकोण भी है क्योंकि वे अक्सर एसएसएच सर्वर को शामिल नहीं करते (और नहीं करना चाहिए)।


6
यह सही उत्तर होना चाहिए। आप चाहते हैं कि हर छवि में SSH सर्वर स्थापित करना docker के अनाज के खिलाफ जाता है। आपके पास प्रति कंटेनर केवल एक सेवा होनी चाहिए और सेवाओं / कंटेनरों से एप्लिकेशन की रचना होनी चाहिए।
बब्बाटा

2
@JeroenPeeters मुझे लगता है कि "डॉकटर सॉकेट को कंटेनर में मैप किया गया है, यह एक और शर्त है कि यह कंटेनर को डॉकर इंजन तक पहुंचने देता है।"
नाम जी वीयू

1
उपरोक्त कमांड में command जीरोएनेपेटर्स ’क्या है? क्या यह कंटेनर पर उपयोगकर्ता नाम है?
प्रतीक पाटील

1
@PratikPatil छवि नाम का अपना हिस्सा। hub.docker.com/r/jeroenpeeters/docker-ssh
Jeroen Peeters

13

ये फाइलें सफलतापूर्वक sshd और रन सर्विस खोलेंगी ताकि आप स्थानीय स्तर पर ssh कर सकें। (आप साइबरबक का उपयोग कर रहे हैं आप नहीं हैं?)

Dockerfile

FROM swiftdocker/swift
MAINTAINER Nobody

RUN apt-get update && apt-get -y install openssh-server supervisor
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 22
CMD ["/usr/bin/supervisord"]

supervisord.conf

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

प्रारंभ डेमॉन बनाने / चलाने / शेल में कूदने के लिए।

docker build -t swift3-ssh .  
docker run -p 2222:22 -i -t swift3-ssh
docker ps # find container id
docker exec -i -t <containerid> /bin/bash

यहाँ छवि विवरण दर्ज करें


2
अरे, अच्छा जवाब। मेरा कंटेनर आता है और यह मुझे लॉग इन करने के लिए प्रेरित करता है, लेकिन क्या क्रेडेंशियल "रूट" और "पासवर्ड" हैं? यह मेरे लिए काम नहीं करता है, लेकिन मुझे आपका समाधान पसंद है, और मैं इसका उपयोग करना चाहता हूं।
जाबरी डैश

यकीन नहीं है - मैं पोर्ट 22 को टकराने की समस्या में भाग गया - सुनिश्चित करें कि आप पोर्ट 2222 का उपयोग करते हैं क्योंकि अक्सर उस पोर्ट के साथ संघर्ष करने के लिए स्थानीय डिवाइस पर चीजें खुली हो सकती हैं।
जॉन्डपोप

इस पंक्ति ('PermitRootLogin without-password') में / etc / ssh / sshd_config डिफ़ॉल्ट रूप से टिप्पणी है, इसलिए इसके बजाय 's / # PermitRootLogin बिना पासवर्ड / PermitRootLogin हां /' का उपयोग करें। आपको Ubuntu 16.04+ के लिए 'बिना-पासवर्ड' के बजाय 'निषेध-पासवर्ड' का उपयोग करना पड़ सकता है। आप पहले से जांच करने के लिए कंटेनर में निष्पादित कर सकते हैं।
इसका जेक

10

मुझे लगता है कि यह संभव है। आपको बस प्रत्येक कंटेनर में एक एसएसएच सर्वर स्थापित करने और होस्ट पर एक पोर्ट को उजागर करने की आवश्यकता है। कंटेनर को पोर्ट की मैपिंग को याद रखने पर मुख्य झुंझलाहट बनी रहेगी।

हालाँकि, मुझे यह सवाल करना होगा कि आप ऐसा क्यों करना चाहते हैं। कंटेनरों में SSH'ng काफी दुर्लभ होना चाहिए कि यह मेजबान को बोने के लिए एक परेशानी नहीं है, फिर कंटेनर में जाने के लिए डॉक निष्पादित का उपयोग करें।


इसलिए मैं अपने वातावरण को उस तरह से मॉडल करना चाहता हूं जिस तरह से मैं प्रति प्रोजेक्ट कंटेनर बनाता हूं। इसलिए प्रत्येक परियोजना का अपना वातावरण, उपयोगकर्ता, डेटाबेस, अजगर / रूबी संस्करण इत्यादि हैं। मैं एकाधिक सर्वर बनाए बिना परियोजनाओं को अलग करना चाहता हूं।
कामिल लेलोनेक

1
@squixy; ठीक। आम तौर पर डॉकटर कंटेनर केवल एक ही प्रक्रिया को पकड़ते हैं - मुहावरेदार रूप से आपके पास mysql, php और अपाचे के लिए अलग कंटेनर होना चाहिए। मुझे यकीन नहीं है कि यह आपके लिए कितना अच्छा काम करने वाला है।
एड्रियन मौट

मुझे पता है, क्या आप मेरे मामले के लिए बेहतर समाधान जानते हैं?
कामिल लेलोनेक

1
@squixy यह बहुत सी चीजों पर निर्भर करता है। मैं प्रत्येक कंटेनर को कई कंटेनरों में तोड़ने की सलाह दूंगा। आपको ssh के लिए क्या चाहिए? यदि यह सिर्फ रखरखाव है, तो आप मेजबान में ssh क्यों नहीं कर सकते? यह बहुत बड़ा सवाल है कि मैं एक टिप्पणी में जवाब देने से डरता हूं।
एड्रियन मौट

जैसा कि एड्रियन लिखते हैं, एक बार जब आपको डॉकर का उपयोग करने की फांसी मिल जाती है, तो आपको उस कंटेनर का एहसास होता है! = वर्चुअल मशीन। वस्तुतः (दंडित उद्देश्य) रनिंग कंटेनरों के लिए इंटरैक्टिव पहुँच प्राप्त करने की कोई आवश्यकता नहीं है।
माजेलर

8

openssh-serverपूर्वस्थापित के साथ डॉक चित्र बनाएँ :

Dockerfile

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

छवि का उपयोग कर बनाएँ:

$ docker build -t eg_sshd .

एक test_sshdकंटेनर चलाएँ :

$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22

0.0.0.0:49154

आपके कंटेनर में Ssh:

$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#

स्रोत: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image


यह उल्लेख के लायक है कि मैक ओएस एक्स के लिए आप यहांssh root@localhost -p <ssh_host_port> निर्देशों का
क्लाउडियो सैंटोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.