
コンテナが稼働中の場合、コマンドを実行したりメンテナンス作業を行ったりするために、そのコンテナに接続しなければならない場合があります。もちろん、 docker exec -it CONTAINER_ID bashコマンド(CONTAINER_IDはコンテナの実際のID)を使えば、いつでも稼働中のコンテナにアクセスできます。しかし、これらのコンテナにSSH接続するにはどうすればいいのでしょうか?そして、SSH接続は必要なのでしょうか?そこが問題です。
問題は、コンテナには可動部分が多いため、安全性が確保できない可能性があることです。そのため、本番環境ではコンテナへのSSH接続を許可しない方が良いでしょう。しかし、開発環境やテスト環境では、SSH接続は大きな助けとなる可能性があります。
それでは、DockerコンテナにSSH接続を設定する方法をご紹介します。最新のUbuntuイメージを使って説明します。
参照: 採用キット: バックエンド開発者 (TechRepublic Premium)
必要なもの
これを機能させるには、選択した Linux ディストリビューションに Docker の実行インスタンスをインストールする必要があります。
以上です。Docker/SSH マジックを実際に使ってみましょう。
必要なDockerfileを作成する方法
まず最初に、コンテナをデプロイするためのDockerfileを作成します。Linuxサーバーにログインし、次のコマンドを実行します。
nano Dockerfile
そのファイルに次の内容を貼り付けます。
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:PASSWORD' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
PASSWORD
強力/一意のパスワードはどこにありますか。
ファイルを保存して閉じます。
イメージをビルドしてコンテナをデプロイする方法
次のコマンドを使用して、Dockerfile からイメージをビルドできるようになりました。
sudo docker build -t sshd_ubuntu .
上記のコマンドは、(Dockerfile で) openssh-server パッケージをインストールし、いくつかの追加コマンド (ルート パスワードを設定し、ルート SSH ログインを有効にする) を実行するように指示しているため、完了するまでに多少時間がかかります。
次に、次のコマンドでコンテナをデプロイできます。
docker run -d -P --name test_sshd sshd_ubuntu
実行中のコンテナのIPアドレスを見つける方法
コンテナがデプロイされたら、実行中のコンテナの IP アドレスを見つける必要があります。これは次のコマンドで実行します。
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test_sshd
上記のコマンドの出力は次のようになります。
172.17.0.15
実行中のコンテナにSSH接続する方法
ホストマシンから次のコマンドを発行します。
ssh root@IP
実行中のコンテナのIPアドレスはどこにIP
ありますか?Dockerfileで設定されたルートユーザーのパスワードを入力するよう求められます。認証に成功すると、実行中のコンテナのプロンプトが表示されます。
ただし、SSH デーモンがアクセスを許可しない場合は、イメージのビルド プロセス中に root パスワードが設定されなかったか、root SSH アクセスが有効になっていなかったことを意味します。
コンテナにアクセスして手動で変更できるので、問題ありません。そのためには、まず実行中のコンテナのIDを見つける必要があります。そのためには、以下のコマンドを実行してください。
docker ps -a
sshd_ubuntu という名前のコンテナとそのIDが表示されます。実行中のコンテナにアクセスするには、次のコマンドを実行します。
docker exec -it ID bash
sshd_ubuntuコンテナに関連付けられたコンテナIDはどこにID
ありますか?コンテナに入ったら、次のコマンドを実行します。
passwd
次に、次のコマンドでnanoをインストールします。
apt-get install nano -y
次のコマンドで SSH デーモン構成ファイルを開きます。
nano /etc/ssh/sshd_config
そのファイルで、次の行のコメントを解除します。
#PermitRootLogin yes
その行は次のようになります。
PermitRootLogin yes
次のコマンドで SSH デーモンを再起動します。
/usr/sbin/sshd -D
コンテナを終了すると、実行中のコンテナに問題なく SSH 接続できるようになります。
Dockerコンテナ開発者の方は、コンテナとイメージの開発を少しでも効率化するために、このちょっとしたコツをご検討ください。ただし、本番環境にデプロイするコンテナでは、root SSHログインを無効にすることを忘れないでください。安全第一に、万全を期しましょう。