Docker事始め

2014.6.9-10にサンフランシスコで開催されたdockercon14でDocker 1.0のリリースが発表されました。
開発版である0.x系から話題になっていましたが、ほとんどウォッチできていなかったため備忘録目的で記録します。

# Dockerとは
- Linux上に独立した別のLinuxを起動することができるコンテナ型仮想化ソフトウェアの一つ
- Go言語
- Linuxカーネルの機能を利用し、Linux向けファイルシステムに依存
    - Linux Namespaces
    - Linux cgroups
    - AUFS
    - Device Mapper Thin Provisioning
    - iptables
- Linuxカーネルの機能を利用/Linux向けファイルシステムに依存するため、Linuxでのみ動作
- Apache LIcense 2.0

※上記カーネルの機能とファイルシステムを利用してOSレベルでの仮想化を実現しています。
　cgroupsといったLinuxカーネルの比較的新しい機能を使うため対応しているディストリビューションとバージョンに注意が必要です。

# 試してみる
何はともあれ試してみましょう。
Docker公式サイトにinstall手順が公開されているので、そちらを参考にします。
**※EPELリポジトリのDockerバージョンはまだ0.11.1ですが…**
## 今回の構成
``` bash
# cat /etc/issue
 CentOS release 6.5 (Final)
# uname -rm
 2.6.32-431.17.1.el6.x86_64 x86_64
```

## 手順
``` bash
# cd /usr/local/src/ 
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh ./epel-release-6-8.noarch.rpm
# yum info docker-io
Available Packages
Name        : docker-io
Arch        : x86_64
Version     : 0.11.1
Release     : 4.el6
Size        : 4.4 M
Repo        : epel
Summary     : Automates deployment of containerized applications
URL         : http://www.docker.io
License     : ASL 2.0
Description : Docker is an open-source engine that automates the deployment of any
            : application as a lightweight, portable, self-sufficient container that will
            : run virtually anywhere.
            : 
            : Docker containers can encapsulate any payload, and will run consistently on
            : and between virtually any server. The same container that a developer builds
            : and tests on a laptop will run at scale, in production*, on VMs, bare-metal
            : servers, OpenStack clusters, public instances, or combinations of the above.
# yum install -y docker-io
# service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:                                           [  OK  ]
# chkconfig --list docker
docker          0:off   1:off   2:on    3:on    4:on    5:on    6:off
# docker pull centos:latest
Pulling repository centos
0c752394b855: Downloading [==================================================>] 43.23 MB/43.23 MB
0c752394b855: Download complete
34e94e67e63a: Download complete
34e94e67e63a: Pulling metadata
# docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              0c752394b855        5 days ago          124.1 MB
# docker run -i -t centos /bin/bash
bash-4.1#
bash-4.1# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx:xx:xx
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          ...
bash-4.1# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
bash-4.1# touch hoge.txt
bash-4.1# ls
bin  dev  etc  hoge.txt  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
bash-4.1# exit
# docker run -i -t centos /bin/bash
bash-4.1#
bash-4.1# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx:xx:xx
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          ...
bash-4.1# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
bash-4.1# exit
```
runで起動したコンテナにhoge.txtを作成した後にログアウト、再度runしてlsを実行するとIPアドレスは同じですがhoge.txtが存在しません。
runするたびに別コンテナが作成されているイメージでしょうか？
docker psコマンドでコンテナを確認できるみたいなので確認してみます。

```
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
dbf78a9f8038        centos:latest       /bin/bash           49 seconds ago      Exited (0) 1 seconds ago                        kickass_babbage
4622e26ea152        centos:latest       /bin/bash           18 minutes ago      Exited (0) 7 minutes ago                        furious_wilson
```

コンテナはdocker rmコマンドで削除可能のようです。

```
# docker rm 4622e26ea152
4622e26ea152
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
dbf78a9f8038        centos:latest       /bin/bash           49 seconds ago      Exited (0) 1 seconds ago                        kickass_babbage
```

# 試してみて
dockerのインストールとコンテナの起動/停止まで試してみました。
ハイパーバイザー型の仮想化と比べて気軽に環境が作れるのが魅力でしょうか。
コンテナ側のIPアドレスは別セグメントで払い出されているようなので、ホストOSとコンテナの通信はNATするようなイメージなんでしょうか？
次回はこの辺について追っていきたいと思います。