Dockerについて学ぶ機会がありましたので、備忘を兼ねてDockerを知らない方向けに記事を書いてみようと思いました。
私もDockerについて何一つ知らない状態でしたので、同じような方を対象に記事を記載しようと思います。
Dockerとは
まずDockerとはなにかですが、コンテナ型仮想化技術のひとつです。従来のホスト型やハイパーバイザ型と異なり、コンテナ型はディスク使用量が少なくすみ、仮想環境の作成、起動が短時間で行なえかつ性能劣化が殆どないという優れたものになります。しかもオープンソースなので無料で使用できます。
コンテナ型は何故上記のような利点が生まれるのかというと
- コンテナ型はホスト型やハイパーバイザ型と異なりゲストOSを持たずホストOSが直接コンテナ管理ソフト(Docker)を使用するため
- 後述するdocker runコマンドでイメージを取得しコンテナ起動、つまり仮想環境が1コマンドで完了する
といったようなことがあげられます。これは便利。
この1コマンドで環境構築できるというのが優れているところは、パッケージングしておけばどんな場面でも全く同一の環境が作成できるというところにあります。テスト環境と本番環境が微妙に異なり本番環境で予期せぬ動作をするといったことが防げます。
実際にDockerをインストールしてみる
Dockerについてを簡単にですが記しました。次はDockerをインストールして実際に使ってみようと思います。知らないことを覚えるには実際にやってみるのが一番ですね。
Dockerにはエディションがあります。無償版のDocker Community Edition(CE)と商用サポートが有るDocker Enterprise Edition(EE)です。個人で使用するので無償版のDocker Community Editionを使っていきます。
自分の環境がWindows7 64bitのため今回使うのはDocker Toolboxとします。Windowsの場合、Docker for Windowsもあるのですが、こちらはWindows10かつPro、Enterprise、Educationでなければインストール出来ないため選択肢から除外。Docker ToolboxもWin7の64bitなら動きますが、32bitでは動かないため注意してください。ではインストールしていきます。
-
Docker Toolboxをダウンロード
githubからダウンロードします。以下のURLから飛べます。
https://github.com/docker/toolbox/releases -
画面中部からDockerToolbox-19.03.1.exeを保存
-
インストール実行
デフォルトの状態でインストールを進めていきます。



次は一番下の項目にチェックを付けてからNextをクリックします。


デバイスソフトウェアの確認が出たらインストールをクリックします。


Finishをクリックしインストール完了です。デスクトップにOracle VM VirtualBox、Docker Quickstart Terminal、Kitematic (Alpha)が作られましたので、Docker Quickstart Terminalから起動します。
セットアップが進んでいき、クジラが表示されたらセットアップ完了です。くじらの背中にある#マークはコンテナを表してるそうですよ。

Dockerの基本操作について
Dockerを操作するコマンドは基本的に先頭にDockerを付けます。正常にインストールが完了したかの確認も兼ねてバージョン確認をしてみます。
$ docker version
Docker version 19.03.1, build 74b1e89e8a
バージョンが確認できたので、正常ににインストールできていました。
では次に早速コンテナを起動してみたいと思います。ここではお約束であるhello worldイメージを使います。docker run hello-worldを投入してみましょう。
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
ちゃんとコンテナ起動ができました。どのようにしてコンテナの起動を行ったのかを説明します。
先程使用したdocker run hello-worldコマンドですが、runがコンテナ起動のコマンドで、hello-worldがDockerイメージの名前です。イメージとコンテナは下記の様な意味となります。
-
イメージ
「コンテナを起動させるためのベースファイル」のこと -
コンテナ
「Dockerのイメージを元に作成される仮想環境の実行部分」のこと
runコマンドはイメージを取得してきてそのイメージからコンテナを作成し起動を行ってくれるコマンドです。
以下のコマンドをまとめて実行してくれています。
docker pull ⇛イメージの取得
docker create ⇛コンテナの作成
docker start ⇛コンテナの起動
上記のことからdocker run hello-worldでコンテナ起動ができたという訳です。
DockerのイメージはDockerの公式サイトであるDockerHubから取得しています。サイトではイメージ一覧の確認が可能です。
https://hub.docker.com
次に取得したdockerのイメージを確認してみます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 10 months ago 1.84kB
hello-worldのイメージのみ取得している状態のため、1つだけ表示されました。
次に取得したイメージを削除してみます。イメージの削除コマンドはrmiです。docker rmi [IMAGE ID]の形式で使用します。
$ docker rmi fce289e99eb9
Error response from daemon: conflict: unable to delete fce289e99eb9 (must be forced) - image is being used by stopped container a9b8233830bf
エラーが出ました。イメージは停止したコンテナが使っているので削除できませんって表示されていますね。
先にコンテナを削除する必要があるそうです。
というわけでコンテナを削除します。コンテナ削除のコマンドはrmです。docker rm [CONTAINER ID]の形式で使用します。
起動中のコンテナを確認するコマンドはdocker psです。ただ、hello-worldはメッセージ出力が終わると自動的にコンテナを停止してしまうため、ステータスに関係なく全てのコンテナを表示するdocker ps -aを使用します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9b8233830bf hello-world "/hello" 16 minutes ago Exited (0) 16 minutes ago heuristic_vaughan
このコンテナを削除してみます。
$ docker rm a9b8233830bf
a9b8233830bf
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ちゃんと消えていますね。これでイメージを削除できます。
$ docker rmi fce289e99eb9
Untagged: hello-world:latest
Untagged: hello-world@sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
イメージを無事に削除できました。イメージを削除するには、
1. コンテナ削除
2. イメージ削除
の順で実施しましょう。
※補足
コンテナが起動されていても-fオプションを付けてDocker rmi -f [IMAGE ID]のように実行すればイメージを強制削除することもできます。
ただし、強制削除した場合はコンテナは消えずに残り続けるので、環境をキレイにするにはコンテナも削除します。
おわりに
Dockerを使用する準備段階から実際にコンテナ起動までを記載してみました。
次回を書く機会がありましたら、Dockerでよく使うコマンドまとめや、実際にDockerを活用して開発環境を作成する記事を書こうかなと思います。