ฉันต้องการสร้างขั้นตอนโครงสร้างพื้นฐานต่อไปนี้:
จะทำได้อย่างไรโดยใช้ Docker?
ฉันต้องการสร้างขั้นตอนโครงสร้างพื้นฐานต่อไปนี้:
จะทำได้อย่างไรโดยใช้ Docker?
คำตอบ:
ประการแรกคุณต้องติดตั้งเซิร์ฟเวอร์ SSH ในภาพที่คุณต้องการ ssh-into คุณสามารถใช้อิมเมจพื้นฐานสำหรับคอนเทนเนอร์ทั้งหมดของคุณโดยติดตั้งเซิร์ฟเวอร์ ssh จากนั้นคุณจะต้องรันคอนเทนเนอร์แต่ละตัวที่แมปพอร์ต ssh (ค่าเริ่มต้น 22) กับพอร์ตหนึ่งไปยังพอร์ตของโฮสต์ (เซิร์ฟเวอร์ระยะไกลในรูปภาพของคุณ) โดยใช้-p <hostPort>:<containerPort>
. กล่าวคือ:
docker run -p 52022:22 container1
docker run -p 53022:22 container2
แล้วถ้าพอร์ต 52022 และ 53022 ของโฮสต์สามารถเข้าถึงได้จากภายนอกคุณโดยตรงสามารถ ssh ตู้คอนเทนเนอร์โดยใช้ IP ของโฮสต์ (เซิร์ฟเวอร์ระยะไกล) ระบุในพอร์ต SSH -p <port>
กับ ได้แก่ :
ssh -p 52022 myuser@RemoteServer
-> SSH ไปยังคอนเทนเนอร์ 1
ssh -p 53022 myuser@RemoteServer
-> SSH ไปยังคอนเทนเนอร์ 2
หมายเหตุ : คำตอบนี้ส่งเสริมเครื่องมือที่ฉันเขียน
คำตอบที่เลือกในที่นี้แนะนำให้ติดตั้งเซิร์ฟเวอร์ SSH ลงในทุกอิมเมจ แนวคิดนี้ไม่ใช่แนวทางที่ถูกต้อง ( https://docs.docker.com/articles/dockerfile_best-practices/ )
ฉันได้สร้างเซิร์ฟเวอร์ SSH ที่มีคอนเทนเนอร์ซึ่งคุณสามารถ 'ยึดติด' กับคอนเทนเนอร์ที่กำลังทำงานอยู่ ด้วยวิธีนี้คุณสามารถสร้างองค์ประกอบในทุกคอนเทนเนอร์ ข้อกำหนดเพียงอย่างเดียวคือภาชนะที่มีการทุบตี
ตัวอย่างต่อไปนี้จะเริ่มต้นเซิร์ฟเวอร์ 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
สิ่งนี้ไม่เพียงเอาชนะแนวคิดของหนึ่งกระบวนการต่อคอนเทนเนอร์ แต่ยังเป็นวิธีการที่ยุ่งยากเมื่อใช้รูปภาพจาก Docker Hub เนื่องจากมักไม่มี (และไม่ควร) มีเซิร์ฟเวอร์ SSH
ไฟล์เหล่านี้จะเปิด sshd และเรียกใช้บริการได้สำเร็จเพื่อให้คุณสามารถ ssh ในเครื่องได้ (คุณใช้ Cyberduck ไม่ใช่เหรอ?)
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"]
Supervisor.conf
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
เพื่อสร้าง / รัน start daemon / กระโดดเข้าเชลล์
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
ฉันเดาว่ามันเป็นไปได้ คุณต้องติดตั้งเซิร์ฟเวอร์ SSH ในแต่ละคอนเทนเนอร์และแสดงพอร์ตบนโฮสต์ สิ่งที่น่ารำคาญหลักคือการรักษา / จดจำการแมปพอร์ตไปยังคอนเทนเนอร์
อย่างไรก็ตามฉันต้องตั้งคำถามว่าทำไมคุณถึงต้องการทำสิ่งนี้ SSH'ng ในคอนเทนเนอร์ควรหายากพอที่จะไม่ยุ่งยากในการ ssh ไปยังโฮสต์จากนั้นใช้ docker exec เพื่อเข้าไปในคอนเทนเนอร์
สร้างภาพนักเทียบท่าด้วยการopenssh-server
ติดตั้งล่วงหน้า:
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 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>
ทำตามคำแนะนำได้ที่นี่