日次アーカイブ: 2014年06月16日

以前、LXCでコンテナ作って遊んでいたりしたのですが、最近ではdockerが流行りのようですね。LXCとの違いなどについてはいずれ勉強会で話したいなーとは思いますが、まずは手元のマシンにdockerをインストールしてCentOSを起動してみるのと、ちょっとしたシェル芸を使ってコンテナをメンテするところまでをやってみましょう。 USP MAGAZINE vol.14

■ dockerのインストール

私は手元のノートPC(fedora 20)へインストールしました。fedora20の場合は、特にリポジトリの設定は不要です。CentOSの場合は、epelリポジトリからインストールします。ここで1点注意が必要なのですが、fedoraもCentOSもパッケージ名は「docker-io」です。パッケージ名が「docker」というのもありますが、これはGnomeやKDEのパネル引き出しなので気をつけましょう。

[fedora]dockerインストール

[ (っ´∀`)っ@友の会 ~]$ sudo yum install docker-io

[CentOS]dockerインストール

[ (っ´∀`)っ@友の会 ~]$ sudo yum --enablerepo=epel install docker-io

以降は、fedora20上で実行することを前提に解説します。

■ CentOSのコンテナ作成

まずはdockerを起動します。

[hamada@u24e ~]$ sudo systemctl start docker

CentOSのコンテナイメージは、dockerのリポジトリより取得します。本稿執筆時点では、CentOS 6.5のイメージがダウンロードされます。と言っても、コンテナ作成前にわざわざブラウザやCLIから事前にダウンロードしておく必要はありません。

コンテナがどれだけあるかは「docker ps」コマンドで確認します。実行中でないコンテナも含めて表示するには「docker ps -a」と実行します。

[hamada@u24e ~]$ sudo docker ps -a
CONTAINER ID    IMAGE           COMMAND         CREATED         STATUS          PORTS           NAMES

まだコンテナを作成していないので、1つもコンテナが表示されません。次に、コンテナのイメージ一覧を見るには、「docker images」コマンドで確認します。

[hamada@u24e ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

こちらもまだコンテナを作成していないので、イメージファイルがありません。それでは早速コンテナを作成してみましょう。以下のコマンドで最初にコンテナを作成するときに、dockerのリポジトリからイメージファイルのダウンロードが始まります。

[hamada@u24e ~]$ sudo docker run -i -t centos /bin/bash
Unable to find image 'centos' locally
Pulling repository centos
0c752394b855: Download complete 
511136ea3c5a: Download complete 
34e94e67e63a: Download complete

コンテナのダウンロード〜作成の処理が終わると、プロンプトが「bash-4.1#」となります。実際に何度かログインして見てみたのですが、本当に最小限のパッケージしかなく、tarコマンドすらもなかったので、最初にこれだけのパッケージをインストールしました。

bash-4.1# yum install bind-utils bzip2 file sudo tar time traceroute unzip vim-common vim-minimal which wget telnet iputils iproute yum-utils

他のコマンドは、サーバやネットワークの調査に使うコマンドやvimの設定などの好みがあるのでインストールしていますが、 yum-utils パッケージだけは、後で使いますので必ずインストールしておいてください。

 

■ コンテナの内容をコミットする

dockerコンテナのシェルからexitすると、これまでの内容が消えてしまいます。なので、現時点でのコンテナの内容を保存したいときはコンテナの内容をコミットしましょう。再度ログインしたときにコミットされていることを確認するため、試しにdateコマンドの出力結果をテキストに残しておきます。

bash-4.1# pwd
/

bash-4.1# cd /root

bash-4.1# ls -la
total 28
dr-xr-x---  2 root root 4096 Jun  9 16:14 .
dr-xr-xr-x 21 root root 4096 Jun 16 00:26 ..
-rw-r--r--  1 root root   18 May 20  2009 .bash_logout
-rw-r--r--  1 root root  176 May 20  2009 .bash_profile
-rw-r--r--  1 root root  176 Sep 23  2004 .bashrc
-rw-r--r--  1 root root  100 Sep 23  2004 .cshrc
-rw-r--r--  1 root root  129 Dec  3  2004 .tcshrc

bash-4.1# date > date.txt ; cat date.txt
Mon Jun 16 00:30:34 BST 2014

ここまでできたら一旦「Ctrl+P」→「Ctrl+Q」で抜けて、ホスト側のシェルに戻り、CONTAILNER IDを確認するため「docker ps -a」を実行します。

[hamada@u24e ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fda32aa9fa7d        centos:latest       /bin/bash           5 minutes ago       Up 5 minutes                            goofy_fermi

それでは先ほどまでログインしていたコンテナに名前をつけてコミットしてみましょう。ここでは仮に「nullpopopo/test<日付><通し番号>」とします。

[hamada@u24e ~]$ sudo docker commit fda32aa9fa7d nullpopopo/test$(date +%Y%m%d)00
db0e843b3ca780e268dd2b39835456891b29d2291392524d146f33c63eae2e33

「docker commit」の直後の引数は、「docker ps -a」で確認した「CONTAINER ID」です。 それではもう1度イメージを見てみましょう。

[hamada@u24e ~]$ sudo docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
nullpopopo/test2014061600   latest              db0e843b3ca7        5 minutes ago       211 MB
centos                      latest              0c752394b855        6 days ago          124.1 MB

今までの「centos」リポジトリから「nullpopopo/test2014061600」という別のリポジトリになりました。これまでコンテナに施した変更は、「nullpopopo/test2014061600」に引き継がれます。最初にダウンロードしてきたイメージ「centos」が不要な場合は、ここで削除しても構いません。

[hamada@u24e ~]$ sudo docker rmi 0c752394b855
Untagged: centos:latest

イメージを削除するには、「docker rmi」コマンドの後にIMAGE IDを引数に渡してあげます。それではもう一度イメージの一覧を見てみましょう。

[hamada@u24e ~]$ sudo docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
nullpopopo/test2014061600   latest              db0e843b3ca7        5 minutes ago       211 MB

「centos」のイメージが削除されました。そして今度は、コミットされたかどうかを、コンテナログイン後に日付テキストを開いて確認します。

[hamada@u24e ~]$ sudo docker run -i -t nullpopopo/test2014061600 /bin/bash

bash-4.1# cat /root/date.txt 
Mon Jun 16 00:30:34 BST 2014

ちゃんとコミットされているようですね。次のページからは、一般ユーザの作成とコンテナおよびイメージのメンテナンスを行います。