🍑あわもり教室🫧 クラウドの「手前」を、ちゃんとやる。 はじめる
SET 0630分

アプリをまとめて起動する

アプリの実行に必要なファイルをまとめ、そのまとまりからコンテナを起動します。

このレッスンのメニュー

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デーモンというプログラムが操作の依頼を待っています。 デーモンは、画面を開かずに裏で動き続けるプログラムです。

先ほどのシェルコマンドを実行すると、次の順に処理されます。

  1. シェルがdockerプログラムを起動する
  2. dockerプログラムがDockerデーモンへ起動を頼む
  3. 必要なイメージがなければ、Dockerデーモンが取得する
  4. DockerデーモンがOSへプロセスの起動を頼む
  5. 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はコンテナ内のプロセスを終了します。

このレッスンは完了

このページで扱った流れを確認したら、次の内容へ進みます。