Lesson 3

Docker Hub

Lesson 3 Chapter 1
Docker Hub

これまでのLessonでは、Dockerの概要と環境構築について学びました。Lesson3ではコンテナ環境を構築するためのイメージの取得方法について学んでいきます。

コンテナ・イメージ・レジストリ

Lesson2のdocker run hello-worldの実行では、Docker Hubから取得したイメージからコンテナを起動しました。一行のコマンドで実行は簡単であるものの、初めはいろいろな用語が出てきて意味が分からず、混乱するかと思います。

そこで、ここではDockerを学習していく上で最低限頭に入れて欲しい内容である、イメージ・コンテナ・レジストリの関係について整理したいと思います。

・コンテナ

コンテナとは、Lesson1でも解説しましたが、ホストOS上で隔離されたアプリの実行環境のことです。イメージを元に作成され、Docker CLI clientから起動・停止・削除などの操作をすることができます。

・イメージ

イメージとは、そのコンテナがどのようなものであるかを指示する為のテンプレートです。例えば、コンテナのベースとなるOSは何か、どのようなアプリをインストールするかという内容を指定します。

・レジストリ

レジストリとはイメージを保存しておく場所です。Dockerの公式レジストリサービスとして、Docker HubがありDockerではデフォルトで使用されています。

それぞれの関係はこのようなイメージを考えて下さい。

lesson3_1_1.png コンテナ・イメージ・レジストリの関係

上記の概略図の例では

  1. レジストリから「ubuntu」という名前のイメージを取得
  2. そのイメージを元にしてGitとVimをインストールしたコンテナを起動

という流れでコンテナを起動しています。

ここではあえて詳細を省略している箇所もあるのでまだ理解がぼやけている部分もあるかもしれせんが、まずはコンテナとイメージとレジストリの関係をなんとなく理解いただければと思います。

Docker Hubについて

コンテナ・イメージとレジストリの関係について確認してもらったところで、Docker Hubに関しての補足事項を紹介します。

Docker Hubで公開されているイメージには、Docker公式によって提供されているOfficial Imagesベンダーが公開しているVerified Publisher Imagesというイメージがあります。

Docker official Imagesの意義

Docker Official Imagesは以下のような観点から作成されています。

  1. 開発のベースとなるOSを提供する
  2. メジャーなプログラミング言語の実行環境を提供する
  3. イメージ作成の手本を示し、明快なドキュメントを提供する
  4. セキュリティに関するアップデートを適宜行う

また、自分で作成したイメージをアップロードする際にはレポジトリを作成し、その中にイメージをアップロードすることになります。

そのレポジトリにはpublic repository(一般公開されるレポジトリ)とprivate repository(所有者のみに公開されるレポジトリ)の2種類があります。

次のchapterでは、実際にDocker Hubに公開されているイメージを取得してみましょう。

Lesson 3 Chapter 2
イメージのダウンロード

ubuntuイメージのダウンロード

それでは実際にDocker Hubに公開されているイメージをダウンロードしてみましょう。

Docker HubのWebサイトにアクセスし、①Exploreをクリックして下さい。

lesson3_2_1.png

イメージの一覧が表示されたと思いますが、ここではubuntuイメージのダウンロードをしてみましょう。一覧の中から探すか②検索バーにubuntuと入力して検索して下さい。見つかれば③ubuntuをクリックして詳細ページに行きます

lesson3_2_2.png

Docker公式によって公開されている④Docker Official Imageだということが分かります。その他にもいろいろな情報が書かれていますが、まずは⑤で示されているdocker pull ubuntuコマンドで実際にイメージをダウンロードしてみましょう。

lesson3_2_3.png

PowerShellを立ち上げてdocker pull ubuntuコマンドを実行して下さい。

lesson3_2_4.png

コマンドが終了したら、Docker Desktopのダッシュボード画面からイメージがダウンロードされているか確かめてみましょう。

lesson3_2_5.png

確かにダウンロードできていることが確認できます。また、dockerコマンドでも同じように確認してみましょう。

docker image lsコマンドはローカルに存在しているイメージの一覧を表示します。

lesson3_2_6.png

⑥ここでも同様にubuntuイメージのダウンロードができていることがわかりました。

Docker Desktopのダッシュボード画面について

以後の内容ではdockerコマンドでの操作に慣れるため、あえてダッシュボード画面の確認は行いませんが、ダッシュボード画面とdockerコマンドのどちらでもイメージやコンテナの一覧を確認できることを覚えておいて下さい。

