トラブルシューティングを行う必要がある場合、またはDockerコンテナーを簡単に確認する必要がある場合は、SSHが最適なオプションです。 SSHを使用すると、実行中のコンテナにすばやく接続して、何が起こっているかを確認できます。ただし、Dockerコンテナーに接続するには、最初にいくつかのセットアップが必要であり、いくつかの異なるオプションがあります。
このチュートリアルでは、 docker run
を使用してDockerコンテナにSSHで接続する方法を学習します。 コマンドとDockerfile。
始めましょう!
前提条件
ステップバイステップでフォローしたい場合は、次のものがあることを確認してください。
- Linuxホスト。このチュートリアルでは、Ubuntu18.04.5LTSを使用します。
- LinuxホストにインストールされたDocker。このチュートリアルでは、Dockerv19.03.8を使用します。
docker run
を使用してコンテナを起動してDockerコンテナにSSHで接続する
docker run
commandは、新しいコンテナーが最初に起動したときにコマンドを実行するDockerコマンドです。 docker run
を使用する 、以下の手順を使用して、コンテナへのインタラクティブなSSHセッションを起動できます。
このセクションを開始する前に、Dockerイメージがダウンロードされて利用可能であることを確認してください。このチュートリアルでは、DockerHubで利用可能な最新のUbuntuDockerイメージを使用します。
docker run
を使用してDockerコンテナにSSHで接続するには :
1.ローカルマシンでターミナルを開きます。
2. docker run
を実行します コマンド提供:
名前コード> 実行するコンテナの数(
ubuntu_container_ssh
)-
i
コンテナへのインタラクティブSSHセッションを開くことを示すフラグ。i
コンテナが接続されていなくても、フラグはSSHセッションを閉じません。 -
t
flagは、コマンドをインタラクティブに実行するためによく使用される疑似TTYを割り当てます。 - コンテナを作成するためのベースイメージ(
ubuntu
。
# Creating the container named ubuntu_container_ssh and start a Bash session.
sudo docker run --name ubuntu_container_ssh -i -t ubuntu

この時点で、コンテナにSSHで接続され、必要なコマンドを実行できます。
3.次に、 touch
などのコマンドを実行します 指図。タッチコマンドは、 myfolder
という名前の新しいフォルダを作成します tmp 以下に示すように、ディレクトリ。
touch /tmp/myfolder

これで、好きなコマンドを実行できます!
最後に、コマンドの実行が終了したら、 exit
と入力します セッションを閉じます。
docker exec
を使用して実行中のDockerコンテナにSSHで接続する
前のセクションでは、新しいDockerコンテナを起動するときにSSHコマンドを実行する方法を学びました。しかし、すでに実行されているDockerコンテナーにSSHで接続する必要がある場合はどうでしょうか。 docker exec
を実行します コマンド。
docker exec
commandは、実行中のコンテナー内にBashシェルを作成し、SSHコマンドをコンテナーに送信するための優れた方法です。
このセクションを開始する前に、Dockerイメージがダウンロードされて利用可能であることを確認してください。このチュートリアルでは、DockerHubで利用可能な最新のNGINXDockerイメージを使用します。
docker exec
を使用して実行中のDockerコンテナにSSHで接続するには :
1.ローカルマシンでターミナルを開きます。
2.次に、 docker run
を実行します コンテナを起動するコマンド。必ず-d
を指定してください コンテナをバックグラウンドで実行して、コンテナを削除するまで存続させるためのフラグ。以下のコマンドは、 nginx-testing
というコンテナを起動します 。
sudo docker run --name nginx-testing -d nginx

3.ここで、docker psコマンドを実行して、コンテナーが実行されていることを確認します。 docker ps
コマンドは、Dockerホストで実行されているすべての実行中のコンテナーを一覧表示します。

4.最後に、 docker exec
を実行します 、以下に示すように、 nginx-testing
と呼ばれる実行中のコンテナにSSHで接続します 。以下のコードスニペット:
-
docker exec
コマンドが実行されます(/ bin / bash
)コンテナにBashシェルを取得します。 -それコード> flagを使用すると、コンテナをインタラクティブモードで実行できます。つまり、コンテナの実行中にコンテナ内でコマンドを実行できます。
-
nginx-testing
コンテナの名前です。
sudo docker exec -it nginx-testing /bin/bash

OpenSSHサーバーのセットアップとDockerfileとの接続
これまでのチュートリアルでは、SSHサーバーがすでにインストールされているコンテナに接続していることを前提としています。しかし、そうでない場合はどうなりますか?おそらく、使用しているイメージにOpenSSHがまだインストールされていないため、最初に構成する必要がありますか?
Dockerfileを使用すると、DockerコンテナーにSSHで接続するだけでなく、OpenSSHサーバーを最初からセットアップするために必要なすべてのタスクを構成できます。
ローカルターミナルがまだ開いていると仮定します:
1.オプションで、Dockerfileを保存するディレクトリを作成します。このチュートリアルでは、〜/ DockerFileContainerTestを使用します ディレクトリ。
2.お気に入りのテキストエディタを開き、以下のDockerfileをコピーして貼り付け、ファイルを Dockerfileとして保存します。 〜/ DockerFileContainerTest内 ディレクトリ。このDockerfileには、ベースイメージの上に新しいDockerイメージを構築し、OpenSSHをセットアップするためのすべてのコマンドと構成が含まれています。
DockerFile 以下に、コンテナを構築するためのさまざまな手順/手順を示します。
-
FROM
–ubuntu:16.04
を定義します 使用するベースイメージ。 -
RUN
–ベースイメージの上の新しいレイヤーでコマンドを実行します。 -
CMD
– CMDを使用すると、コマンドを実行できます。コマンドをexecまたはシェル形式を使用して実行する方法は2つあります。
-
EXPOSE
–コンテナーが実行時に指定されたネットワークポートでリッスンすることをDockerに通知します。コンテナはポット22
に公開されます 。
# Instruction for Dockerfile to create a new image on top of the base image (ubuntu)
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:mypassword' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed '[email protected]\s*required\s*[email protected] optional [email protected]' -i /etc/pam.d/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
3.次に、 docker build
を実行します Dockerイメージを作成するコマンド。 t
フラグは画像にタグを付けますsshd_container
および。
Dockerが現在の作業ディレクトリから必要なすべてのファイルを選択できるようにします。
# Building the docker Image
sudo docker build -t sshd_tagged_image .

4.次に、 docker images
を実行します 作成されたイメージを検査するコマンド。 リポジトリに注意してください 属性。この属性は、 -t
で作成されたタグです。 前のステップでフラグを立てます。

5. docker run
を実行します イメージからコンテナーを作成して実行し、Dockerにイメージをバックグラウンドで実行するように指示します( -d
)、
以下のコマンドは、Dockerに test_sshd_container
というコンテナーを作成して実行するように指示します。 バックグラウンドで( -d
)、 sshd_tagged_image
を使用 手順3で作成し、Dockerfileで定義されたすべてのポートをランダムポートとして公開するために新しく作成されたイメージ。
# Running the container using the newly built image
docker run -d -P --name test_sshd_container sshd_tagged_image
Docker runコマンドが正常に実行されると、コンテナIDが以下に生成されていることがわかります。

6. docker port
を実行します Dockerホストとコンテナー間のSSH接続を確認します。 docker port
コマンドリストは、コンテナのポートマッピングまたは特定のマッピングです。
sudo docker port test_sshd_container
22 / TCP→0.0.0.0:32769
の出力が表示されます。 、これは、コンテナのポート22が外部ポート 32769
にマップされていることを示します 。

7.次に、コンテナのIPアドレスを見つけます。これを行うには、 docker inspect
を実行します 指図。 docker inspect
コマンドはDocker情報を照会し、 format
を使用して結果をJSON配列でレンダリングします パラメータ。
format
が表示されます 以下のパラメータ引数はrange
を使用します NetworkSettings
をチェックインしてコンテナのIPアドレスを検索する属性 →ネットワーク
→IPAddress
。

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test_sshd_container

8.最後に、SSHで接続するIPアドレスを取得したので、コンテナーにSSHで接続してみてください。これで機能するはずです。
ssh [email protected]

結論
ここで、いくつかの異なるアプローチを使用してDockerコンテナーにSSHで接続するいくつかの方法を知っていることを示します。これらのアプローチのいずれかを使用すると、コンテナのトラブルシューティングと管理ができるはずです。
この新たに発見された知識を基に、今すぐコンテナにSSHで接続する予定はありますか?