Migrate to Red Hat Enterprise Linux

Dockerホーム > 今日からできるDocker on RHEL7

今日からできるDocker on RHEL7

by Hajime Taira

レッドハット株式会社
プラットフォームソリューショングループ
ソリューションアーキテクト&
クラウドエバンジェリスト
平 初

RHEL 7 からコンテナー管理ツールとして Docker が搭載されました。Docker はコンテナー管理のための管理フレームワークです。Linux が標準で提供しているコンテナー技術である Linux コンテナー (lxc) や、もしくは、RHEL 7 で採用されている libcontainer と呼ばれるコンテナー管理の仕組みを使い、アプリケーション実行環境を軽量かつ効率的に整えることができます。コンテナー技術を利用することにより、1つのサーバー上に複数のアプリケーションを稼働させることができます。
それぞれのアプリケーションはコンテナーの中で稼働します。その点では、本書で紹介している仮想化技術 Linux KVM に似た側面もあります。
コンテナー技術は仮想化技術よりもリソースの共有度合いが大きいため、仮想化技術よりもオーバーヘッドも少なく、また、各種リソースの集約度を高めることができます。

Dockerの特長と利点

Docker はコンテナーイメージの管理を中心として、コンテナー内のアプリケーションの稼働状況の管理や、稼働中のコンテナーが利用できるリソースの制限を行います。
しかし、コンテナー技術は仮想化技術と似ていますが仮想化技術の代替ではありません。アプリケーションやライブラリをコンテナーが持つディスクイメージの中に格納して、アプリケーションにポータビリティをもたらします。たとえ、コンテナーを稼働する環境が物理サーバー、仮想サーバー、パブリッククラウドであったとしても、Dockerが管理する環境であれば、コンテナー作成者が期待する通りにデプロイされ格納されているアプリケーションが期待通りに動きます。
つまり、コンテナー技術は仮想化技術よりも上位層でアプリケーション開発者が期待するアプリケーション実行環境を提供し、Docker は、コンテナー上で動かすアプリケーションの配信基盤を提供します。
また、Docker で生成したコンテナーは、1コンテナー = 1プロセスで構成することを原則としております。よって、コンテナー内で起動するプロセスの指定はシンプルに起動コマンドを指定しましょう。複数プロセスを起動したいのであれば運用管理を行う観点から見るとOS一式が動作する仮想化技術の方が適切な選択肢と言えます。

Dockerを利用するには

Dockerを利用するには、subscription-manager にて RHEL 7 の Extrasチャンネル(rhel-7-server-extras-rpms)を有効化して、docker パッケージをインストールします。

# subscription-manager repos --enable=rhel-7-server-extras-rpms
# yum install docker -y

Dockerサービスを開始する

systemd で docker サービスを開始します。初回サービス開始時にコンテナーのデータ領域を確保する処理を行うため、初回のサービス起動には少し時間がかかります。

# systemctl start docker.service
# systemctl enable docker.service

Dockerサービスの状態を確認する

