[CentOS6] Docker を試す


Create: 2014/09/27
LastUpdate: 2014/09/28

Docker」とは、Docker社(旧dotCloud)が開発するオープンソースのコンテナ管理ソフトウェアの1つです。

コンテナとはWebサーバーなどアプリケーションの実行環境を抽象化する技術であり、VMware ESXiやLinux KVMなどの「ハイパーバイザー型の仮想化」に対して、「コンテナ型の仮想化」と呼ばれることもあります。

「ハイパーバイザー型の仮想化」に対して、「コンテナ型の仮想化」との違いは、扱う単位がマシンではなくプロセスである点です。 「ハイパーバイザー型の仮想化」ではホストマシン上でゲストマシンが動き、ゲストマシン内で様々なプロセスが動きます。 一方の「コンテナ型の仮想化」では、ホスト OS 上にコンテナという隔離された空間が作成され、その中でプロセスが実行されます。

Docker は、64bit の Linux だけで動作します。

CentOS6の場合は、Linuxカーネルの不具合に起因してdockerのdevicemapperがディスクを開放しないことがある(Device-mapper does not release free space from removed)そうなのでKernel 2.6.32-431 以上のバージョンを使用したほうがいいようです。

Dockerを試したときに、基本を学習するために私が参考にしたのは以下のサイトです。
特に Qiita のサイトを見れば、インストールから基本的な使い方までわかると思います。

用語 


Docker を使う上で良く出てくる用語は、以下のとおり。
  • [ コンテナ ]
    外部からプロセス空間やネットワーク等が隔離された空間のことです。コンテナの中でプロセスが動きます。
  • [ イメージ ]
    コンテナのテンプレートです。イメージを元にして新しいコンテナを作成します。
  • [ レジストリ ]
    イメージが保存される場所のことです。Docker Hub のようなパブリックなサービスもあり、イメージを共有することもできます。各種ディストリビューションやミドルウェア用のオフィシャルなイメージも提供されているため、自分用のイメージを作成するときのベースに利用すると便利です。

Dockerの実体ファイルはどこか 


Docker のコンテナなどDocker関連の実体ファイルが、ホストのどこのディレクトリに格納されるかなどは、以下が参考になります。
XenServerのCentOS6.5 でカーネルを標準のまま、docker を使用していたら、コンテナやイメージを削除したり、build を繰り返すと /var/lib/docker が肥大化していきました。やはり、カーネルのバージョンをあげないと、すぐにDISKがパンクして使えません。
XenServerのCentOS7の Docker は /var/lib/docker が肥大化することはありませんでした。

コンテナを動かす


一番簡単な使用方法は、「docker run centos コマンド」として、コンテナでコマンドを実行することです。
初回は、public repository から CentOS最新版のイメージ(OFFICAIL)をダウンロードして、コンテナを作成→起動→コマンド実行→停止します。
2回名以降は、ダウンロードした ローカルの centos イメージを使用します。
コンテナは、毎回、新規に作成され、以下のようにすると、過去に生成したコンテナを見ることができます。
# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                         PORTS               NAMES
51b710e6f345        centos:latest       touch /root/dummy.da   4 seconds ago       Exited (0) 2 seconds ago                           insane_morse
e38259d05315        centos:latest       uname -n               55 minutes ago      Exited (0) 55 minutes ago                          sick_brattain
0fb06b38e1cc        centos:latest       uname -n               59 minutes ago      Exited (0) 59 minutes ago                          jolly_leakey
85a51d2c97fe        centos:latest       hostname               59 minutes ago                                                         kickass_carson
55bb81d7a6ab        centos:latest       ip a                   About an hour ago   Exited (0) About an hour ago                       lonely_heisenberg
cc8ea31c596b        centos:latest       ifconfig               About an hour ago                                                      furious_bohr
4bdfacbb3109        centos:latest       /bin/cat /etc/redhat   About an hour ago   Exited (0) About an hour ago                       focused_newton

