クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

コンテナでアプリを動かす(Docker)

このレッスンのあとで: コンテナでアプリを動かし、その中を見ることができる。

50分のレッスンコマンド11件Docker 入門ラボ:止まったサービスを直して、コンテナー、ログ、再起動を学ぶ

私のパソコンでは動いたのに

小さな会社で、開発者が通販サイトのアプリを作りました。自分のパソコンでは問題なく動きます。ところが会社のサーバーでは止まってしまいました。

原因は、サーバーに入っているライブラリの版が古かったことです。だれも間違えていません。ただ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 はだれのものかを説明しましょう。

このラボとソースについて: Docker 入門ラボ:止まったサービスを直して、コンテナー、ログ、再起動を学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。