第3章 Docker になれるために

3.1 仮想空間というややこしい言い方

Docker とはなにかの話になると仮想や空間などというキーワードが出てきます。コンテナ型の仮想化という表現もされることがあります。「空飛ぶ自動車」という言葉なら空を飛んでいる自動車なんだとイメージができますが、「コンテナ型の仮想化」や「仮想空間」などという言葉はあまりにも日常からはなれている言葉なのでこういう言葉が話を分かりにくくさせている原因だと思います。

まずは図で表現して、コマンドラインを実行する形式で慣れていきたいと思います。

3.2 Docker の存在を確認する

最初に Docker アプリケーションのインストールをしました。通常アプリケーションというはオペレーションシステムが存在している前提でインストールするものですから、概念を図で表現すると下記のようなことになるかと思います。図を見るだけではなかなか腑に落ちないので実際にコマンドを叩きながらひとつづつ確認してゆきましょう。

3.2.1 パソコン上にDockerが存在する概念図

  +--------+
  | Docker |
  +--------+
+------------+
|  OS (Mac)  |
+------------+

3.2.2 コマンドの解説

  • docker --version - docker のバージョン情報 (ハイフンつけると違う表示)
  • docker - docker で使えるコマンドの一覧が表示

3.2.3 Docker の存在を確認する例

(バージョンは日々更新されてるので最新にしておく)
% docker --version
Docker version 20.10.0, build 7287ab3

(指定がない場合は help 的な案内がでる)
% docker

3.3 Docker のイメージを取得

docker image pull コマンドを使い、実際に docker hub に公開されている公式イメージを取得してみます docker はイメージを用意するところから始まります。

3.3.1 Docker image の概念図

    +---------------+
    |     image     |
    | (hello-world) |
    +---------------+
  +-------------------+
  |      Docker       |
  +-------------------+
+-----------------------+
|       OS (Mac)        |
+-----------------------+

3.3.2 コマンドの解説

  • docker image pull hello-world - hello-world というイメージを取得
  • docker image ls - 取得したイメージの一覧表

今回取得した image の詳細

  • <https://hub.docker.com/_/hello-world> - Docker Official Images / hello-world

3.3.3 docker hub からイメージを取得する例

(image の詳細は docker hub)
% docker image pull hello-world

(image が取得できたことがわかる)
% docker image ls
REPOSITORY             TAG        IMAGE ID       CREATED         SIZE
hello-world            latest     bf756fb1ae65   11 months ago   13.3kB

3.4 Docker のコンテナを作る

docker container run コマンドを使って実際にコンテナを作成してみます。イメージは先ほど取得したイメージを使いましょう。docker で実際に動いているのはコンテナになります。コンテナには任意で名前をつけることも出来ますが、指定しなければ自動で名前が付けられます。コンテナとは何かを言葉で説明するのは大変難しく、あえて表現するのならば「仮想空間」ということになるのだと思います。docker は一つのイメージから複数のコンテナを同時に起動することが出来るということも知っておきましょう。

3.4.1 コンテナが複数存在している概念図

      +---------------+   +---------------+
      |   container   |   |   container   |
      | (-----------) |   | (h-container) |
      +---------------+   +---------------+
      ^ ^ ^ ^ ^ ^ ^ ^ ^   ^ ^ ^ ^ ^ ^ ^ ^ ^
    +---------------------------------------+
    |                 image                 |
    |             (hello-world)             |
    +---------------------------------------+
  +-------------------------------------------+
  |                   Docker                  |
  +-------------------------------------------+
+-----------------------------------------------+
|                    OS (Mac)                   |
+-----------------------------------------------+

3.4.2 コマンドの解説

  • docker container run hello-world - hello-wordイメージからコンテナを作る
  • docker container ls -a - 存在するコンテナを全て表示
  • docker container run --name h-container hello-world - h-container という名前をつけて hello-world イメージからコンテナを作る

3.4.3 一つの image から複数のコンテナを作る例

(起動に成功するとメッセージが出力される)
% docker container run hello-world

(コンテナができたことを確認、名前は自動でつけられる)
% docker container ls -a
CONTAINER ID   IMAGE
dccb92608f45   hello-world

(名前をつけてコンテナを実行)
% docker container run --name h-container hello-world

(コンテナが二つできる)
% docker container ls -a
CONTAINER ID   IMAGE
4fbc2782513d   hello-world
dccb92608f45   hello-world

3.5 Docker のコンテナの中に入る

docker container run -it コマンドを使ってコンテナの中にはいって作業をしてみましょう。今回は LinuxOS の ubuntu を使い ubuntu 0S のコンテナを作成してみます。通常は LinuxOS を手元のパソコンで使いたい場合は PC に LinuxOS のインストール作業をしなければいけません。2020年時点の一般的なパソコンのスペックでもOSのインストール作業というのは30分から60分くらいの時間的余裕が必要でしょう。しかし docker をつかえばあっという間に(数分あれば) LinuxOS 環境が試せます。これはものすごいことだと思います。

docker のコンテナの中に入るときには下記の2点に注意が必要です。

  1. container の中に入るにはコンテナ起動をさせないといけない
  2. docker container start は デーモン化とは違うので docker 自体を終了すると消える