イメージとコンテナの差分を見たい場合は「docker diff」を使用します。
以下の例では、touch コマンドで生成したファイルが centos イメージとの差分として表示されています。
# docker diff 51b710e6f345
C /root
A /root/dummy.dat

あと、上記以外にも、コンテナ内部で作業したり、コンテナを常時起動状態にしたり、過去に作成したコンテナを再利用するなど、いろいろな使用方法があるので、ページの最初で紹介した Qiita さんや @IT さんなどのサイトを参考にしてください。

イメージ を探したり、作ったり


「docker run centos」などとしたきに探すイメージは https://index.docker.io/ から情報を持ってきます。コマンドラインで検索したい場合は search コマンドを利用します。
# docker search centos
NAME                                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                          The official build of CentOS.                   465       [OK]
tianon/centos                                   CentOS 5 and 6, created using rinse instea...   28
saltstack/centos-6-minimal                                                                      6                    [OK]
blalor/centos                                   Bare-bones base CentOS 6.5 image                6                    [OK]
steeef/graphite-centos                          CentOS 6.x with Graphite and Carbon via ng...   5                    [OK]
tutum/centos-6.4                                DEPRECATED. Use tutum/centos:6.4 instead. ...   5                    [OK]
cern/centos-wlcg-wn                             CentosOS 6 image with pre-installed softwa...   4
ariya/centos6-teamcity-server                   TeamCity Server 8.1 on CentOS 6                 3                    [OK]
openshift/centos-mongodb                                                                        3                    [OK]
~省略~
現在、「docker run centos」としたきにダウンロードされる centos イメージのバージョンは CentOS7.0 のようです。
# docker run centos /bin/cat /etc/redhat-release
Unable to find image 'centos' locally
Pulling repository centos
76749a268d88: Download complete
511136ea3c5a: Download complete
0b2c58b208cf: Download complete
CentOS Linux release 7.0.1406 (Core)

自分で、イメージを自作して、CentOS6.5 のイメージを作ったりしたい場合は、以下のサイトが参考になります。

コンテナを手順に従って自動生成する


DockerにはDockerfileというものがあります。
「docker build」 を行うと、指定したパスからDockerfileを探し、コンテナを新規作成し記述されたステップを実行した後、コミットをしてコンテナイメージの作成までを自動で行います。
例えば、CentOS6.5の最小構成イメージからLANP環境をビルドしてコンテナを自動生成することができます。
以下のサイトが参考になります。
CentOS7 のDocker で build したら useradd でエラーになりました。
以下のようにして SELinux を無効にしたら解決しました。
/etc/selinux/config で SELINUX を disable にしてもダメで、コメントアウトしないと docker でいろいろとエラーになります。
#SELINUX=disabled

コンテナのネットワーク 


コンテナのネットワークは、以下のとおり。
内部的なIPが割り当てられます。(毎回、違うIPが割り当てられる)
#  docker run centos ip a ; route
31: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
32: eth0: <NO-CARRIER,BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 7e:14:d4:85:b5:81 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.11/16 scope global eth0
    inet6 fe80::7c14:d4ff:fe85:b581/64 scope link tentative
       valid_lft forever preferred_lft forever
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 docker0
default         router01.blue21 0.0.0.0         UG    0      0        0 eth0

「docker run」 時に -p をつけることで、コンテナから外部にさらすポートを決められます。
コンテナ側のポートはホスト側のポートに変換される際、ポート番号が変更される(49153以降になる)ので、docker port <ジョブのID> <ポート番号> あるいは docker ps でポートの対応状況を確認する必要があります。
以下のサイトが参考になります。

コンテナのホスト名 


コンテナのホスト名は、以下のとおり。
ホスト名は、自動生成されます。
#  docker run centos uname -n
0fb06b38e1cc

「docker run」 時 -h をつけることで変更できます。
#  docker run -h my_host centos uname -n
my_host