以前、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
ちゃんとコミットされているようですね。次のページからは、一般ユーザの作成とコンテナおよびイメージのメンテナンスを行います。
[amazonjs asin="B00JWM4W2E" locale="JP" title="Docker入門 Immutable Infrastructureを実現する"]