3.5.1 ubuntu OS のコンテナが複数存在する概念図

      +--------------+     +--------------+
      |  container   |     |  container   |
      | (ubuntu-pc1) |     | (ubuntu-pc2) |
      +--------------+     +--------------+
      ^ ^ ^ ^ ^ ^ ^ ^      ^ ^ ^ ^ ^ ^ ^ ^
    +---------------------------------------+
    |                 image                 |
    |                (ubuntu)               |
    +---------------------------------------+
  +-------------------------------------------+
  |                   Docker                  |
  +-------------------------------------------+
+-----------------------------------------------+
|                    OS (Mac)                   |
+-----------------------------------------------+

3.5.2 コマンドの解説

  • docker container run -it --name ubuntu-pc1 ubuntu /bin/bash - コンテナを作ってそのままシェルで対話ができるようにする
  • docker container start ubuntu-pc1 - ubuntu-pc1 コンテナをバックグラウンドで起動
  • docker ps - 起動中のコンテナを表示
  • docker container exec -it ubuntu-pc1 /bin/bash - 起動中の ubuntu-pc1 という名前のコンテナに入る

3.5.3 コンテナを複数作りコンテナの中に入る例

(ubuntu のイメージを取得して2つコンテナをつくる)
% docker image pull ubuntu
(コンテナを作るときにシェルで対話できるようにする)
% docker container run -it --name ubuntu-pc1 ubuntu /bin/bash
root@12cf66e7a9e7:/# cat /etc/os-release
NAME="Ubuntu"
(... 省略)
(コンテナから抜ける)
root@12cf66e7a9e7:/# exit
exit
(ubuntu-pc1 コンテナをバックグラウンドで起動)
% docker container start ubuntu-pc1
ubuntu-pc1
(コンテナが起動している)
% docker ps
CONTAINER ID   IMAGE ...
12cf66e7a9e7   ubuntu ...
(コンテナのなかに入る)
% docker container exec -it ubuntu-pc1 /bin/bash
root@12cf66e7a9e7:/# which vim
root@12cf66e7a9e7:/#
(vim が入っていないのでインストールしてみる)
root@12cf66e7a9e7:/# apt-get update
(... 省略)
root@12cf66e7a9e7:/# apt-get install -y vim
(... 省略)
(vim がインストールされたこと確認)
root@12cf66e7a9e7:/# which vim
/usr/bin/vim
root@12cf66e7a9e7:/# exit
exit
(ubuntu-pc2 の名前でもう一つ ubuntu を用意)
% docker container run -it --name ubuntu-pc2 ubuntu /bin/bash
root@3a0ab7386e75:/# exit
exit
% docker container start ubuntu-pc2
ubuntu-pc2
(2つのコンテナが起動中)
% docker ps
CONTAINER ID   IMAGE ...
3a0ab7386e75   ubuntu ...
12cf66e7a9e7   ubuntu ...

3.6 やり直しが簡単に行える

イメージとコンテナの削除を実際にやってみましょう。LinuxOS 環境をさっと用意してさっと削除できるというのは大変魅力的です。アプリ開発をするときに開発環境を用意するというのは必ずやらなくてはいけないことですが、開発環境の用意というのは思いのほか時間がとられたり、開発マシンによって若干の違いがあったりと大変しんどい行為になります。ここまでくると docker を使わない手はない! となりそうですが、docker も万能ではなく、docker をつかって開発環境を構築すると PC にはそれなりの負荷がかかります。docker を導入する場合はわりと最近のモデルの PC でないと全体的にもっさりした動きになります。 

docker が推奨している PC のスペックは公式ページを確認ください。

3.6.1 コマンドの解説

  • docker container stop ubuntu-pc1 ubuntu-pc2 - 起動中の ubuntu-pc1 と ubuntu-pc2 という名前のコンテナを停止する
  • docker container rm ubuntu-pc1 ubuntu-pc2 - ubuntu-pc1 と ubuntu-pc2 という名前のコンテナを一度に削除する
  • docker image rm ubuntu - ubuntu のイメージを削除する

3.6.2 コンテナを終了して削除する例

(起動中のコンテナを終了させるまえに起動中を確認)
% docker ps
CONTAINER ID   IMAGE ...
3a0ab7386e75   ubuntu ...
12cf66e7a9e7   ubuntu ...
(複数のコンテナを指定して停止を実行)
% docker container stop ubuntu-pc1 ubuntu-pc2
ubuntu-pc1
ubuntu-pc2
% docker ps
CONTAINER ID   IMAGE ...
(コンテナを削除)
% docker container rm ubuntu-pc1 ubuntu-pc2
ubuntu-pc1
ubuntu-pc2
(イメージを削除)
% docker image rm ubuntu

3.7 まとめ

  • docker hub のサイトにたくさんの image が提供されている
  • 一つの image から複数のコンテナをつくるのが容易なので実験的な環境構築の作成に都合が良い

3.8 次回

この章では公式イメージをそのまま使ってコンテナの立ち上げをやりました。しかしこのやり方では独自の環境のイメージをつくることはできません。

次回は Dockerfile をつかってイメージを作成するやり方を紹介したいと思います。