Dockerコンテナを利用することで、アプリケーションの実行に便利な隔離された環境を確保することができます。そこでは、高いレベルでの一貫性と移植性が保証されます。Dockerコンテナで作業する際には、そのシェルの接続や検査が極めて重要です。そうすることで、コマンドの実行、問題のトラブルシューティング、コンテナの動作のリアルタイム監視が可能になります。

この記事では、メンテナンスやアップデートのためにローカルやリモートのDockerコンテナにアクセスする方法についてご説明します。

コンテナアクセスが欠かせない理由

コンテナへのアクセスは、コンテナ化された環境における効果的な管理とトラブルシューティングに不可欠です。コンテナのログやランタイム情報を分析し、簡単にエラーを特定して解決することが可能になります。

また、コンテナにアクセスすることで、設定の更新、パッケージのインストール、その他の管理作業をコマンドから素早く実行できます。アクセスがなければ、更新後の構成でコンテナイメージ全体を再構築しなければならず、時間がかかって非効率的です。

コンテナはまた、分散アプリケーションエコシステム内で互いに通信できなければなりません。そのため、コマンドを診断し、コンテナ間の接続が健全であることを確認するために、コンテナへのアクセスが必要になります。

従来のSSH(Secure Shell)プロトコルでコンテナにアクセスすることも可能ですが、Dockerには手間を削減し効率を高める方法が複数用意されています。例えば以下の通りです。

  • docker exec
  • docker run
  • docker attach
  • docker compose exec
  • docker compose run

それぞれの方法には特有の用途や強みがあります。使用状況にあったコマンドを知ることで、アプローチを最適化することができます。

docker execの用途と使い方

docker execを使うと、新しいインスタンスを起動することなく、実行中のコンテナのシェルセッションにアクセスしてコマンドを実行できます。このコマンドは永続的ではないので、コンテナがシャットダウンしたり再起動したりしても再実行されないことにはご注意ください。

実行中のコンテナにアクセスするには、その名前またはIDが必要になります(docker ps -aを実行すると取得できる)。それを以下のコマンドに入力します。

docker exec -it  /bin/bash
ターミナルでdocker execコマンドを実行
docker execでコンテナにアクセスする

docker runの用途と使い方

docker runコマンドを使うと、新しいコンテナを起動してすぐにそのシェルにアクセスできます。このコンテナはデフォルトでは現在のシェルセッションに紐付けられませんが、-itオプションを使ってこれを行うことができます。

以下のコマンドを実行すると、新しいコンテナが起動し、既存のシェルセッションに接続され、bash シェルが起動します。

docker run -it  /bin/bash
ターミナルでdocker runコマンドを実行
docker runでコンテナにアクセスする

docker attachの用途と使い方

docker attachコマンドは、コンテナ操作の監視やデバッグに便利です。実行中のコンテナに接続し、その標準入力、出力、エラーストリームをリアルタイムで見ることができます。

これを使用するには、docker runを使用してコンテナを起動します。その後、Ctrl+PCtrl+Qを押しコンテナから切り離します。代わりに、そのコンテナの-dフラグを指定することもできます。

コンテナをバックグラウンドで起動したら、以下のコマンドでアクセスします。

docker attach 
ターミナルでdocker attachコマンドを実行
docker attachを使ってコンテナにアクセスする

Docker Composeの用途と使い方

Docker Composeを使うと、複数のコンテナを持つDockerアプリケーションを作成・実行できます。アプリケーションを構成するサービスをYAMLファイルで定義し、そのファイルを使ってすべてのコンテナを一緒に起動、管理することができます。複雑な環境を素早く立ち上げる必要がある開発やテスト環境に適しています。

すでに稼働している特定のコンテナにアクセスするには、次のdocker composeコマンドを実行し、その後にサービス名と実行したいコマンドを続けます。

docker compose exec app /bin/bash

このコマンドは、指定したコマンドを実行しているコンテナ内で新しいプロセスを開始します。これを使用して、bashなどの対話型シェルを含め、コンテナ内で任意のコマンドを実行可能です。

同様に、Docker Composeを使用して新しいコンテナを起動し、そのコンテナにすぐにアクセスしたい場合は、以下のコマンドを実行します。

docker compose run app /bin/bash

docker-compose (バージョン1)とdocker compose(バージョン2)の2種類があることにご注意ください。バージョン2の構文はより柔軟で強力なので、可能な限りこれを使用することを推奨します。

ターミナルでdocker composeコマンドを実行
Docker Composeを使ってコンテナにアクセスする

DockerコンテナにSSHサーバーを追加する方法

DockerコンテナにSSHサーバーを追加すると、コンテナ化したアプリケーションの管理やトラブルシューティングが楽になります。SSHサーバーを使用し、どこからでもリモートでコンテナにアクセスして管理したり、コマンドを実行したり、ログを検査したりすることができます。

