2013/12/09

さくらの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の仕組みに取り入れたりできそうなイメージでした。

0 Comments:

コメントを投稿