DockerにSSHで接続する方法は?


回答:


68

まず、ssh-intoするイメージにSSHサーバーをインストールする必要があります。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 -> container1へのSSH

ssh -p 53022 myuser@RemoteServer -> container2へのSSH


そして、これらのポートを外の世界に公開する方法は?nginxなしで設定できる可能性があるのでしょうか?
カミルレロネック2015年

2
@squixy:これらはホスト上の単なるポートです。他のアプリケーションと同じ方法でそれらを公開するだけです。正常に機能する場合もあれば、ファイアウォールでポートを開く必要がある場合もあります。
エイドリアンムアット2015年

ドメイン名をポートにマッピングする最良の方法は何だろうと思いますが、NginXは簡単に実装できるソリューションだと思います。
カミルレロネック2015年

container1とは何ですか?「dockerrun <name>」を実行すると、<name>はイメージ名として解釈されるため、dockerはリポジトリ内のイメージを検索します。コンテナIDがdockerrunで機能しません。「dockerstart <containerID>」を使用してコンテナーを開始しましたが、dockerstartは-pパラメーターを受け入れません。
mvmn 2016年

1
Dockerユーザーが「root」の場合、「passwdroot」を介してユーザーrootにパスワードを与える必要があります。また、これが機能することもわかりました。dockerrun -p 52022:22 container1 service ssh start -D FOREGROUND
CMP

42

注意:この回答は、私が作成したツールを宣伝しています。

ここで選択した回答は、SSHサーバーをすべてのイメージにインストールすることを提案しています。概念的には、これは正しいアプローチではありません(https://docs.docker.com/articles/dockerfile_best-practices/)。

実行中のコンテナに「固定」できるコンテナ化されたSSHサーバーを作成しました。このようにして、すべてのコンテナでコンポジションを作成できます。唯一の要件は、コンテナーにbashがあることです。

次の例では、ローカルマシンのポート2222で公開されているSSHサーバーを起動します。

$ 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を参照してください。

これは、コンテナーごとに1つのプロセスという考えを打ち破るだけでなく、Docker Hubからのイメージを使用する場合、SSHサーバーを含まない(含まない)ことが多いため、面倒なアプローチでもあります。


6
これが正解です。必要なすべてのイメージにSSHサーバーをインストールすると、Dockerの粒度に反します。コンテナごとに1つのサービスのみが必要であり、サービス/コンテナからアプリケーションを作成する必要があります。
babbata 2015年

2
@JeroenPeetersもう1つの前提条件は、「Dockerソケットがコンテナーにマップされているため、コンテナーがDockerエンジンにアクセスできるようになる」ことだと思います。
Nam G VU 2017

1
上記のコマンドの「jeroenpeeters」とは何ですか?コンテナのユーザー名ですか?
Pratik Patil 2018

1
@PratikPatilは画像名の一部です。hub.docker.com/r/jeroenpeeters/docker-ssh
Jeroen Peeters

13

これらのファイルは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"]

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
ねえ、いい答え。コンテナが起動し、ログインを求められますが、資格情報は「root」と「password」ですか?それは私にはうまくいかないようですが、私はあなたの解決策が好きで、それを使いたいです。
ジャバリダッシュ

わからない-ポート22を押すのに問題が発生しました-ポート2222を使用するようにしてください。ローカルデバイスで開いていることが多く、そのポートと競合する可能性があります。
johndpope

/ etc / ssh / sshd_configのこの行( 'PermitRootLogin without-password')はデフォルトでコメントアウトされているため、代わりに 's /#PermitRootLogin without-password / PermitRootLogin yes /'を使用してください。Ubuntu 16.04以降では、「パスワードなし」の代わりに「prohibit-password」を使用する必要がある場合もあります。コンテナに実行して事前に確認することができます。
ItsJack

10

可能だと思います。各コンテナにSSHサーバーをインストールし、ホストのポートを公開する必要があります。主な煩わしさは、ポートからコンテナへのマッピングを維持/記憶することです。

しかし、なぜあなたがこれをしたいのか疑問に思う必要があります。コンテナーへのSSH接続は、ホストにsshしてから、dockerexecを使用してコンテナーに入るのに手間がかからないほどまれなはずです。


そのため、プロジェクトごとにコンテナを作成する方法で環境をモデル化したいと思います。したがって、各プロジェクトには、独自の環境、ユーザー、データベース、Python / Rubyバージョンなどがあります。複数のサーバーを作成せずにプロジェクトを分離したい。
カミルレロネック2015年

1
@squixy; OK。通常、Dockerコンテナーは単一のプロセスのみを保持します。慣例的には、mysql、php、およびapache用に別々のコンテナーが必要です。これがあなたにとってどれほどうまくいくかはわかりません。
エイドリアンムアット2015年

私は知っています、あなたは私の場合のより良い解決策を知っていますか?
カミルレロネック2015年

1
@squixyそれは多くのものに依存します。各コンテナを複数のコンテナに分割することをお勧めします。何のためにsshが必要ですか?メンテナンスだけの場合、ホストにSSHで接続してからdockerexecを実行できないのはなぜですか。恐れ入りますが、コメントで答えるには大きすぎる質問です。
エイドリアンムアット2015年

エイドリアンが書いているように、Dockerを使いこなすと、コンテナ!=仮想マシンであることがわかります。実行中のコンテナにインタラクティブにアクセスする必要は事実上(しゃれを意図した)ありません。
mzedeler 2015年

8

openssh-serverプリインストールされたDockerイメージを作成します。

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


mac os xの場合は、こちらのssh root@localhost -p <ssh_host_port>手順に従ってください
Claudio Santos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.