dshimizu/blog/alpha

とりとめのないITブログ

さくらのVPSのCentOS 6.5でDockerをさわってみた

はじめに

2013/11/21にRHEL 6.5がリリースされ、コンテナ型の仮想化ソフトウェア「Docker」への対応が発表されました。
以下リンク先の情報の通り、完全に「Docker」がサポートされた訳ではないため、利用するには外部リポジトリからDockerのパッケージを追加する必要があります。

なお、Dockerも2013/11/26にバージョン0.7がリリースされ、主要Linuxディストリビューションへの対応が発表されました。その中にはRHELも含まれています。

RHEL6.5に追従して、先日(2013/12/1)、RHELのクローンとなるCentOSのバージョン6.5がリリースされたので、CentOS 6.5の環境にDockerをインストールしてみました。以下に記載します。

Dockerのインストールと動作確認

環境

インストール環境は以下です。

プラットフォーム さくらのVPS SSD 2Gモデル
OS CentOS 6.5 x86_64 (カーネルバージョン 2.6.32-431.el6.x86_64)
DockerのRPMパッケージインストール

Dockerの公式ドキュメントやDocker社(旧dotCloud社)の公式ブログの情報を元にインストールを行います。

インストールはrootユーザで行います。rootユーザにスイッチします。


$ su -
パスワード:

DockerのRPMパッケージはCentOS標準リポジトリには存在せず、EPELリポジトリにあります。
EPELリポジトリがない場合はEPELリポジトリのパッケージをインストールします。


# rpm -ihv http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Dockerのパッケージをインストールします。lxc(Linux Containers)などが依存パッケージとしてインストールされます。


# yum install docker-io

Dockerのサービスを起動します。


# /etc/init.d/docker start
Starting cgconfig service: [ OK ]
Starting docker: [ OK ]

Dockerのインストールはこれで完了です。

CentOS6のコンテナ作成

CentOS6のコンテナを作成してみます。

Docker社のGIthubからCentOSのImage作成用のスクリプトを取得します。
現在はmkimage-centos.shからmkimage-rinse.shになっていますので過去のコミットログからmkimage-centos.shを取得します。


# cd /tmp

# wget https://github.com/dotcloud/docker/blob/8afb0abbee0ff135a5314d7078285378b8f49c93/contrib/mkimage-centos.sh

取得したスクリプトに実行権を付与して、実行します。
必要なパッケージが取得され、ファイルシステムアーカイブ(ここではcentos-64.tar.xz)が作成されます。


# chmod 775 mkimage-centos.sh

# ./mkimage-centos.sh

# ls
centos-64.tar.xz

ファイルシステムアーカイブをDockerのリポジトリへインポートします。"centos6_x86_64"の部分は好きな名前を指定します。


# cat centos-64.tar.xz | docker import - centos6_x86_64
f4f3b9b79842a9b3f7e0e1ea7ade3d2d0e4af6d0597165bffedbb99798c9fd09

リポジトリへインポートされた情報を確認します。


# docker images -notrunc
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6_x86_64 latest f4f3b9b79842a9b3f7e0e1ea7ade3d2d0e4af6d0597165bffedbb99798c9fd09 6 hours ago 300.2 MB (virtual 300.2 MB)

先ほどインポートしたアーカイブのイメージを元に、コンテナを起動します。
-tオプションの後ろにコンテナ作成に利用したいリポジトリ名:タグ名を指定します。タグ名は省略可能です。ここでは上記で登録した"centos6_x86_64(:latest)"を指定しています。 /bin/bashを指定して、コンテナのbashを起動しコンテナを操作します。この場合、-iオプションを付けてインタラクティブ(対話)モードにする必要があります。
※dockerでは基本的に1つのコンテナ起動時に指定した1つのプロセスを実行するような形になるようです。


# docker run -i -t centos6_x86_64:latest /bin/bash
bash-4.1#

bash-4.1# uname -a
Linux 82a772e0e0de 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

exitを実行すると、コンテナのbashが終了します。


bash-4.1# exit
基本動作確認

まだ分からない部分が多いのですが、マニュアルを見ながらいくつか触ってみました。

dockerコマンドのオプションは以下です。


