Bagaimana cara SSH ke Docker?

90

Saya ingin membuat aliran infrastruktur berikut:

Bagaimana itu bisa dicapai dengan menggunakan Docker?

Kamil Lelonek
sumber

Jawaban:

70

Pertama, Anda perlu menginstal server SSH di gambar yang ingin Anda ssh-in. Anda dapat menggunakan gambar dasar untuk semua penampung Anda dengan server ssh terpasang. Kemudian Anda hanya perlu menjalankan setiap kontainer yang memetakan port ssh (default 22) ke satu port host (Server Jarak Jauh di gambar Anda), menggunakan -p <hostPort>:<containerPort>. yaitu:

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

Kemudian, jika port 52022 dan 53022 host dapat diakses dari luar, Anda dapat langsung ssh ke container menggunakan ip host (Server Jarak Jauh) yang menentukan port di ssh dengan -p <port>. Yaitu:

ssh -p 52022 myuser@RemoteServer -> SSH ke container1

ssh -p 53022 myuser@RemoteServer -> SSH ke container2

Javier Cortejoso
sumber
Dan bagaimana cara mengekspos pelabuhan ini ke dunia luar? Maksud saya, apakah ada kemungkinan untuk mengkonfigurasinya tanpa nginx?
Kamil Lelonek
2
@squixy: mereka hanyalah port pada host Anda; buka saja dengan cara yang sama seperti untuk aplikasi lain. Ini mungkin hanya berfungsi, atau Anda mungkin perlu membuka port di firewall Anda.
Adrian Mouat
Saya mengerti, saya hanya ingin tahu cara terbaik untuk memetakan nama domain ke port, tetapi saya percaya bahwa NginX adalah solusi yang dapat saya terapkan dengan mudah.
Kamil Lelonek
Apa itu container1? Ketika saya melakukan "buruh pelabuhan <nama>" <nama> diartikan sebagai nama gambar, jadi buruh pelabuhan mencari gambar dalam repo. ID penampung saya tidak berfungsi dengan pengoperasian buruh pelabuhan. Saya menggunakan "docker start <containerID>" untuk memulai container, tetapi docker start tidak menerima parameter -p.
mvmn
1
Jika pengguna Docker adalah "root" maka Anda harus memberikan kata sandi untuk root pengguna melalui "passwd root". Saya juga menemukan ini berfungsi: docker run -p 52022: 22 container1 service ssh start -D FOREGROUND
CMP
42

Perhatian : jawaban ini mempromosikan alat yang saya tulis.

