‫よし､ 楽しいことをやろう｡ この講義では､ イメージとコンテナの違いについて簡単に説明します｡
‫では､
‫早速コンテナを使って遊んでみましょう｡ 起動させたり､ 停止させたり､
‫削除したり､ 一般的な管理機能を行うのです｡ 次に､ コンテナログとコンテナ内で実行されているプロセスをチェックアウトします｡
‫では､ 早速ですが､ イメージとコンテナの違いを知っておくといいでしょう｡ イメージとは､ アプリケーションを構成するバイナリ､
‫ライブラリ､ ソースコードのすべてを指します｡ コンテナは､ そのイメージの実行中のインスタンスである｡
‫これで､ 同じイメージをベースにしたコンテナをいくつも持つことができるようになりました｡ この講義では､ オープンソースのウェブサーバーであるNginxを使用する予定です｡
‫そこで､
‫このNginxイメージに基づいてコンテナを起動することにします｡ 私たちは､ すべてのイメージをレジストリから得ています｡ レジストリは､ ソースコードに対するGitHubのようなものです｡
‫イメージレジストリはコンテナイメージのためのもので､
‫DockerのデフォルトはDocker Hubで､ hubで確認することができます｡
‫ドッカーです｡ comを使用しています｡
‫後でもっと遊びましょう｡
‫しかし､ とりあえずこの2つは全く違うものであることを認識しておいてください｡ 次章では､
‫画像に飛びます｡
‫しかし､ 今はコンテナに焦点を当てましょう｡
‫さて､ これから新しいコンテナを起動し､ Dockerコマンドを使ってコンテナを管理します｡
‫docker container run
‫publish 80:80 nginx.
‫意味がわからなくても大丈夫｡ すぐに調べます｡
‫エンターキーを押すと...
‫ブラウザに切り替えて､ localhostと入力してください｡
‫これでよしとしよう｡
‫弊社のNginxサーバーがリッスンしています｡ 何度か更新を押すと､ このコマンドラインにログエントリーが表示されるんだ｡
‫さて､ 私たちは今何をしたのでしょうか？ バックグラウンドでは､ 実際にDockerエンジンがnginxというイメージを探し､
‫Docker Hubからnginxの最新イメージを引き出しています｡
‫そして､ 新しいコンテナで新しいプロセスとしてスタートさせ､ 私たちが使えるようにしたのです｡
‫コマンドの公開部分は､ 私のローカルマシンのポート80を公開し､ そこからのすべてのトラフィックを､
‫そのコンテナ内でポート80で実行されている実行ファイルに送ります｡
‫Nginxはウェブサーバなので､ ポート80がデフォルトで､ トラフィックは自動的にブラウザからローカルホストに転送され､
‫コンテナに入るようになっています｡
‫しかし､ コマンドラインの中で常にフォアグラウンドで動作させたいわけではありません｡
‫では､ Control cを押して､ 上矢印を押して､ 少し戻って､ detachと入力してみましょう｡
‫ここでdetachは､ Dockerにバックグラウンドで実行するように指示します｡
‫そして､ 私たちのコンテナのユニークなコンテナIDを取得します｡
‫そして､ 新しいコンテナを実行するたびに､ 新しい一意のIDを取得します｡
‫ブラウザに戻り､ 何度か更新を押すと､ まだ実行中であることがわかります｡
‫では､ コンテナを一覧表示するコマンドを実行してみましょう｡ docker container
‫ls そして､ ここにまだ動いているものが表示されます｡
‫先ほど実行したコマンドのコンテナIDにマッチしています｡ 先ほど起動したコンテナがまだ動いているのがわかると思います｡
‫だから､ その容器を早く止めよう｡
‫dockerコンテナ停止｡ 次に､ コンテナID｡ コンテナIDは､ 最初の数桁を入力するだけで､
‫一意に決まるので､ それを止めました｡
‫ここで､ ドッカーコンテナのlsを実行すると､ 何も表示されないことに気がつくでしょう｡
‫そのため､ lsコマンドはデフォルトで実行中のコンテナしか表示しない｡
‫ls -aを実行すると､ 2つ戻ってきます｡ さて､ なぜ2つになったのでしょうか？
‫その都度､ docker container runコマンドを実行すると､ そのNginxイメージから新しいコンテナが開始されました｡
‫この右側には､ ランダムな名前が並んでいるのがわかると思います｡ これは使わなかった｡
‫どうやってこれを手に入れたのか？
‫そのため､ コンテナIDは常に私たちのために作成されます｡
‫そして､ その名前もユニークであることが要求されます｡
‫そして､ 私たちが指定しなければ､ 私たちのために作成されます｡ Dockerにまつわるちょっとした歴史として､
‫Dockerはもう何年も前から､ 形容詞や著名なハッカーや科学者の苗字を集めたオープンソースのリストからランダムに名前を生成するようにしています｡
‫それに､ たまにすごく変わった名前の人が出てきて面白いんですよ｡
‫では､ 新しく作ってみましょう｡ ドッカーコンテナを実行します｡ 私たちのパブリッシュとデタッチを入れる｡
‫しかし､ 今回は名前を指定するのです｡ webhost nginxと呼ぶことにします｡
‫そして､ docker container ls -a を実行すると､ 3つのコンテナが表示されます｡
‫今､ 始めたばかりのもの｡ webhostという名前と､ 以前起動して停止した2つがあります｡
‫もうフォアグラウンドで実行していないので､ ログを見ることはできません｡
‫それでは､ ブラウザに戻り､ 何度か更新を押してログを生成してみましょう｡
‫それからターミナルに戻って､ docker container logs webhostとします｡ そして､ ウェブホスト内の最新のログを吐き出します｡
‫logsコマンドにはいくつかのオプションがあり､ 自動的にログを追跡したり､ 最後の数個のログイベントだけをキャプチャして､
‫ログファイル全体が画面にダンプされるのを防いだりすることができます｡
‫また､ 他のドッカーコンテナコマンドを使用して､ 実行中のコンテナを確認することもできます｡ docker container topを試してみましょう｡
‫そこにヘルプが表示されます｡
‫これにより､ コンテナ名 webhost を指定する必要があることがわかります｡ これがコンテナ内で動作しているプロセスであることがわかると思います｡
‫さて､ Nginxでは必ずしもこのようなことを知る必要はありませんが､ Nginxでは実際にはマスタープロセスがあり､
‫設定に基づいてワーカープロセスが生成されることは興味深い点です｡
‫繰り返しますが､ docker container と --help と入力すると､ そのコンテナで試せるすべてのコマンドのリストが表示されます｡
‫では､ 今やったことの後始末をしましょう｡
‫では､ Dockerコンテナをやってみましょう｡
‫ls -a を実行すると､ 3つのコンテナすべてがリストアップされます｡
‫では､ 実際に3つを同時に取り外してみます｡
‫Dockerのサブコマンドは､ 実は複数の値を取ることができる場合があります｡
‫この場合､ docker container rmを実行して､ 実際に63f 690とodeを指定することができます｡
‫おっと0deさん｡
‫それで､ エラーが出たんです｡ ここで何が起こったのか？
‫わかりました｡ 最初の2つは無事に削除されました｡
‫3つ目は､ 安全対策で動いているコンテナを外せないと言われました｡
‫これは､ まだ実行中の実際のプロセスを誤って削除してしまわないようにするためです｡ ドッカーコンテナのlsを実行すると､
‫まだ1つ動作していることがわかります｡
‫これで実際にdocker container stopをして､ まず停止させてから削除することができました｡
‫でも､ 実際にはdocker containerのrm -fでforceと63fをやるつもりです｡ そして､ そこに行く｡
‫ここで､ ドッカーコンテナのls -aを実行すると､ 何もないことがわかります｡
‫それで今､ 私たちは片付けをしたんです｡
‫OKです｡
‫このように､ たった数分のうちに､ たった一つのコマンドで､ 80番ポートをリッスンするデフォルト設定のNginxウェブサーバーをダウンロードして実行し､
‫さらに､ それらを複数作成してログを操作し､ コンテナを削除して自分たちが行ったことをクリーンアップすることができました｡