CentOS 7.0でDockerを動かしてみた

CentOS 7.0でDockerを動かしてみた

先日開催された第2回東京SoftLayer勉強会で『SoftLayerでDockerを使ってみた』という発表があり、Dockerのインストールから使い方までの手順が解説されていました。

個人的にDockerを試してみたいということもあり、さっそく解説されていた手順を参考にDockerを動かしてみました。勉強会ではCentOS 6系向けの手順となっていましたが、私の方ではCentOS 7系で試してみました。

CentOS 7.0のセットアップ

GUI等は使用しないので、minimalインストールの状態からDocker環境を構築していきます。以下はインストール後にsshログインが行えるようになるまでの手順です。

SELinuxの無効化

/etc/selinux/configを以下のように修正し、SELinuxを無効化します。

--- config.orig 2014-07-29 11:24:02.949653548 +0900
+++ config      2014-07-29 11:24:09.957653412 +0900
@@ -4,7 +4,7 @@
 #     enforcing - SELinux security policy is enforced.
 #     permissive - SELinux prints warnings instead of enforcing.
 #     disabled - No SELinux policy is loaded.
-SELINUX=enforcing
+SELINUX=disabled
 # SELINUXTYPE= can take one of these two values:
 #     targeted - Targeted processes are protected,
 #     minimum - Modification of targeted policy. Only selected processes are protected.

grub.cfgの設定

起動時のコンソールログを見えるようにしておきたいので、/boot/grub2/grub.cfgを以下のように修正します。ついでにLANGもen_US.UTF-8に変更しておきます。

--- grub.cfg.orig       2014-07-29 11:24:18.721653243 +0900
+++ grub.cfg    2014-07-29 11:24:38.572652858 +0900
@@ -81,7 +81,7 @@
        else
          search --no-floppy --fs-uuid --set=root dd4521d9-ca1c-462b-b353-2ba57bf4fc61
        fi
-       linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=dd4521d9-ca1c-462b-b353-2ba57bf4fc61 ro vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=ja_JP.UTF-8
+       linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=dd4521d9-ca1c-462b-b353-2ba57bf4fc61 ro vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16 LANG=en_US.UTF-8
        initrd16 /boot/initramfs-3.10.0-123.el7.x86_64.img
 }
 menuentry 'CentOS Linux, with Linux 0-rescue-6764668114ff4741a8994286ae140fdd' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-6764668114ff4741a8994286ae140fdd-advanced-dd4521d9-ca1c-462b-b353-2ba57bf4fc61' {
@@ -95,7 +95,7 @@
        else
          search --no-floppy --fs-uuid --set=root dd4521d9-ca1c-462b-b353-2ba57bf4fc61
        fi
-       linux16 /boot/vmlinuz-0-rescue-6764668114ff4741a8994286ae140fdd root=UUID=dd4521d9-ca1c-462b-b353-2ba57bf4fc61 ro vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet
+       linux16 /boot/vmlinuz-0-rescue-6764668114ff4741a8994286ae140fdd root=UUID=dd4521d9-ca1c-462b-b353-2ba57bf4fc61 ro vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16
        initrd16 /boot/initramfs-0-rescue-6764668114ff4741a8994286ae140fdd.img
 }
 if [ "x$default" = 'CentOS Linux, with Linux 3.10.0-123.el7.x86_64' ]; then default='Advanced options for CentOS Linux>CentOS Linux, with Linux 3.10.0-123.el7.x86_64'; fi;

ホスト名の設定

以下の手順でホスト名を設定します。

# echo dockertest.furandon.net > /etc/hostname

固定IPアドレスの設定

DHCPよりも固定IPアドレスの方が作業しやすいため、Arch Wikiの『固定IPアドレス』を参考にしながら設定します。

/etc/conf.d/network@enp0s3にIPアドレス等を記述します。/etc/conf.dディレクトリは存在しないので予め作成しておきます。

# mkdir /etc/conf.d
# touch /etc/conf.d/enp0s3

/etc/conf.d/network@enp0s3の中身は以下の通りです。

address=192.168.0.232
netmask=24
broadcast=192.168.0.255
gateway=192.168.0.1

