隔離の技術Dockerの考え方と使い方の基本


こんにちは、鈴木です。

AWSでDockerを使ってみよう!」では Docker を取りあえず使ってみました。今回は「Docker とは?」というところから、Docker の基本的な操作を行うところまで見ていこうと思います。

Docker とは

Docker とはコンテナ型の仮想化を実現するためのソフトウェアです。

Xen や VMware のようなサーバ仮想化との違いは、扱う単位がマシンではなくプロセスである点です。

この違いは非常に重要です。

サーバ仮想化ではホストマシン上でゲストマシンが動き、ゲストマシン内で様々なプロセスが動きます。一方のコンテナ型の仮想化では、ホスト OS 上にコンテナという隔離された空間が作成され、その中でプロセスが実行されます。

コンテナは隔離の技術

Docker を使い始めたばかりだと「コンテナ内に bash で接続してみたけれど cron や syslog 等のデーモンが動いていない…」と困惑してしまうことがあるかもしれません。

しかしコンテナ内で動いているのはマシンではなく単なるプロセス(この場合は bash のプロセス)であるため、当然ながら cron や syslog 等の他のプロセスは動いていません。「コンテナという隔離された空間で一つのプロセスが動く」という意識を持つことが大切です。

「仮想化」と言われると「ホストマシンの上でゲストマシンが動く」というレイヤー構造をイメージしてしまいますが、コンテナ型の仮想化では全てのプロセスがホストマシン上で動きます。コンテナ型の仮想化は、ホストの空間を縦に切る、隔離の技術と言えます。

サーバ仮想化とコンテナ型の仮想化の違いを図で表すと以下のようになります。

Docker-サーバ仮想化Docker-コンテナ型仮想化

コンテナ型仮想化の図で、コンテナ内で動いていないプロセスがあります。これは普通のプロセスとコンテナ内で実行するプロセスが同じホストマシン上に同居していることを表しています。

Docker 用語集

Docker を使う上で良く出てくる用語についてまとめます。

コンテナ

外部からプロセス空間やネットワーク等が隔離された空間のことです。コンテナの中でプロセスが動きます。

イメージ

コンテナのテンプレートです。イメージを元にして新しいコンテナを作成します。

レジストリ

イメージが保存される場所のことです。Docker Hub のようなパブリックなサービスもあり、イメージを共有することもできます。各種ディストリビューションやミドルウェア用のオフィシャルなイメージも提供されているため、自分用のイメージを作成するときのベースに利用すると便利です。

Docker の基本的な操作

イメージを取得する

まずはリポジトリからイメージを取得することから始めましょう。

リポジトリにどのようなイメージがあるのか Docker Hub Registry で確認することができます。Ubuntu や CentOS、PostgreSQL や WordPress 等のオフィシャルイメージもあるので、用途に合ったイメージを取得します。

docker search コマンドで検索することもできます。

ここでは Ubuntu の最新(latest)を取得します。

コンテナを作成する(コマンドを新しいコンテナで実行する)

コンテナを作成(コンテナでプロセスを実行)してみましょう。

適当なファイルを作成してみます。

デタッチ、アタッチ、コンテナの終了

コンテナからデタッチするには Ctrl+p を押し、次に Ctrl+q を押します。

これでコンテナからデタッチできました。

プロセスの一覧を確認すると、デタッチしたコンテナが動き続けていることが分かります。

「STATUS」の部分が「Up 3 minutes」となっています。これは 3 分前に起動した(まだ実行中)ということを意味します。

「CONTAINER ID」は「2067f43896a2」となっています。この ID はコンテナを操作するときに使用します。

例えばコンテナにアタッチするには次のようにします。

先ほど作成した /tmp/hello.txt が残っているか確認してみましょう。

それでは exit で bash を終了しましょう。

docker ps で確認するとコンテナ一覧から消えているはずです。

-a オプションを指定すると終了したコンテナも表示することができます。

「STATUS」が「Exited (0) 13 seconds ago」となっていることから、「13 秒前に終了ステータス 0 で終了した」ことが分かります。

コンテナの開始と停止

docker start でコンテナを再実行することができます(再度アタッチできるようになります)。

引数はコンテナの ID です。

コンテナを停止するには docker stop を使用します。

引数はコンテナの ID です。

コンテナからイメージを作成する

コンテナからイメージを作成することができます。

引数はコンテナ ID と作成するイメージの名前です。

リポジトリからベースとするイメージを取得し、それに必要なセットアップを行い、自分用のイメージとして保存しておけば、次回から同じセットアップ作業を行わなくて済みます。

コンテナを削除する

Docker を使うとコンテナを作成 / 破棄を気軽に行うことができます。しかし、コンテナの情報は全て残されるため、いつの間にかディスクを大量に消費していた、ということもあります。

docker ps にオプション a と s を付けて実行してみましょう。

-a は前述のとおり終了したコンテナも表示させるオプションです。-s を付けるとコンテナのサイズも出力されます。一番右の「SIZE」という項目が「95 B」となっています。

「たったの 95 バイト?」と思われるかもしれませんが、「hello.txt」というファイルを作成しただけだからです。

パッケージのインストールなどを行うと、すぐに数十MB、数百MBになってしまいます。そのため、不要なコンテナはディスクの空き容量と相談しながら削除してあげる必要があります。

コンテナを削除するには docker rm を使用します。

引数にはコンテナの ID や名前を指定します。

イメージを削除する

イメージもまずまずのディスクを消費するので、不要となったイメージは削除した方が良いでしょう。

イメージの一覧を確認するには docker images を使用します。

-a オプションを付けると「中間イメージ」も表示することができます。

Docker のイメージは、ベースとするイメージからの差分が積み上げられたものです。

-t オプションを指定すると、イメージがどのように積み上げられているか確認することができます(※出力を見ると -t は非推奨であり、将来削除されるようです)。

イメージを削除するには docker rmi を使用します。

引数にはイメージの ID や名前を指定することができます。

まとめ

今回は Docker を使い始めたときに「最初に知っておきたかったこと」を中心にまとめました。

Dockerfile やコンテナ間の通信方法など、Docker を運用するために必要な知識はまだまだあります。それらについては今後取り上げていこうと思います。

 


Comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です