次のインフラストラクチャフローを作成したいと思います。
Dockerを使用してそれをどのように達成できますか?
回答:
まず、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
注意:この回答は、私が作成したツールを宣伝しています。
ここで選択した回答は、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サーバーを含まない(含まない)ことが多いため、面倒なアプローチでもあります。
これらのファイルは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
可能だと思います。各コンテナにSSHサーバーをインストールし、ホストのポートを公開する必要があります。主な煩わしさは、ポートからコンテナへのマッピングを維持/記憶することです。
しかし、なぜあなたがこれをしたいのか疑問に思う必要があります。コンテナーへのSSH接続は、ホストにsshしてから、dockerexecを使用してコンテナーに入るのに手間がかからないほどまれなはずです。
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 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