web-dev-qa-db-ja.com

DockerにSSHで接続するには?

次のインフラストラクチャフローを作成したいと思います。

Dockerを使用してどのように達成できますか?

71
Kamil Lelonek

まず、ssh-intoしたいイメージにSSHサーバーをインストールする必要があります。 sshサーバーがインストールされているすべてのコンテナーに基本イメージを使用できます。次に、-p <hostPort>:<containerPort>を使用して、sshポート(デフォルトでは22)をホストのポート(イメージ内のリモートサーバー)にマッピングする各コンテナーを実行するだけです。すなわち:

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

ホストのポート52022および53022が外部からアクセスできる場合、ホストのIP(リモートサーバー)を使用して、sshのポートを-p <port>で指定してコンテナに直接sshできます。つまり:

ssh -p 52022 myuser@RemoteServer-> container1へのSSH

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

55

注意:この回答は、私が書いたツールを促進します。

ここで選択した回答は、すべてのイメージに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からのイメージを使用するときの面倒なアプローチでもあります。

31
Jeroen Peeters

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

enter image description here

11
johndpope

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

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

10
Adrian Mouat

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 [email protected] -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#

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

7
username