次のインフラストラクチャフローを作成したいと思います。
Dockerを使用してどのように達成できますか?
まず、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
注意:この回答は、私が書いたツールを促進します。
ここで選択した回答は、すべてのイメージに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からのイメージを使用するときの面倒なアプローチでもあります。
これらのファイルは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
可能だと思います。各コンテナにSSHサーバーをインストールし、ホストのポートを公開するだけです。主な問題は、ポートからコンテナへのマッピングを維持/記憶することです。
しかし、なぜこれをしたいのか疑問に思う必要があります。コンテナーへのSSH'ngは、ホストにsshし、その後docker execを使用してコンテナーに入るのに手間がかからないほどまれです。
openssh-server
がプリインストールされたdockerイメージを作成します。
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