/etc/systemd/system/network@.serviceにsystemdのユニットファイルを作成します。
(Arch Wikiの内容を参考に作成しています)
Arch Wikiの/etc/systemd/system/network@.service中でipコマンドが/usr/bin/ipでフルパス指定されていますが、CentOS-7では/sbin/ipとパスが異なるので注意してください。

[Unit]
Description=Network connectivity (%i)
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/conf.d/network@%i

ExecStart=/sbin/ip link set dev %i up
ExecStart=/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev %i
ExecStart=/bin/sh -c 'test -n ${gateway} && /sbin/ip route add default via ${gateway}'

ExecStop=/sbin/ip addr flush dev %i
ExecStop=/sbin/ip link set dev %i down

[Install]
WantedBy=multi-user.target

サービスを有効化します。

# systemctl enable network@enp0s3.service

/etc/resolv.confの設定

インストール時にrpmパッケージのインストール等でネットワーク設定が行われており、/etc/resolv.confには(DHCPでのIPアドレス取得による)nameserver設定が入っています。固定IPアドレスでも同じnameserver設定を利用するため、この段階での設定変更は不要です。

LANGの設定

/etc/locale.confでLANGをen_US.UTF-8に設定します。
(日本語のままでいいよ、という場合はこの手順をスキップしてください)

--- locale.conf.orig    2014-07-29 11:24:55.014652540 +0900
+++ locale.conf 2014-07-29 11:25:01.258652419 +0900
@@ -1 +1 @@
-LANG="ja_JP.UTF-8"
+LANG="en_US.UTF-8"

不要なサービスの停止

Dockerを試す用途では不要と思われるサービスを停止します。

$ sudo systemctl disable avahi-daemon.service
$ sudo systemctl disable dbus-org.fedoraproject.FirewallD1.service
$ sudo systemctl disable dbus-org.freedesktop.Avahi.service
$ sudo systemctl disable dbus-org.freedesktop.NetworkManager.service
$ sudo systemctl disable dbus-org.freedesktop.nm-dispatcher.service
$ sudo systemctl disable NetworkManager-dispatcher.service
$ sudo systemctl disable NetworkManager.service
$ sudo systemctl disable postfix.service
$ sudo systemctl disable tuned.service
$ sudo systemctl disable avahi-daemon.socket

ユーザの追加

作業用のユーザを追加します。

$ sudo useradd -g users -G wheel -m -s /bin/bash fpig
$ sudo passwd fpig

再起動

ここで一旦再起動します。再起動後、固定IPアドレスが付与されているか等の確認をおこないます。

$ sudo shutdown -r now

ここまでで最低限の設定は完了し、sshでログインできる状態になっています。
以降はsshログインした状態での作業となります。

Dockerを試してみる

dockerのインストール

docker.x86_64というパッケージが提供されているので、これをインストールします。

$ yum search docker
...
docker-registry.noarch : Registry server for Docker
docker.x86_64 : Automates deployment of containerized applications
$ sudo yum install docker

勉強会で例示されていたCentOS 6系の環境では、EPELからDockerをインストールしていましたが、CentOS 7系の環境ではベースリポジトリにDockerパッケージが含まれていました。

$ rpm -qa | grep docker
docker-0.11.1-22.el7.centos.x86_64
$ yum provides docker
...
docker-0.11.1-19.el7.centos.x86_64 : Automates deployment of containerized
                                   : applications
Repo        : extras
$ grep -A5 '^\[extras' /etc/yum.repos.d/CentOS-Base.repo
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Dockerサービスを有効化します。DockerパッケージにSystemdのユニットファイルが同梱されているので、これを利用します。

$ rpm -ql docker-0.11.1-22.el7.centos.x86_64 | grep systemd
/usr/lib/systemd/system/docker.service
$ sudo systemctl enable docker.service
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'
$ systemctl list-unit-files | grep docker
docker.service                            enabled

上記設定は再起動してから有効になるので、ここでは手動でdocker.serviceを起動します。

$ sudo systemctl start docker.service

さっそくdockerコマンドを使ってみます。

$ sudo docker version
Client version: 0.11.1-dev
Client API version: 1.12
Go version (client): go1.2
Git commit (client): 02d20af/0.11.1
Server version: 0.11.1-dev
Server API version: 1.12
Go version (server): go1.2
Git commit (server): 02d20af/0.11.1

Dockerイメージのダウンロード