# systemctl status docker.service
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
Active: active (running) since Sat 2014-06-28 14:16:05 JST; 1min 55s ago
Docs: http://docs.docker.io
Main PID: 23330 (docker)
CGroup: /system.slice/docker.service
`-23330 /usr/bin/docker -d --selinux-enabled -H fd://
Jun 28 14:16:04 localhost.localdomain docker[23330]: [25cf1cbd.init_networkdriver()] creating new bridge for docker0
Jun 28 14:16:04 localhost.localdomain docker[23330]: [25cf1cbd.init_networkdriver()] getting iface addr
Jun 28 14:16:05 localhost.localdomain docker[23330]: [25cf1cbd] -job init_networkdriver() = OK (0)
Jun 28 14:16:05 localhost.localdomain docker[23330]: Loading containers: : done.
Jun 28 14:16:05 localhost.localdomain docker[23330]: [25cf1cbd.initserver()] Creating pidfile
Jun 28 14:16:05 localhost.localdomain docker[23330]: [25cf1cbd.initserver()] Setting up signal traps
Jun 28 14:16:05 localhost.localdomain docker[23330]: [25cf1cbd] -job initserver() = OK (0)
Jun 28 14:16:05 localhost.localdomain docker[23330]: [25cf1cbd] +job acceptconnections()
Jun 28 14:16:05 localhost.localdomain docker[23330]: [25cf1cbd] -job acceptconnections() = OK (0)
Jun 28 14:16:05 localhost.localdomain systemd[1]: Started Docker Application Container Engine.

docker infoコマンドを実行することで、更に詳しい Docker サービスの状態を確認できます。

# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
Pool Name: docker-253:0-2227238-pool
Data file: /var/lib/docker/devicemapper/devicemapper/data
Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 293.0 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 0.7 Mb
Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.10.0-123.el7.x86_64

Docker公式レジストリからイメージを検索する

Dockerイメージを格納する場所をDockerレジストリと言います。インストール後すぐに使えるようになっているDocker公式レジストリ(registry.hub.docker.com)から、公式イメージをはじめ、他のユーザーが作成して登録したDockerイメージをダウンロードすることができます。イメージを検索するには docker search コマンドを実行します。

# docker search centos
NAME DESCRIPTION STARS OFFICIAL TRUSTED
centos The official build of CentOS. 194
tianon/centos CentOS 5 and 6, created using rinse instea... 23
blalor/centos Bare-bones base CentOS 6.5 image 4 [OK]

Dockerリポジトリから入手する場合には docker pull コマンドを実行します。
試しにDockerリポジトリで公式に配布されている centos イメージをダウンロードしてみましょう。

# docker pull centos
Pulling repository centos
0c752394b855: Download complete
539c0211cd76: Download complete
511136ea3c5a: Download complete
34e94e67e63a: Download complete

Dockerリポジトリから入手したイメージの一覧を表示するには docker images コマンドを実行します。

# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos centos6 0c752394b855 2 weeks ago 124.1 MB
centos latest 0c752394b855 2 weeks ago 124.1 MB
centos 6.4 539c0211cd76 15 months ago 300.6 MB

Dockerコンテナーを生成する

リポジトリから入手した centos イメージからコンテナーを生成してみましょう。まずはインタラクティブモードで /bin/bash 起動します。-i オプションでインタラクティブモード、-t オプションで仮想端末を割り当てます。

# docker run -it centos:latest /bin/bash

次のようなbashのプロンプトが表示されますので cat コマンドで /etc/centos-release の中を確認してみましょう。

bash-4.1# cat /etc/centos-release
CentOS release 6.5 (Final)

いかがでしょうか?CentOSが動いている気分になりましたか?しかしながらカーネルは共有しているので、コンテナーの中で uname コマンドを実行するとコンテナー実行環境であるRHEL7のカーネルバージョンが表示されます。つまりOSの実体としては1つなのです。

bash-4.1# uname -r
3.10.0-123.el7.x86_64

コンテナーの中で ps コマンドを実行すると面白い結果が返ってきます。/bin/bash がプロセスID:1 で動いているのです。ベースのRHEL7上でプロセスID:1 にて動いているはずのsystemd (/usr/lib/systemd/systemd)のプロセスも表示されません。コンテナー実行環境で動いているプロセスや、他のコンテナー上で動いているプロセスは隠蔽化されます。

# ps ax
PID TTY TIME CMD
1 ? 00:00:00 bash
31 ? 00:00:00 ps

Docker上のコンテナーの稼働状況を確認する

Docker上で稼働するコンテナーの稼働状況を確認するには docker ps コマンドを実行します。なお、先程起動した centos のコンテナーの bash を抜けてしまうとコンテナーが停止してしまうので別のターミナルから実行してください。

# docker ps
CONTAINER ID       IMAGE              COMMAND            CREATED            STATUS             PORTS              NAMES
9f7826d6922a       centos:centos6     /bin/bash          25 seconds ago     Up 24 seconds                         ecstatic_fermat5    

docker ps コマンドに -a オプションをつけると現在は稼働していない停止中のコンテナーも一覧に表示します。

# docker ps -a
CONTAINER ID       IMAGE              COMMAND            CREATED             STATUS             PORTS              NAMES
9f7826d6922a       centos:centos6     /bin/bash          25 seconds ago      Up 24 seconds                          ecstatic_fermat5    
d393e25f35fa       centos:centos6     /bin/bash          About a minute ago   Exited (-1) 7 seconds ago             furious_carson4

Dockerコンテナーを削除する

プロセスが終了したDockerコンテナーや明示的にstopさせたDockerコンテナーは、停止状態になっておりディスクイメージだけ消費しています。
そこで docker rm コマンドでコンテナーIDを指定して実行することでDockerコンテナーのスナップショットイメージを消すことができます。

# docker rm d393e25f35fa
d393e25f35fa
# docker ps -a
CONTAINER ID       IMAGE              COMMAND            CREATED            STATUS             PORTS              NAMES
9f7826d6922a centos:centos6 /bin/bash 25 seconds ago Up 24 seconds ecstatic_fermat5

RHEL7のDockerイメージの入手方法

RHEL7のDockerイメージの入手方法については、Resource Management and Linux Containers Guideに記載があります。また、ナレッジベースの Articles#881893 もご確認ください。

*Resource Management and Linux Containers Guide
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Resource_Management_and_Linux_Containers_Guide/

*Articles#881893: Get Started with Docker Containers in RHEL 7
https://access.redhat.com/site/articles/881893

以下のURLにアクセスして、tar.gz形式で提供されているDockerイメージをダウンロードする必要があります。

Get Started with Docker Containers in RHEL 7
https://access.redhat.com/search/browse/docker-images

執筆時(2014年6月現在)では「rhel-server-docker-7.0-21.4-x86_64.tar.gz」というファイルが配布されています。 ダウンロードしたRHEL7のDockerイメージをdocker loadコマンドで取り込みます。

# docker load -i rhel-server-docker-7.0-21.4-x86_64.tar.gz
# docker images rhel7
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
rhel7               0                   e1f5733f050b        2 weeks ago         140.2 MB
rhel7               0-21                e1f5733f050b        2 weeks ago         140.2 MB
rhel7               latest              e1f5733f050b        2 weeks ago         140.2 MB

docker imagesコマンドでイメージの一覧に rhel7 が表示されていれば、Docker上でRHEL7のコンテナーを利用することができます。

もしくは Red Hat 社が提供する Docker リポジトリ(registry.access.redhat.com)から、docker pull コマンドで RHEL 7 の公式 Docker イメージをダウンロードします。

# docker pull registry.access.redhat.com/redhat/rhel7
e1f5733f050b: Pulling image (latest) from registry.access.redhat.com/redhat/rhel7
e1f5733f050b: Pulling image (latest) from registry.access.redhat.com/redhat/rhel7
e1f5733f050b: Download complete

登録が終わったら docker images コマンドを実行します。

# docker images
REPOSITORY                               TAG                IMAGE ID           CREATED            VIRTUAL SIZE
registry.access.redhat.com/redhat/rhel7  0                  e1f5733f050b       3 weeks ago        140.2 MB
registry.access.redhat.com/redhat/rhel7  0-21               e1f5733f050b       3 weeks ago        140.2 MB
registry.access.redhat.com/redhat/rhel7  latest             e1f5733f050b       3 weeks ago        140.2 MB

docker imagesのイメージの一覧に rhel7 のイメージが表示されていれば、Docker 上で RHEL 7 のコンテナーを利用することができます。

RHEL 7 のDockerイメージからコンテナーを生成する

では、RHEL 7 の Docker イメージを使い、Webサーバーの Apache をインストールしてみましょう。まずは、rhel7 のイメージからコンテナーを起動します。

# docker run --name=httpd_temp rhel7:latest /bin/bash -c "yum install httpd -y;"

Red Hat 社の Docker リポジトリから rhel7 コンテナーをダウンロードした場合には、「rhel7:latest」ではなく、「registry.access.redhat.com/redhat/rhel7:latest」を指定してください。

# docker run --name=httpd_temp registry.access.redhat.com/redhat/rhel7:latest /bin/bash -c "yum install httpd -y;"

httpd パッケージをインストールした変更点を Docker イメージ「rhel7_httpd_base」として保存します。

# docker commit httpd_temp rhel7_httpd_base
85645126795f48441e46eb71179b651c75ed3d44f155a6067386420e9a619256

rhel7_httpd_base のイメージから、さらにコンテナー「webcontainer01」を生成します。

# docker run -d -p 8080:80 --name=webcontainer01 rhel7_httpd_base /usr/sbin/httpd -D FOREGROUND
19e28c3998c0c80f547a6b860b05da5f2cc8856d2a6bc5b8ba2833ff73e52791

ss コマンドで Docker のホストにて 8080 をリッスンしていることを確認します。

# ss -lnt
State       Recv-Q Send-Q               Local Address:Port                 Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 :::8080 :::*
LISTEN 0 128 :::22 :::*

curl コマンドで http://localhost:8080/ にアクセスしてみましょう。Apache のテストページが表示されるはずです。

# curl http://localhost:8080/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
((snip))

使い終わったらコンテナーを停止して、削除しましょう。docker rm でコンテナーを削除しないとディスクイメージの差分が溜まってしまいリソースを無駄に消費してしまいますのでご注意ください。

# docker stop webcontainer01
# docker rm webcontainer01

Happy Docker Life with RHEL7!!

Dockerホーム > 今日からできるDocker on RHEL7