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入門」最新記事一覧 - @IT
- CentOS6.5にdockerをインストール - Qiita
- Dockerコマンドメモ - Qiita
- 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