はじめに
この実験では、docker container runコマンドを使用してコンテナを効果的に管理する実践的な経験を得ます。バックグラウンド実行のための detached モードでのコンテナ起動方法や、識別を容易にするためのカスタム名の割り当て方を学びます。
さらに、STDIN を開いたまま実行中のコンテナにアタッチする方法、外部アクセスのためのコンテナポートのホストへの公開、データ永続化を確保するためのボリュームマウント、環境変数の設定やホストエントリの追加によるコンテナの設定方法について探求します。これらの基本的なスキルは、Docker 化されたアプリケーションの構築と管理に不可欠です。
デタッチドモードでコンテナを実行し名前を割り当てる
このステップでは、Docker コンテナを detached モードで実行し、カスタム名を割り当てる方法を学びます。コンテナを detached モードで実行すると、コンテナはバックグラウンドで動作し、ターミナルに直接出力が表示されません。名前を割り当てることで、後でコンテナを識別・管理しやすくなります。
まず、hello-worldイメージをプルしましょう。これは Docker が正しく動作しているかテストするのに便利な非常に小さなイメージです。
docker pull hello-world
イメージがプルされていることを示す出力と、正常にプルされたことを確認するメッセージが表示されるはずです。
次に、hello-worldコンテナを detached モードで実行します。detached モードには-dフラグを、名前の割り当てには--nameフラグを使用します。このコンテナをmy-hello-worldと名付けましょう。
docker run -d --name my-hello-world hello-world
このコマンドを実行すると、Docker はコンテナ ID を示す長い文字列を出力します。これはコンテナがバックグラウンドで起動したことを示しています。
コンテナが実行中かどうかを確認するには、docker psコマンドを使用します。このコマンドは現在実行中のすべてのコンテナをリスト表示します。
docker ps
実行中のコンテナのリストが表示され、その中にmy-hello-worldという名前のコンテナがあるはずです。STATUS列には、コンテナが数秒前に終了したことが表示されます。hello-worldコンテナは、短時間実行してメッセージを表示し、終了するように設計されています。終了していても、detached モードで実行されたためdocker psに表示されます。
終了したコンテナも含めてすべてのコンテナを表示するには、docker ps -aコマンドを使用します。
docker ps -a
これにより、my-hello-worldとそのステータス(Exited)がリストに表示されます。
実行中のコンテナにアタッチして STDIN を開いたままにする
このステップでは、実行中のコンテナにアタッチし、標準入力 (STDIN) を開いたままにする方法を学びます。これはシェルのように入力を受け付けるプロセスを実行しているコンテナと対話する際に有用です。
前のステップでは、hello-worldコンテナを実行しましたが、これはすぐに終了しました。アタッチを実演するためには、実行し続けるコンテナが必要です。簡単な方法として、コンテナ内でインタラクティブなシェルを実行します。
まず、多くのアプリケーションのベースイメージとして一般的なubuntuイメージをプルしましょう。
docker pull ubuntu
次に、ubuntuコンテナを detached モード (-d) で実行し、擬似 TTY を割り当て (-t)、STDIN を開いたまま (-i) にします。また、my-ubuntuという名前を付けます。コンテナ内で実行するコマンドは Bash シェルのパスである/bin/bashです。
docker run -itd --name my-ubuntu ubuntu /bin/bash
-iフラグは STDIN を開いたままにし、コンテナに入力を送れるようにします。-tフラグはインタラクティブなシェルセッションに必要な擬似 TTY を割り当てます。-dフラグはコンテナをバックグラウンドで実行します。
コンテナ ID がターミナルに表示され、コンテナがバックグラウンドで実行されていることがわかります。
では、docker attachコマンドを使って実行中のmy-ubuntuコンテナにアタッチしましょう。
docker attach my-ubuntu
このコマンドを実行後、ubuntuコンテナ内の Bash シェルのプロンプトが表示されるはずです。これでコンテナの標準入力・出力・エラーストリームにアタッチされました。
コンテナのシェルと対話できます。例えば、lsコマンドを実行してコンテナ内の現在のディレクトリにあるファイルを一覧表示できます。
ls
Ubuntu コンテナのルートディレクトリ (/) の内容が表示されるはずです。
コンテナを停止せずにデタッチするには、特定のキーシーケンスCTRL+pの後にCTRL+qを押します。今試してみてください。
ホストマシンのターミナルプロンプトに戻るはずです。コンテナはバックグラウンドで実行を続けています。これはdocker psで確認できます。
docker ps
my-ubuntuが実行中のコンテナとしてリスト表示されるでしょう。
アタッチ中に単にCTRL+cを押すと、コンテナ内で実行中のプロセス (Bash シェル) にシグナルが送られ、コンテナが停止する可能性があります。CTRL+pの後にCTRL+qを押すのが、コンテナを停止せずにデタッチする標準的な方法です。
コンテナのポートをホストに公開する
このステップでは、Docker コンテナのポートをホストマシンに公開する方法を学びます。これにより、コンテナ内で動作しているサービスをホストのネットワークからアクセスできるようになります。
まず、前のステップで作成したmy-ubuntuコンテナを停止して削除し、競合を避けましょう。
docker stop my-ubuntu
docker rm my-ubuntu
各コマンドの後にコンテナ名が表示され、停止および削除が確認できるはずです。
次に、コンテナ内でシンプルな Web サーバーを実行し、そのポートをホストに公開します。人気のある Web サーバーであるnginxイメージを使用します。
nginxイメージをプルしましょう。
docker pull nginx
ここで、nginxコンテナを detached モード (-d) で実行し、コンテナ内のポート 80 をホストマシンのポート 8080 に公開します。ポート公開には-pフラグを使用し、ホストポート:コンテナポートの形式で指定します。また、my-nginxという名前を付けます。
docker run -d --name my-nginx -p 8080:80 nginx
-p 8080:80の部分は、コンテナ内のポート 80(Nginx がデフォルトでリッスンするポート)をホストマシンのポート 8080 にマッピングします。
コンテナ ID が表示され、コンテナがバックグラウンドで実行されていることがわかります。
ポートが正しく公開され、Web サーバーにアクセスできることを確認するために、ホストマシンでcurlコマンドを使用してポート 8080 のlocalhostにアクセスできます。
curl http://localhost:8080
ターミナル出力に Nginx のデフォルトウェルカム HTML ページが表示されるはずです。これにより、コンテナ内で動作している Nginx Web サーバーにホストのポート 8080 経由でアクセスできることが確認できます。
docker psを使用して、実行中のコンテナと公開されたポートを確認することもできます。
docker ps
出力にはmy-nginxがリストされ、PORTS列には0.0.0.0:8080->80/tcpと表示されるはずです。これはコンテナ内のポート 80 がホストのすべてのインターフェースのポート 8080 にマッピングされていることを示しています。
データ永続化のためのボリュームをマウント
このステップでは、Docker ボリュームを使用してコンテナが生成・使用するデータを永続化する方法を学びます。デフォルトでは、コンテナ内のデータは一時的なもので、コンテナを削除すると失われます。ボリュームを使用すると、コンテナのファイルシステム外にデータを保存でき、コンテナを停止または削除した後もデータを保持できます。
まず、前のステップで作成したmy-nginxコンテナを停止して削除しましょう。
docker stop my-nginx
docker rm my-nginx
次に、Docker ボリュームを作成します。ボリュームは Docker によって管理され、ホストマシンの専用領域に保存されます。
docker volume create my-volume
ボリューム名 (my-volume) が表示され、作成が確認できるはずです。
docker volume lsコマンドで既存のボリュームを一覧表示できます。
docker volume ls
ボリュームの一覧にmy-volumeが表示されるでしょう。
ここで、新しいnginxコンテナを実行し、my-volumeをコンテナ内の Nginx のデフォルト Web ルートディレクトリ (/usr/share/nginx/html) にマウントします。これにより、コンテナ内の/usr/share/nginx/htmlに配置されたファイルは実際にはホストのmy-volumeに保存されます。
コンテナを detached モード (-d) で実行し、コンテナ内のポート 80 をホストのポート 8081 に公開 (-p 8081:80)、名前 (my-nginx-volume) を付け、-vフラグでボリュームをマウントします。名前付きボリュームのマウント形式はボリューム名:コンテナ内パスです。
docker run -d --name my-nginx-volume -p 8081:80 -v my-volume:/usr/share/nginx/html nginx
コンテナ ID が表示され、コンテナが実行中であることがわかります。
マウントされたボリュームにシンプルな HTML ファイルを配置しましょう。docker execを使用して実行中のコンテナ内でコマンドを実行し、/usr/share/nginx/htmlにindex.htmlファイルを作成します。
docker exec my-nginx-volume sh -c 'echo "<h1>Hello from the volume!</h1>" > /usr/share/nginx/html/index.html'
このコマンドはmy-nginx-volumeコンテナ内でシェル (sh -c) を実行し、echoコマンドでindex.htmlファイルを作成します。
ホストのポート 8081 で Web サーバーにアクセスし、作成したindex.htmlファイルの内容を確認しましょう。
curl http://localhost:8081
出力に<h1>Hello from the volume!</h1>が表示されるはずです。これにより、コンテナ内で作成したファイルが Nginx によって提供されており、マウントされたボリュームに書き込まれたためデータが永続化されていることが確認できます。
永続性を実証するため、my-nginx-volumeコンテナを停止して削除します。
docker stop my-nginx-volume
docker rm my-nginx-volume
次に、同じボリュームをマウントした新しいコンテナを実行します。この新しいコンテナをmy-nginx-volume-newと名付け、ポート 80 をホストのポート 8082 に公開します。
docker run -d --name my-nginx-volume-new -p 8082:80 -v my-volume:/usr/share/nginx/html nginx
新しいコンテナが実行され、同じmy-volumeを使用しています。ポート 8082 で Web サーバーにアクセスしましょう。
curl http://localhost:8082
出力には依然として<h1>Hello from the volume!</h1>が表示されるはずです。これはindex.htmlファイルがmy-volumeに保存され、元のコンテナを削除した後も永続化されていたためです。同じボリュームをマウントした新しいコンテナは、以前に書き込まれたデータにアクセスできます。
これにより、ボリュームがコンテナのライフサイクルとは独立してデータを永続化する強力な機能であることが実証されました。
環境変数の設定とホストエントリの追加
このステップでは、Docker コンテナに環境変数を設定する方法と、コンテナの/etc/hostsファイルにカスタムエントリを追加する方法を学びます。環境変数はコンテナ内で動作するアプリケーションを設定する一般的な方法であり、ホストエントリを追加することで、サービスディスカバリやコンテナ内での DNS 解決の上書きに役立ちます。
まず、前のステップで作成したmy-nginx-volume-newコンテナを停止して削除しましょう。
docker stop my-nginx-volume-new
docker rm my-nginx-volume-new
次に、シンプルなコンテナを実行して環境変数を設定します。再びubuntuイメージを使用し、環境変数の値を表示するコマンドを実行します。MY_VARIABLEという名前の環境変数にhello_dockerという値を設定します。環境変数の設定には-eフラグを使用し、形式は変数名=値です。
docker run --rm -e MY_VARIABLE=hello_docker ubuntu env | grep MY_VARIABLE
このコマンドの説明:
--rmコンテナ終了時に自動的に削除-e MY_VARIABLE=hello_dockerコンテナ内にMY_VARIABLE環境変数をhello_dockerとして設定ubuntu使用するイメージenvコンテナ内で実行し、全ての環境変数を表示| grep MY_VARIABLEMY_VARIABLEを含む行のみ表示
ターミナル出力にMY_VARIABLE=hello_dockerと表示され、環境変数が正常に設定されたことが確認できます。
次に、コンテナの/etc/hostsファイルにカスタムホストエントリを追加する方法を学びます。外部 DNS に依存せず、特定のホスト名を特定の IP アドレスに解決する必要がある場合に便利です。--add-hostフラグを使用し、形式はホスト名:IPアドレスです。
別のubuntuコンテナを実行し、ホスト名my-serviceを IP アドレス192.168.1.100にマッピングするエントリを追加します。その後、catコマンドでコンテナ内の/etc/hostsファイルの内容を表示し、grepで追加したエントリを確認します。
docker run --rm --add-host my-service:192.168.1.100 ubuntu cat /etc/hosts | grep my-service
このコマンドの説明:
--rmコンテナ終了後に削除--add-host my-service:192.168.1.100my-serviceを192.168.1.100にマッピングするエントリを追加ubuntu使用するイメージcat /etc/hostsコンテナ内でホストファイルを表示| grep my-servicemy-serviceを含む行を検索
ターミナルに192.168.1.100 my-serviceのような出力が表示され、カスタムホストエントリがコンテナの/etc/hostsファイルに追加されたことが確認できます。
必要に応じて、環境変数の設定とホストエントリの追加を 1 つのdocker runコマンドで組み合わせることができます。
まとめ
この実験では、docker runコマンドを使用してコンテナを管理する方法を学びました。まず-dフラグでデタッチドモードでコンテナを実行し、--nameフラグでカスタム名を割り当て、docker psとdocker ps -aでそのステータスを確認しました。
次に、以下の操作を探索しました:
- STDIN を開いたまま実行中のコンテナにアタッチする方法
- ネットワークアクセスのために
-pフラグを使用してコンテナポートをホストに公開する方法 -vフラグでボリュームをマウントし、コンテナのライフサイクルを超えてデータを永続化する方法-eフラグで環境変数を設定し、--add-hostフラグでホストエントリを追加することでコンテナ環境を設定する方法