# docker help
Usage: docker [OPTIONS] COMMAND [arg...]
-H=[unix:///var/run/docker.sock]: tcp://host:port to bind/connect to or unix://path/to/socket to use

A self-sufficient runtime for linux containers.

Commands:
attach Attach to a running container
build Build a container from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders from the containers filesystem to the host path
diff Inspect changes on a container's filesystem
events Get real time events from the server
export Stream the contents of a container as a tar archive
history Show the history of an image
images List images
import Create a new filesystem image from the contents of a tarball
info Display system-wide information
insert Insert a file in an image
inspect Return low-level information on a container
kill Kill a running container
load Load an image from a tar archive
login Register or Login to the docker registry server
logs Fetch the logs of a container
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
ps List containers
pull Pull an image or a repository from the docker registry server
push Push an image or a repository to the docker registry server
restart Restart a running container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save an image to a tar archive
search Search for an image in the docker index
start Start a stopped container
stop Stop a running container
tag Tag an image into a repository
top Lookup the running processes of a container
version Show the docker version information
wait Block until a container stops, then print its exit code
コンテナの一覧表示(docker ps オプション)

docker psコマンドの-aオプションでコンテナの一覧を表示してみます。/bin/bashExit 0となっているので正常に終了していることを示しています。


# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82a772e0e0de centos6_x86_64:latest /bin/bash 4 hours ago Exit 0 clever_davinci
コンテナの起動(docker start コンテナID)

docker startコマンドで起動したいコンテナを指定して、コンテナを起動します。


# docker start 82a772e0e0de
82a772e0e0de

コンテナのステータスがUPになりました。


# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82a772e0e0de centos6_x86_64:latest /bin/bash 4 hours ago Up 2 seconds clever_davinci
コンテナへの接続( docker attach コンテナID)

コンテナへattach(接続)してみます。bashが起動します。


# docker attach 82a772e0e0de
bash-4.1#

exitを入力すると終了します。


bash-4.1# exit

起動したままコンテナをdettachするにはCtrl-p + Ctrl-qを入力します。


bash-4.1# #
#
コンテナの停止(docker stop コンテナID)

docker stopコマンドで停止したいコンテナを指定して、コンテナを停止します。


# docker stop 82a772e0e0de
82a772e0e0de
コンテナの設定情報表示(docker inspect コンテナID)

docker inspectでコンテナの設定情報を表示できます。


# docker inspect 82a772e0e0de
[{
"ID": "82a772e0e0de28e69855223ea2695c8cd3309a7abaa856cfebc1b2272124ea7b",
"Created": "2013-12-08T10:17:05.541604445Z",
"Path": "/bin/bash",
"Args": [],
"Config": {
"Hostname": "82a772e0e0de",
"Domainname": "",
"User": "",
"Memory": 0,
"MemorySwap": 0,
"CpuShares": 0,
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"PortSpecs": null,
"ExposedPorts": {},
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": null,
"Cmd": [
"/bin/bash"
],
"Dns": null,
"Image": "centos6_x86_64",
"Volumes": {},
"VolumesFrom": "",
"WorkingDir": "",
"Entrypoint": null,
"NetworkDisabled": false
},
"State": {
"Running": false,
"Pid": 0,
"ExitCode": 137,
"StartedAt": "2013-12-08T15:10:27.897931338Z",
"FinishedAt": "2013-12-08T17:03:44.120620099Z",
"Ghost": false
},
"Image": "f4f3b9b79842a9b3f7e0e1ea7ade3d2d0e4af6d0597165bffedbb99798c9fd09",
"NetworkSettings": {
"IPAddress": "",
"IPPrefixLen": 0,
"Gateway": "",
"Bridge": "",
"PortMapping": null,
"Ports": null
},
"SysInitPath": "/var/lib/docker/init/dockerinit-0.7.0",
"ResolvConfPath": "/etc/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/82a772e0e0de28e69855223ea2695c8cd3309a7abaa856cfebc1b2272124ea7b/hostname",
"HostsPath": "/var/lib/docker/containers/82a772e0e0de28e69855223ea2695c8cd3309a7abaa856cfebc1b2272124ea7b/hosts",
"Name": "/clever_davinci",
"Driver": "devicemapper",
"Volumes": {},
"VolumesRW": {}
}]#
コンテナイメージのコミット(docker commit コンテナID リポジトリ名)

登録しているコンテナに変更を加えた後は、その情報をリポジトリにコミットすることができます。
新規コンテナ作成時にそのリポジトリを指定して作成することで、同一環境を簡単に作成することができます。

ID:82a772e0e0deのコンテナにパッケージを追加して試してみます。
dockerにattachします。


# docker attach 82a772e0e0de
bash-4.1#

bash-4.1# rpm -qa | wc -l
125

baseパッケージをインストールしてみます。


bash-4.1# yum groupinstall base

パッケージ数を確認します。


bash-4.1# rpm -qa | wc -l
363

コンテナを終了します。


bash-4.1# exit

baseパッケージをインストールしたコンテナIDを指定して、install/baseという名前でリポジトリcommitします。


# docker commit 82a772e0e0de install/base

リポジトリinstall/baseというイメージが登録されています。


# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
install/base latest 68512dfeb565 3 hours ago 430.5 MB (virtual 730.7 MB)
centos6_x86_64 latest f4f3b9b79842 6 hours ago 300.2 MB (virtual 300.2 MB)

新しくコンテナを作成する際に-tオプションでinstall/baseを指定すると、baseパッケージがインストールされたCentOS6を起動できます。


# docker run -i -t install/base /bin/bash
bash-4.1#

パッケージ数が先ほど作成したものと一致しています。


bash-4.1# rpm -qa | wc -l
363

コンテナの一覧を見ると新しく作成されたコンテナが表示されています。


# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
933b3258c5ba install/base:latest /bin/bash 18 seconds ago Exit 0 compassionate_thompson
82a772e0e0de centos6_x86_64:latest /bin/bash 5 hours ago Up 43 minutes clever_davinci
コンテナの削除(docker rm コンテナID)

コンテナを削除したい場合はdocker rmで削除したいコンテナIDを指定すると削除できます。


# docker rm 933b3258c5ba

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82a772e0e0de centos6_x86_64:latest /bin/bash 5 hours ago Up 43 minutes clever_davinci
リポジトリの削除(docker rmi イメージID)

リポジトリの削除はdocker rmiで削除したいイメージIDを指定します。


# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
install/base latest 68512dfeb565 3 hours ago 430.5 MB (virtual 730.7 MB)
centos6_x86_64 latest f4f3b9b79842 6 hours ago 300.2 MB (virtual 300.2 MB)

# docker rmi 68512dfeb565

# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6_x86_64 latest f4f3b9b79842 6 hours ago 300.2 MB (virtual 300.2 MB)
dockerのレジストリからイメージの取得(docker pull イメージ名)

今回、最初はスクリプトを使ってファイルシステムアーカイブからイメージを作成しましたが、Dockerの公式レジストリ(https://index.docker.io/)にもコンテナのイメージがあり、取得して利用することができます。

ubuntuのイメージを取得してみます。


# docker pull ubuntu
Pulling repository ubuntu
8dbd9e392a96: Download complete
b750fe79269d: Download complete
27cf78414709: Download complete

一覧が以下のようになってます。


# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6_x86_64 latest f4f3b9b79842 8 hours ago 300.2 MB (virtual 300.2 MB)
ubuntu 12.04 8dbd9e392a96 8 months ago 128 MB (virtual 128 MB)
ubuntu latest 8dbd9e392a96 8 months ago 128 MB (virtual 128 MB)
ubuntu precise 8dbd9e392a96 8 months ago 128 MB (virtual 128 MB)
ubuntu 12.10 b750fe79269d 8 months ago 175.3 MB (virtual 350.6 MB)
ubuntu quantal b750fe79269d 8 months ago 175.3 MB (virtual 350.6 MB)

Ubuntu 12.10を起動する場合は以下のようにします。


# docker run -i -t ubuntu:12.10 /bin/bash
root@4c7067de37e9:/#

root@4c7067de37e9:/# cat /etc/issue
Ubuntu 12.10 \n \l

また、自分でやってはいませんが、自身で作成したイメージを公式レジストリ(https://index.docker.io/)に登録することもできるようです。あらかじめサイト上でアカウントを作っておき、 docker loginした後にdocker pushすると登録でき、外部のどこからでも作成したリポジトリを参照することができるようになるようです。

おわりに

CentOS6.5へDockerをインストールして、コンテナの作成や簡単な動作を確認してみました。仮想マシンの作成は割と容易にでき、起動も一瞬なので手軽に使えるイメージでした。
コンテナ型仮想化ということでSolarisコンテナ(Zone)のようなイメージを持ってましたがそれよりはライトな感じで、仮想OS環境をガリガリ使うというよりは、特定用途の環境をあらかじめ作っておき必要に応じてサクッと起動して使うような感じなんですね。 (例えばApacheの環境を作っておき、docker run -p 10080:80 -d http(<-仮名称(Apacheがインストールされたコンテナイメージ名))"とかで手軽にApache環境を起動できるようにしておくような)
どのような使い方をするのが良いのかはまだわかりませんが、あらかじめ特定の環境を作成してそのコンテナイメージを登録しておき、必要なときに起動してテスト、不要となったら削除するといったような形でCIの仕組みに取り入れたりできそうなイメージでした。