Jawaban yang dipilih di sini menyarankan untuk menginstal server SSH ke setiap gambar. Secara konseptual, ini bukanlah pendekatan yang tepat ( https://docs.docker.com/articles/dockerfile_best-practices/ ).

Saya telah membuat server SSH dalam container yang dapat Anda 'tempel' ke container apa pun yang sedang berjalan. Dengan cara ini Anda dapat membuat komposisi dengan setiap penampung. Satu-satunya persyaratan adalah wadah tersebut memiliki bash.

Contoh berikut akan memulai server SSH yang diekspos pada port 2222 mesin lokal.

$ 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

Untuk petunjuk dan dokumentasi lebih lanjut, lihat: https://github.com/jeroenpeeters/docker-ssh

Ini tidak hanya mengalahkan gagasan satu proses per kontainer, ini juga merupakan pendekatan yang rumit saat menggunakan gambar dari Docker Hub karena mereka sering tidak (dan seharusnya) tidak berisi server SSH.

Jeroen Peeters
sumber
6
Ini harus menjadi jawaban yang benar. Menginstal server SSH ke setiap gambar yang Anda inginkan bertentangan dengan kebutuhan buruh pelabuhan. Anda seharusnya hanya memiliki satu layanan per kontainer dan harus membuat aplikasi dari layanan / kontainer.
babbata
2
@JeroenPeeters Saya rasa prasyarat lain adalah "Soket Docker dipetakan ke dalam wadah, ini memungkinkan wadah mengakses Mesin Docker."
Nam G VU
1
Apa itu 'jeroenpeeters' pada perintah di atas? Apakah itu nama pengguna di penampung?
Pratik Patil
1
@PratikPatil bagian dari nama gambar. hub.docker.com/r/jeroenpeeters/docker-ssh
Jeroen Peeters
13

File-file ini akan berhasil membuka sshd dan menjalankan layanan sehingga Anda dapat melakukan ssh secara lokal. (Anda menggunakan cyberduck bukan?)

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

untuk membangun / menjalankan mulai daemon / melompat ke shell.

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

masukkan deskripsi gambar di sini

johndpope
sumber
2
Hei, jawaban yang bagus. Container saya muncul dan meminta saya untuk login, tetapi apakah kredensial "root" dan "password"? Sepertinya itu tidak berhasil untuk saya, tetapi saya suka solusi Anda, dan saya ingin menggunakannya.
Jabari Dash
tidak yakin - Saya mengalami masalah saat menekan port 22 - pastikan Anda menggunakan port 2222 karena sering kali hal-hal dapat dibuka di perangkat lokal untuk konflik dengan port tersebut.
johndpope
baris ini ('PermitRootLogin without-password') di / etc / ssh / sshd_config dikomentari secara default, jadi gunakan 's / # PermitRootLogin without-password / PermitRootLogin yes /' sebagai gantinya. Anda mungkin juga harus menggunakan 'larangan-kata sandi' daripada 'tanpa-kata sandi' untuk Ubuntu 16.04+. Anda dapat memastikan exec ke dalam wadah untuk memeriksa terlebih dahulu.
ItsJack
10

Saya kira itu mungkin. Anda hanya perlu menginstal server SSH di setiap penampung dan mengekspos porta pada host. Gangguan utama akan mempertahankan / mengingat pemetaan port to container.

Namun, saya harus mempertanyakan mengapa Anda ingin melakukan ini. SSH'ng ke dalam container seharusnya cukup langka sehingga tidak merepotkan untuk melakukan ssh ke host kemudian gunakan docker exec untuk masuk ke dalam container.

Adrian Mouat
sumber
Jadi saya ingin memodelkan lingkungan saya dengan cara saya membuat kontainer per proyek. Jadi setiap proyek memiliki lingkungannya sendiri, pengguna, database, versi python / ruby ​​dan sebagainya. Saya ingin mengisolasi proyek tanpa membuat banyak server.
Kamil Lelonek
1
@tokopedia baik. Biasanya kontainer buruh pelabuhan hanya menampung satu proses - secara idiomatis Anda harus memiliki wadah terpisah untuk mysql, php dan apache. Saya tidak yakin seberapa baik ini akan berhasil untuk Anda.
Adrian Mouat
Saya tahu, apakah Anda tahu solusi yang lebih baik untuk kasus saya?
Kamil Lelonek
1
@squixy itu tergantung pada banyak hal. Saya akan merekomendasikan memecah setiap wadah menjadi beberapa wadah. Untuk apa Anda membutuhkan ssh? Jika ini hanya pemeliharaan, mengapa Anda tidak dapat melakukan ssh ke dalam host lalu docker exec? Ini pertanyaan yang terlalu besar untuk dijawab dalam komentar.
Adrian Mouat
Seperti yang ditulis Adrian, setelah Anda terbiasa menggunakan Docker, Anda menyadari bahwa container! = Mesin virtual. Secara virtual (permainan kata-kata) tidak perlu mendapatkan akses interaktif untuk menjalankan kontainer.
mzedeler
8

Buat gambar buruh pelabuhan dengan openssh-serverprainstal:

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"]

Bangun gambar menggunakan:

$ docker build -t eg_sshd .

Jalankan test_sshdwadah:

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

0.0.0.0:49154

Ssh ke penampung Anda:

$ ssh [email protected] -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#

Sumber: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image

nama pengguna
sumber
Perlu disebutkan bahwa untuk mac os x Anda dapat mencoba ssh root@localhost -p <ssh_host_port>mengikuti petunjuk di sini
Claudio Santos