こんにちは、鈴木です。
「AWSでDockerを使ってみよう!」では Docker を取りあえず使ってみました。今回は「Docker とは?」というところから、Docker の基本的な操作を行うところまで見ていこうと思います。
Docker とは
Docker とはコンテナ型の仮想化を実現するためのソフトウェアです。
Xen や VMware のようなサーバ仮想化との違いは、扱う単位がマシンではなくプロセスである点です。
この違いは非常に重要です。
サーバ仮想化ではホストマシン上でゲストマシンが動き、ゲストマシン内で様々なプロセスが動きます。一方のコンテナ型の仮想化では、ホスト OS 上にコンテナという隔離された空間が作成され、その中でプロセスが実行されます。
コンテナは隔離の技術
Docker を使い始めたばかりだと「コンテナ内に bash で接続してみたけれど cron や syslog 等のデーモンが動いていない…」と困惑してしまうことがあるかもしれません。
しかしコンテナ内で動いているのはマシンではなく単なるプロセス(この場合は bash のプロセス)であるため、当然ながら cron や syslog 等の他のプロセスは動いていません。「コンテナという隔離された空間で一つのプロセスが動く」という意識を持つことが大切です。
「仮想化」と言われると「ホストマシンの上でゲストマシンが動く」というレイヤー構造をイメージしてしまいますが、コンテナ型の仮想化では全てのプロセスがホストマシン上で動きます。コンテナ型の仮想化は、ホストの空間を縦に切る、隔離の技術と言えます。
サーバ仮想化とコンテナ型の仮想化の違いを図で表すと以下のようになります。
コンテナ型仮想化の図で、コンテナ内で動いていないプロセスがあります。これは普通のプロセスとコンテナ内で実行するプロセスが同じホストマシン上に同居していることを表しています。
Docker 用語集
Docker を使う上で良く出てくる用語についてまとめます。
コンテナ
外部からプロセス空間やネットワーク等が隔離された空間のことです。コンテナの中でプロセスが動きます。
イメージ
コンテナのテンプレートです。イメージを元にして新しいコンテナを作成します。
レジストリ
イメージが保存される場所のことです。Docker Hub のようなパブリックなサービスもあり、イメージを共有することもできます。各種ディストリビューションやミドルウェア用のオフィシャルなイメージも提供されているため、自分用のイメージを作成するときのベースに利用すると便利です。
Docker の基本的な操作
イメージを取得する
まずはリポジトリからイメージを取得することから始めましょう。
リポジトリにどのようなイメージがあるのか Docker Hub Registry で確認することができます。Ubuntu や CentOS、PostgreSQL や WordPress 等のオフィシャルイメージもあるので、用途に合ったイメージを取得します。
docker search コマンドで検索することもできます。
1 |
docker search ubuntu |
ここでは Ubuntu の最新(latest)を取得します。
1 |
docker pull ubuntu:latest |
コンテナを作成する(コマンドを新しいコンテナで実行する)
コンテナを作成(コンテナでプロセスを実行)してみましょう。
1 |
docker run -it ubuntu:latest bash |
適当なファイルを作成してみます。
1 |
echo hello > /tmp/hello.txt |
デタッチ、アタッチ、コンテナの終了
コンテナからデタッチするには Ctrl+p を押し、次に Ctrl+q を押します。
1 |
Ctrl+p Ctrl+q |
これでコンテナからデタッチできました。
プロセスの一覧を確認すると、デタッチしたコンテナが動き続けていることが分かります。
1 2 3 |
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2067f43896a2 ubuntu:latest bash 3 minutes ago Up 3 minutes naughty_kirch |
「STATUS」の部分が「Up 3 minutes」となっています。これは 3 分前に起動した(まだ実行中)ということを意味します。
「CONTAINER ID」は「2067f43896a2」となっています。この ID はコンテナを操作するときに使用します。
例えばコンテナにアタッチするには次のようにします。
1 |
docker attach 2067f43896a2 |
先ほど作成した /tmp/hello.txt が残っているか確認してみましょう。
1 2 |
# cat /tmp/hello.txt hello |
それでは exit で bash を終了しましょう。
1 |
exit |
docker ps で確認するとコンテナ一覧から消えているはずです。
1 |
docker ps |
-a オプションを指定すると終了したコンテナも表示することができます。
1 2 3 |
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2067f43896a2 ubuntu:latest bash 9 minutes ago Exited (0) 13 seconds ago naughty_kirch |
「STATUS」が「Exited (0) 13 seconds ago」となっていることから、「13 秒前に終了ステータス 0 で終了した」ことが分かります。
コンテナの開始と停止
docker start でコンテナを再実行することができます(再度アタッチできるようになります)。
1 |
docker start 2067f43896a2 |
引数はコンテナの ID です。
コンテナを停止するには docker stop を使用します。
1 |
docker stop 2067f43896a2 |
引数はコンテナの ID です。
コンテナからイメージを作成する
コンテナからイメージを作成することができます。
1 |
docker commit 2067f43896a2 my-example |
引数はコンテナ ID と作成するイメージの名前です。
リポジトリからベースとするイメージを取得し、それに必要なセットアップを行い、自分用のイメージとして保存しておけば、次回から同じセットアップ作業を行わなくて済みます。
コンテナを削除する
Docker を使うとコンテナを作成 / 破棄を気軽に行うことができます。しかし、コンテナの情報は全て残されるため、いつの間にかディスクを大量に消費していた、ということもあります。
docker ps にオプション a と s を付けて実行してみましょう。
1 2 3 |
$ docker ps -as CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE 2067f43896a2 ubuntu:latest bash 24 minutes ago Exited (0) 2 minutes ago naughty_kirch 95 B |
-a は前述のとおり終了したコンテナも表示させるオプションです。-s を付けるとコンテナのサイズも出力されます。一番右の「SIZE」という項目が「95 B」となっています。
「たったの 95 バイト?」と思われるかもしれませんが、「hello.txt」というファイルを作成しただけだからです。
パッケージのインストールなどを行うと、すぐに数十MB、数百MBになってしまいます。そのため、不要なコンテナはディスクの空き容量と相談しながら削除してあげる必要があります。
コンテナを削除するには docker rm を使用します。
1 |
docker rm 2067f43896a2 |
引数にはコンテナの ID や名前を指定します。
イメージを削除する
イメージもまずまずのディスクを消費するので、不要となったイメージは削除した方が良いでしょう。
イメージの一覧を確認するには docker images を使用します。
1 2 3 |
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest ba5877dc9bec 13 days ago 192.7 MB |
-a オプションを付けると「中間イメージ」も表示することができます。
1 2 3 4 5 6 7 8 |
$ docker images -a REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest ba5877dc9bec 13 days ago 192.7 MB <none> <none> 2318d26665ef 13 days ago 192.7 MB <none> <none> ebc34468f71d 13 days ago 192.7 MB <none> <none> 25f11f5fb0cb 13 days ago 192.7 MB <none> <none> 9bad880da3d2 13 days ago 192.5 MB <none> <none> 511136ea3c5a 13 months ago 0 B |
Docker のイメージは、ベースとするイメージからの差分が積み上げられたものです。
-t オプションを指定すると、イメージがどのように積み上げられているか確認することができます(※出力を見ると -t は非推奨であり、将来削除されるようです)。
1 2 3 4 5 6 7 8 |
$ docker images -t Warning: '-t' is deprecated, it will be removed soon. See usage. └─511136ea3c5a Virtual Size: 0 B └─9bad880da3d2 Virtual Size: 192.5 MB └─25f11f5fb0cb Virtual Size: 192.7 MB └─ebc34468f71d Virtual Size: 192.7 MB └─2318d26665ef Virtual Size: 192.7 MB └─ba5877dc9bec Virtual Size: 192.7 MB Tags: ubuntu:latest |
イメージを削除するには docker rmi を使用します。
1 |
docker rmi ba5877dc9bec |
引数にはイメージの ID や名前を指定することができます。
まとめ
今回は Docker を使い始めたときに「最初に知っておきたかったこと」を中心にまとめました。
Dockerfile やコンテナ間の通信方法など、Docker を運用するために必要な知識はまだまだあります。それらについては今後取り上げていこうと思います。
Comments
記事参考になりました。ありがとうございます。