SSHアクセスでDockerコンテナをデプロイする方法 - TechRepublic

SSHアクセスでDockerコンテナをデプロイする方法 - TechRepublic
docker-ssh-access-チュートリアル
画像: ultramcu/Adobe Stock

コンテナが稼働中の場合、コマンドを実行したりメンテナンス作業を行ったりするために、そのコンテナに接続しなければならない場合があります。もちろん、 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ログインを無効にすることを忘れないでください。安全第一に、万全を期しましょう。

Tagged: