アプリをまとめて起動する
アプリの実行に必要なファイルをまとめ、そのまとまりからコンテナを起動します。
このレッスンのメニュー
Webサーバーを別のコンピューターで動かすときは、実行するプログラム、設定ファイル、追加で必要なプログラムを揃えます。 一つでも不足したり、バージョンが違ったりすると、同じアプリでも動作が変わることがあります。
Dockerでは、アプリを動かすために必要なファイルをイメージへまとめます。 そのイメージを使ってアプリを起動すると、コンテナができます。
同じイメージから複数のコンテナを起動できます。 起動したコンテナでファイルを変更しても、元のイメージは変わりません。
Webサーバーを一つ起動する
次のシェルコマンドは、NginxというWebサーバーのイメージを使ってコンテナを起動します。
docker run --rm nginx:1.29-alpine
初めて実行したときは、イメージのダウンロード状況が表示されます。
準備が終わると、コンテナ内でNginxのプロセスが起動し、Webの要求を待ちます。
Ctrlキーを押しながらCキーを押すと終了できます。
ここで使ったdockerは、Dockerへ操作を頼むプログラムの名前です。
runはコンテナを起動する操作、--rmは終了したコンテナを自動で削除する指定です。
nginx:1.29-alpineは、起動に使うイメージの名前です。
入力した操作がコンテナを起動するまで
Dockerを動かしているコンピューターでは、Dockerデーモンというプログラムが操作の依頼を待っています。 デーモンは、画面を開かずに裏で動き続けるプログラムです。
先ほどのシェルコマンドを実行すると、次の順に処理されます。
- シェルが
dockerプログラムを起動する dockerプログラムがDockerデーモンへ起動を頼む- 必要なイメージがなければ、Dockerデーモンが取得する
- DockerデーモンがOSへプロセスの起動を頼む
- Linux上でNginxのプロセスが動き始める
DockerはLinuxの機能を使い、コンテナごとに見えるプロセスやネットワークを分けます。 この見える範囲を分ける機能をnamespace(名前空間)と呼びます。 CPUやメモリの使用量を記録し、上限を設定する機能をcgroup(コントロールグループ)と呼びます。
コンテナ内で動くNginxも、Dockerを動かすLinuxから見ると一つのプロセスです。 Dockerデーモンは、namespaceとcgroupを含む設定をLinuxへ頼み、そのプロセスを起動します。
イメージ名の後ろで版を選ぶ
nginx:1.29-alpineのコロンより後ろにある1.29-alpineをタグと呼びます。
タグを使うと、同じ名前で配布されるイメージから使いたい版を選べます。
タグが指す内容は、配布元によって更新される場合があります。 本番で使った内容を正確に記録する必要があるときは、イメージの内容から計算されるダイジェストも保存します。
手元のPCから接続できるようにする
コンテナでWebサーバーを起動しただけでは、手元のPCから接続する場所が決まっていません。
次の-pは、手元のPCの8080番ポートへ届いた通信を、コンテナの80番ポートへ渡す指定です。
docker run --rm -p 127.0.0.1:8080:80 nginx:1.29-alpine
127.0.0.1は、このコンピューター自身を表すIPアドレスです。
この指定では、同じコンピューターからhttp://127.0.0.1:8080/を開くとNginxへ接続できます。
削除後も必要なデータを残す
コンテナ内へ書いたデータは、そのコンテナを削除すると一緒に失われる可能性があります。 データを残すには、Dockerがコンテナの外側で管理する保存場所や、データベースなどの外部サービスを使います。
Dockerが管理する保存場所をボリュームと呼びます。
次の例では、app-dataというボリュームをコンテナ内の/dataへ接続します。
docker run --rm -v app-data:/data example/app:1.0
ホストのディレクトリをコンテナから読めるようにした場合、その範囲をコンテナから変更できることがあります。 どのファイルを渡すかは、アプリに必要な範囲へ絞ります。
起動したWebサーバーを確認する
docker run --rm -d --name awamori-web -p 127.0.0.1:8080:80 nginx:1.29-alpine
docker ps
curl -I http://127.0.0.1:8080/
docker logs awamori-web
docker exec awamori-web ps
docker stop awamori-web
docker psは起動中のコンテナ、docker logsはNginxが記録したログを表示します。
docker execは起動中のコンテナ内で別のプログラムを実行します。
最後のdocker stopはコンテナ内のプロセスを終了します。
このレッスンは完了
このページで扱った流れを確認したら、次の内容へ進みます。