タグの指定

docker image lsの出力を見てみると⑦TAGというカラムがあります。tagとはイメージの内容の詳細をさらに指定するようなものです。

lesson3_2_7.png

docker pull [レポジトリ名]:[タグ名]という形式で指定することができます。

ubuntuイメージのタグには⑧で書かれているようなものがあります。例えば⑨を見て

lesson3_2_8.png

docker pull ubuntu:bionic

というようにタグを指定してイメージを取得することができます。

docker pullではデフォルトでlatestタグを指定するので、docker pull ubuntuの実行は、docker pull ubuntu:latestと同じになります。

イメージの削除

これでdocker pullコマンドでのイメージの取得方法を理解することができたと思います。その他にも、ご自身で探したイメージをダウンロードできることを確かめてみて下さい。

また、取得したイメージはdocker image rm [リポジトリ名]で削除することができます。

docker image rm ubuntuコマンドを実行して下さい。

lesson3_2_9.png

次にdocker image lsコマンドを実行して下さい。取得したubuntuイメージが削除できていることが確認できると思います。

lesson3_2_10.png

サイズの大きいイメージが増えて容量を圧迫するまえに不要なものは削除しておきましょう。

Lesson 3 Chapter 3
コンテナの作成と実行

前のchapterでは、docker pullコマンドでDocker Hubからイメージを取得しました。

しかし、イメージはテンプレートなのでそれだけでは仮想環境を実行することができません。イメージを元にコンテナを作成、実行する必要があります。

docker image lsコマンドを実行して下さい。これまでに取得したイメージの一覧を得ることができます。

lesson3_3_1.png

この中にREPOSITORY名が①hello-worldとなっているものがありますが、前のchapterでdocker pull hello-worldでイメージの取得をしていないにも関わらずなぜローカルに存在しているのでしょうか?

答えはLesson2のchapter3にあります。

docker run hello-worldコマンドを実行によって、hello-worldイメージを取得 => コンテナの作成 => コンテナの実行というステップでHello from Docker!を出力できた流れを覚えているでしょうか。

この時にdocker pullではなくdocker runによってDocker Hubからイメージの取得が行われていたのです。この通り、docker runコマンドの実行にはいくつかのコマンドの実行が含まれていることが分かります。

コンテナとイメージの削除

それでは、イメージの取得からコンテナの実行までを詳細をみていく為にdocker runコマンドなしで同じ動作を再現してみましょう。

前準備として、まずは既に取得済みのイメージと作成したコンテナを削除します。

docker image rm hello-worldコマンドの実行によってイメージを削除していきましょう。

lesson3_3_2.png

しかし、エラーが発生してイメージを削除することができません。エラーメッセージには③コンテナによってイメージが参照されているため削除できないとあります。

コンテナはイメージを元に作成されています。そのため、イメージを元に作成されているコンテナが存在している場合は、参照元であるイメージを削除することができないのです。よって、まずは作成されたコンテナを削除しなければなりません。

docker contianer ls -aコマンドを実行するとコンテナの一覧が表示されます。

lesson3_3_3.png

IMAGE名がhello-worldになっているコンテナがありますが、それを④docker container rm xxxxで削除します。xxxxは⑤CONTAINER IDのところに表示されている英数字です。全てを入力する必要はありません。

これでコンテナが削除されました。次に再び、docker image rm hello-wordコマンドを実行して削除して下さい。

lesson3_3_4.png

docker run hello-worldの再現

これで前準備が整いました。

まずはイメージを取得しましょう。docker pull hello-worldコマンドを実行します。

lesson3_3_5.png

次にコンテナを作成します。⑥docker create hello-worldというコマンドになります。

lesson3_3_6.png

docker container ls -aを実行するとコンテナが作成され⑦STATUSがCreatedと表示されています。

次に、⑧docker start xxxx -aを実行して下さい。

lesson3_3_7.png

Hello from Docker!が出力されました。

以上でdocker runコマンドの再現ができました。実行したdockerコマンドの関係を整理しておきましょう。

lesson3_3_8.png dockerコマンドとコンテナのステータス

四角枠の「created」や「running」はコンテナのステータスを示しています。

まとめ

以上、Lesson3ではコンテナ・イメージ・レジストリの関係やDocker Hubからのイメージの取得方法について学びました。

docker CLIコマンドも様々なものを紹介しています。分かりにくいと感じるところは、実際にコマンドを実行して試してみると理解が深まると思います。