コンテナをビルドする前にDockerfileにSSHサーバーを含めSSHクライアントで接続することで、SSHサーバーを追加できます。あるいは、実行中のコンテナ内でシェルを生成し、そこにSSHサーバーをインストールすることで、一時的なSSHアクセスを追加することもできます。

Dockerコンテナのビルド時にSSHサーバーを含める

コンテナに持続的にSSH接続したい場合には、Dockerコンテナを構築する際にコンテナ内にSSHサーバーを含めるのが便利です。これにより、開発中やトラブルシューティング中にコンテナにリモートアクセスしてデバッグすることができます。SSHサーバーをコンテナ内に含めると、コンテナとの間で安全にファイルを転送することもできます。

ビルド時にSSHサーバーを組み込むには、コンテナのDockerfileに少し変更を加えます。以下はSSHサーバーを組み込んだDockerfileの例です。

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]
ターミナルSSHコマンドを実行
SSHサーバーありで構築されたDockerコンテナ

このコードは、最新のDebianイメージでコンテナを構築し、SSHサーバーをインストールします。また、SSHサーバー用の新しいディレクトリを作成し、rootのパスワードを設定して、SSHコンフィグでrootログインを可能にします。最後に、SSHのデフォルトポートである 22番ポートを公開します。

このDockerfileを使用するにはdocker buildコマンドを使ってコンテナをビルドし、docker runを使ってコンテナを実行します。以下はその例です。

docker build . -t ssh-container 
docker run -d -p 2222:22 ssh-container

このコマンドで、Dockerfileを使用してコンテナを構築し、ssh-containerという名前でタグ付けを行います。コンテナをデタッチモードで実行するには-dを使用できます。次に、コンテナ内のポート22をホストマシンのポート2222に-pでマッピングします。

コンテナが実行されたら、sshコマンドを使ってSSHでコンテナに接続することができます。

ssh root@localhost-p 2222

パスワードの入力を求められたら、YAMLファイルで設定したパスワードを入力します。この場合、”root123 “です。これで、コンテナ内で動作しているSSHサーバーに接続されました。リモートデバッグを実行したり、コンテナとの間でファイルを転送したりできるようになります。

実行中のDockerコンテナにSSHサーバを一時的に追加する

docker execコマンドを使用して、実行中のコンテナにSSHサーバーを追加することもできます。

docker exec <container_name_or_id> /bin/bash

コンテナにアクセスできるようになったら、OpenSSHサーバーをインストールし、SSHデーモンを起動します。

apt update && apt install openssh-server && /usr/sbin/openssh -D

これでコンテナ内にSSHサーバーの新しいインスタンスが用意されます。ローカルマシンのSSHクライアントを使って接続する準備が整いました。

SSH経由でコンテナに接続できるのは、実行または構築フェーズで自分またはチームがSSHポートを公開している場合のみであることにご注意ください。

コンテナのSSHサーバーに接続する

これを行うには、コンテナ管理プラットフォームまたはサービスから、コンテナのIPアドレスまたはホスト名を特定することから始めます。

IPアドレスに接続するには、sshコマンドを使用します。

ssh [username]@[container-ip-address]

プロンプトが表示されたら、指定したユーザー名のパスワードを入力します。パスワードの代わりに、鍵ベースのセキュリティを使用するSSHサーバーもあります。

これで、リモートターミナルセッションがコンテナに接続されたはずです。

まとめ

Dockerが普及するにつれ、自分の環境で稼働しているコンテナを検査できることがますます重要になっています。この機能により、開発中に問題を診断して解決することができます。

Dockerにはまた、様々な開発タスクに便利な組み込みコマンドセットがあります。そのコマンドを使えば、従来のSSHを用いた手法に頼ることなく、ワークフローを効率化できます。

アプリケーションWordPressサイト、またはデータベースのホスト先をお探しなら、Kinstaがおすすめです。Kinstaを使えば、Google Cloud PlatformのプレミアムティアネットワークとC2マシン上に構築されたインフラストラクチャでプロジェクトをデプロイし、高速かつ安全なホスト環境を手にすることができます。37のデータセンターと260+のPoPを持つHTTP/3対応のCDNもご用意。隔離コンテナ テクノロジー、2つの強力なファイアウォール、Cloudflareを利用した高度なDDoS攻撃対策により、高い安全性をお届けします。また、Kinsta APIでアプリを統合したり、ワークフローを自動化することも可能です。

Marcia Ramos Kinsta

Kinstaのエディトリアルチームリード。大のオープンソース&コーディング好き。IT業界向けのテクニカルライティングと編集に7年以上携わり、的確かつ簡潔なコンテンツを制作しながら、チームで協力し合い、ワークフローの改善を行っている。