こちらに移行しました。
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社)の公式ブログの情報を元にインストールを行います。
- Requirements and Installation on Red Hat Enterprise Linux / CentOS - Docker Documentation
- Docker 0.7 & [RedHat | CentOS] 6.5 | CloudCounselor
インストールは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/bash
がExit 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:
コメントを投稿