私のパソコンでは動いたのに
小さな会社で、開発者が通販サイトのアプリを作りました。自分のパソコンでは問題なく動きます。ところが会社のサーバーでは止まってしまいました。
原因は、サーバーに入っているライブラリの版が古かったことです。だれも間違えていません。ただ2台の環境が違っただけです。コンテナは、アプリと必要なものをひとまとめにして、どこでも同じように動かします。
このレッスンのゴール
メモ
コンテナでアプリを動かし、その中を見ることができる。
大事な言葉
| ことば | いみ | れい |
|---|---|---|
| イメージ | プログラムと必要なものを入れた、読み取り専用の箱 | |
| コンテナ | イメージから起動した、動いているコピー。自分のファイルと処理を持つ | |
| タグ | イメージの版を表すラベル | nginx:1.27-alpine の 1.27-alpine |
| ポート | プログラムが接続を待ち受ける、番号つきの入り口 | 80 |
| ボリューム | コンテナの外に置くフォルダ。コンテナを替えても残る |
学生が入力するセルは、このプレビューでは空白です。
イメージは焼き型、コンテナは焼き菓子
イメージは箱です。プログラム、必要なファイル、起動のしかたのメモが入っています。イメージは変わりません。
コンテナは、イメージを起動して得られるものです。1つの型からたくさんの焼き菓子を作れるように、1つのイメージから何個でもコンテナを起動できます。
このラボには3つのコンテナがあります。コマンドで一覧を出してみましょう。
コンテナを全部出す
docker ps -aここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 1行の読み方
| 列 | 分かること | このラボでは |
|---|---|---|
| IMAGE | 起動元のイメージ | web は nginx、cache は valkey |
| STATUS | 動作中、停止、不調 | Up、Exited、healthy |
| PORTS | プログラムが待つ入り口 | web は 80/tcp |
| NAMES | 他のコマンドで使う名前 | web、cache、worker |
学生が入力するセルは、このプレビューでは空白です。
コンテナは自分だけの世界を持つ
コンテナの中のプログラムには、自分のファイルと自分のプロセス一覧が見えます。ほかのコンテナのファイルは見えません。
docker exec は、動いているコンテナの中でコマンドを1つ実行します。次の3つで、Web ページを出す web の中をのぞきます。
web の中のプロセス
docker exec web psここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
サーバーの版を聞く
docker exec web nginx -vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ページを置くフォルダ
docker exec web ls /usr/share/nginx/htmlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
コンテナは小さな仮想マシンだと思う人が多いです。違います。コンテナは、ホスト上の普通のプロセスです。自分のファイルとプロセス一覧が見えるだけで、カーネルはホストと共有します。別の OS が必要なときは仮想マシンを選びます。
web のファイルはどの OS のものか
docker exec web head -n 1 /etc/os-releaseここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
web のカーネルの版を聞く
docker exec web uname -rここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
自分の端末でも同じことを聞く
uname -rここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ポートは入り口、ボリュームは保管庫
Web サーバーはポート 80 で待ちます。ラボのネットワーク上のほかのコンテナは、web という名前で呼び出せます。
コンテナ自身のファイルは、そのコンテナがある間しか残りません。入れ替えたり、ラボを止めたりすると消えます。
ボリュームは、コンテナの外に置くフォルダです。このラボでは /settings がそれです。
名前で web のポートを訪ねる
curl -s -o /dev/null -w "%{http_code}\n" http://webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
コンテナの中にファイルを作る
docker exec web touch /tmp/note.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
できたことを確かめる
docker exec web ls /tmpここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ボリュームを見る(変えない)
docker exec web ls /settingsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
もう一歩先へ
docker exec web ps に出た nginx: worker process の行を数えましょう。次に docker exec web nproc を実行します。コンテナから見える CPU の数が出ます。
2つの数を比べてください。nginx がなぜその数の worker を選ぶのか、その CPU はだれのものかを説明しましょう。