手元でDockerイメージを作るところまで試してみたかったのですが、まだ使い始めたばかりということもあり、既存のDockerイメージファイルを使ってみることにしました。

$ sudo docker pull ubuntu

しばらく待つとUbuntuのイメージファイルが手元にダウンロードされます。使用可能なイメージはdocker imageで確認できます。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               ba5877dc9bec        7 days ago          192.7 MB
ubuntu              trusty              ba5877dc9bec        7 days ago          192.7 MB
ubuntu              latest              ba5877dc9bec        7 days ago          192.7 MB
ubuntu              precise             b9e56c8f2cf5        7 days ago          103.8 MB
ubuntu              12.04               b9e56c8f2cf5        7 days ago          103.8 MB
ubuntu              14.10               6ef6f1a66de1        7 days ago          194.1 MB
ubuntu              utopic              6ef6f1a66de1        7 days ago          194.1 MB
ubuntu              12.10               c5881f11ded9        5 weeks ago         172.1 MB
ubuntu              quantal             c5881f11ded9        5 weeks ago         172.1 MB
ubuntu              13.04               463ff6be4238        5 weeks ago         169.4 MB
ubuntu              raring              463ff6be4238        5 weeks ago         169.4 MB
ubuntu              13.10               195eb90b5349        5 weeks ago         184.6 MB
ubuntu              saucy               195eb90b5349        5 weeks ago         184.6 MB
ubuntu              10.04               3db9c44f4520        3 months ago        183 MB
ubuntu              lucid               3db9c44f4520        3 months ago        183 MB

Dockerコンテナの起動

さっそくDockerでUbuntuを起動してみます。

$ sudo docker run -i -t ubuntu:14.10 /bin/bash

サクッとUbuntuが起動しました!
/etc/lsb-releaseを見ると、確かにUbuntuです。

root@9cf71dd83894:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.10
DISTRIB_CODENAME=utopic
DISTRIB_DESCRIPTION="Ubuntu Utopic Unicorn (development branch)"

Dockerコンテナのデタッチ・アタッチ

起動したDockerコンテナ上でexitするとコンテナは停止してしまいます。練習もかねてDockerコンテナのデタッチ→アタッチ→exitによるコンテナ停止という手順を試してみます。

Dockerコンテナを終了せずに抜ける(デタッチする)には、Ctrl+p Ctrl+qを入力します。

root@9cf71dd83894:/# (ここでCtrl+p Ctrl+qを入力)$
$

docker psコマンドで稼働しているコンテナを確認できます。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9cf71dd83894        ubuntu:14.10        /bin/bash           9 minutes ago       Up 9 minutes                            backstabbing_rosalind0

コンテナにアタッチしてみます。

$ sudo docker attach 9cf71dd83894
root@9cf71dd83894:/#

無事にアタッチでできました。後はexitでコンテナを終了します。

root@9cf71dd83894:/# exit
exit
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$

export/import

私の手元ではまだ試していませんが、イメージファイルのexport/importも可能です。
以下の手順でexport/importを行います。

$ docker export <コンテナID>
$ docker export 14773ff9e93c > myweb.tar    # コマンド例
$ docker import [リポジトリTAG]
$ docker import < - myweb:rel1 < myweb.tar  # コマンド例

ローカルストレージのアタッチ

こちらも私の手元では試していませんが、Runコマンドの"-v"オプションでホストのディレクトリをアタッチ可能です。

$ docker run -t -i -v <local_dir>:<container dir>:<rw|ro> centos /bin/bash
$ docker run -d -p 5000:5000 -v /home/hoge/data:/tmp/data centos  # コマンド例

/home/data/dataは、共有ストレージ(NFS)やディスクミラー(DRBD)、分散ストレージ(Ceph-fs)等を利用して自分でミラーリングします。

まとめ

参加した勉強会でDockerの一連の使用手順が解説されていました。Dockerを覚えてみたいと思っていたので、さっそく覚えた手順を自分の環境で試してみました。

思っていたよりも簡単にコンテナの実行が行え、ついに我が家にもDockerの技術が伝来したという感じです。
(種子島に火縄銃が伝来した……という気分です)

まだ試してはいないものの、イメージのexport/importやプライベートリポジトリといった機能もあるようなので、勉強会用のイメージ提供に活用できればと思います。