SlideShare a Scribd company logo
Dockerクイックツアー
ver1.9 中井悦司
Twitter @enakai00
オープンクラウド・キャンパス
Dockerクイックツアー
Open Cloud Campus
2
Dockerクイックツアー
自己紹介
 中井悦司(なかいえつじ)
– Twitter @enakai00
 日々の仕事
– Senior Solution Architect and
Cloud Evangelist at Red Hat K.K.
企業システムでオープンソースの活用を希望される
お客様を全力でご支援させていただきます。
 昔とった杵柄
– 素粒子論の研究(超弦理論とか)
– 予備校講師(物理担当)
– インフラエンジニア(Unix/Linux専門)
「Linux独習書の新定番」
書きました!
読者の声より ――
「今はインターネット上に情報が溢れているけど、質の高い入門書が少なく 
 なっているのは不幸なことだと思う。そんな中、この本はすごくいい」
「平易な言葉でありながら、決して足りなくはない。慎重に選ばれています。
 脳みそに染みこんで来ます」
Open Cloud Campus
3
Dockerクイックツアー
Contents
 Dockerとは?
 Dockerの導入とコンテナの起動
 アプリ導入済みイメージの利用
 アプリ導入済みイメージの作成
 参考:Dcokerが無いとき
 参考資料
(*) Dockerは開発速度が早く、使用するバージョンによって手順が異なる場合があります。
 本資料の説明はFedora20を前提としており、具体的には、下記のRPMパッケージを使用して
 検証しています。
●
kernel-3.14.6-200.fc20.x86_64
●
docker-io-1.0.0-1.fc20.x86_64
Dockerクイックツアー
Dockerとは?
Open Cloud Campus
5
Dockerクイックツアー
一般的なサーバ仮想化の分類
物理マシン
物理マシン
ホスト OS
ハイパーバイザ
(カーネルモジュール)
仮想
マシン
ゲスト
OS
VMware vSphere, Xen など
Linux KVM
ハードウェアによる仮想化
(物理マシンにハイパーバイザを内蔵)
ソフトウェアによる仮想化
(物理マシン上にハイパーバイザを導入)
ソフトウェアによる仮想化
(ホスト OS にハイパーバイザ機能を追加)
物理マシン
OS
非仮想化環境
基本的には「物理マシン」と同等の「仮想マシン」を複数
作り出す技術です。
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
ハイパーバイザ(ソフトウェア)
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
物理マシン
ハイパーバイザ(ファームウェア)
Open Cloud Campus
6
Dockerクイックツアー
 「Linuxコンテナ」は、Linux標準のコンテナ型仮想化技術です。Linuxカーネルの機能によ
り、ユーザプロセスの実行環境(ユーザ空間)を独立した「コンテナ」に閉じ込めます。
 コンテナごとに独立したリソースを割り当てることで、アプリケーションの実行環境を分離
します。「カーネル共有型」の軽量な仮想化機能と言えます。
– コンテナごとに異なるファイルシステムを割り当て
– コンテナごとに異なるネットワーク設定(仮想NIC)を割り当て
– コンテナごとにCPU、メモリーの割り当て量を制限
 クラウド上のLinux仮想マシンの上で、コンテナを利用することも可能です。
カーネル空間
ユーザプロセス
・・・
物理マシン
物理マシン
OS
コンテナ型仮想化
非仮想化環境
ユーザプロセス
ユーザプロセス
ユーザ空間
カーネル空間
ユーザプロセス
ユーザプロセス
ユーザ空間
ユーザプロセス
ユーザプロセス
ユーザ空間
・・・
コンテナ
コンテナ型の仮想化とは?
Open Cloud Campus
7
Dockerクイックツアー
Dockerとは
 Docker, Inc. が開発するオープンソースのLinuxコンテナ管理ツールです。
 Red Hatが協力して、RHEL対応とさらなる機能拡張を行っています。
– RHELのThin Provisioning機能対応(ディスク性能の向上)
– RHEL7のプロセス管理機能(systemd)との統合
– Docker専用ディストリビューション「Red Hat Enterprise Linux Atomic Host」の開発
http://www.docker.com/
Open Cloud Campus
8
Dockerクイックツアー
Dockerの特徴
 独自の「イメージ管理機能」により、コンテナに割り当てるファイルシステムの内容をイ
メージ化して管理することができます。
• 既存のイメージを編集して、新たなイメージとして登録可能。
• 作成したイメージを「レジストリ」に登録して共有可能
– 「AppStore」からアプリケーションをダウンロードする感覚で、「レジストリ」からア
プリケーション導入済みイメージをダウンロードして、すぐにコンテナで実行すること
ができます。
• Webサーバ(nginx)が入ったコンテナイメージをダウンロードして起動する例:
– アプリケーションの新たな配信/実行基盤としての活用が期待されています。
# docker search nginx
# docker pull dockerfile/nginx
# docker run -d dockerfile/nginx
公開レジストリ内のイメージを検索
イメージをダウンロード
イメージからコンテナを起動
アプリケーションの詰まった
コンテナイメージを持ち運んで
好きなところで実行可能に!
Dockerクイックツアー
Dockerの導入とコンテナの起動
Open Cloud Campus
10
Dockerクイックツアー
Fedora20とDockerのインストール
 Fedora20を「最小構成」+「標準アドオン」でインストールします。
• http://download.fedoraproject.org/pub/fedora/linux/releases/20/Fedora/x86_64/iso
– 涙を飲んでSELinuxをDisabledにします。
 Dockerをインストールして、dockerサービスを起動します。
# systemctl stop firewalld.service
# systemctl mask firewalld.service
# yum -y install docker-io
# systemctl enable docker.service
# systemctl start docker.service
# systemctl status docker.service
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
Active: activating (start) since 金 2014-06-13 21:22:08 JST; 2s ago
Docs: http://docs.docker.io
Main PID: 928 (docker)
CGroup: /system.slice/docker.service
├─928 /usr/bin/docker -d --selinux-enabled -H fd://
└─962 mkfs.ext4 -E nodiscard,lazy_itable_init=0,lazy_journal_init=...
6月 13 21:22:08 fedora20 systemd[1]: Starting Docker Application Containe.....
6月 13 21:22:08 fedora20 docker[928]: 2014/06/13 21:22:08 docker daemon: 1...:
...
この後の説明の都合で実行しています。
マスタイメージのフォーマット中
フォーマットが終わるまでしばし待ちます
# yum -y update
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
# reboot
Open Cloud Campus
11
Dockerクイックツアー
CentOSイメージをダウンロード
 構成情報を確認します。
 CentOS6のイメージを公式レジストリからダウンロードします。
# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
Pool Name: docker-252:3-130516-pool
Data file: /var/lib/docker/devicemapper/devicemapper/data
Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 291.5 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.14.6-200.fc20.x86_64
# docker search centos
NAME DESCRIPTION STARS..
centos The official build of CentOS. 146
tianon/centos CentOS 5 and 6, created using rinse instea... 22
blalor/centos Bare-bones base CentOS 6.5 image 4
...
# docker pull centos
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos centos6 0c752394b855 3 days ago 124.1 MB
centos latest 0c752394b855 3 days ago 124.1 MB
centos 6.4 539c0211cd76 14 months ago 300.6 MB
イメージ管理には、Device Mapper
ドライバ(Thin-Provisioning)を使用
イメージの保存領域は(最大)100GB
Open Cloud Campus
12
Dockerクイックツアー
レジストリ/リポジトリ/スナップショットの関係について
 Dockerではイメージのスナップショットを何度も取得するので、1つの元イメージから作成
されたスナップショットの集合体をまとめて「リポジトリ(Repository)」と呼びます。
– 先ほどダウンロードした「centos」は、正確には複数のスナップショットを含む1つの「リポジト
リ」になります。
– それぞれのスナップショットには、個別の「タグ(Tag)」が振られます。
 Dockerの利用者は、ローカルサーバで作成した「リポジトリ」を「レジストリ
(Registry)」にアップロードして公開することができます。
– デフォルトで使用されるリポジトリは、「https://index.docker.io」にあります。
– 同じユーザが複数のリポジトリを公開する際は「<ユーザ名>/hoge」のようにリポジトリ名の先頭
にユーザ名を付けます。これは、レジストリの登録ユーザ名に対応します。
リポジトリ
enakai/fedora20
スナップショットの束が
1つのリポジトリ
リポジトリ名は、先頭に
「<ユーザ名>/」を付ける
Dokcer公式(パブリック)レジストリ
https://index.docker.io
oreore/hoge
oreore/hoga
oreore/fuga
Open Cloud Campus
13
Dockerクイックツアー
CentOSイメージからコンテナを起動
 「リポジトリ名:タグ名」でイメージを指定してコンテナを起動します。
– コンテナ内で実行するコマンドとして、ここでは「/bin/bash」を指定します。
– 「-it」オプションで、インタラクティブにbashが操作できます。
– exitでbashを終了するとコンテナ内部のプロセスが無くなって、コンテナが終了します。ただし、
コンテナの定義情報とディスクイメージは、そのまま保存されています。
# docker run -it centos:latest /bin/bash
bash-4.1# cat /etc/redhat-release
CentOS release 6.5 (Final)
bash-4.1# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:59 ? 00:00:00 /bin/bash
root 6 1 0 07:59 ? 00:00:00 ps -ef
bash-4.1# ifconfig eth0
eth0 Link encap:Ethernet HWaddr D2:E4:56:E5:D5:59
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
...
bash-4.1# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.42.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
bash-4.1# yum -y install traceroute
bash-4.1# traceroute -m 100 216.81.59.173
...
謎のIPアドレスが振られていますが、
ホストからIPマスカレードで、
外部に出ることができます。
タグを省略した場合は
「latest」が選択されます。
Open Cloud Campus
14
Dockerクイックツアー
コンテナのディスクイメージを保存
 終了したコンテナのディスクイメージを新規のリポジトリに保存します。
 保存したイメージから、新たなコンテナを起動することができます。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
fb21d0c069bf centos:centos6 /bin/bash 3 minutes ago Exited (0) 1 seconds ago
boring_bardeen
# docker commit ca1f25132c15 enakai/centos6:traceroute
a0725f4d429fb5c00e47fd9453eea654fc99fe71864d5946a01954ca630cb2e5
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
enakai/centos6 traceroute 44f1d7517217 6 seconds ago 171.6 MB
centos centos6 0c752394b855 3 days ago 124.1 MB
centos latest 0c752394b855 3 days ago 124.1 MB
centos 6.4 539c0211cd76 14 months ago 300.6 MB
# docker run -it enakai/centos6:traceroute /bin/bash
bash-4.1# traceroute --version
Modern traceroute for Linux, version 2.0.14, Nov 11 2010
Copyright (c) 2008 Dmitry Butskoy, License: GPL v2 or any later
bash-4.1# exit
Open Cloud Campus
15
Dockerクイックツアー
コンテナのディスクイメージを保存
 終了したコンテナで不要なものは、次のコマンドで削除しておきます。
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
16dd08fefadb enakai/centos6:traceroute /bin/bash 2 minutes ago Exited (0) 2
seconds ago distracted_fermi
fb21d0c069bf centos:centos6 /bin/bash 7 minutes ago Exited (0) 4
minutes ago boring_bardeen
# docker rm 16dd08fefadb
docker r16dd08fefadb
# docker rm fb21d0c069bf
fb21d0c069bf
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
Dockerクイックツアー
アプリ導入済みイメージの利用
Open Cloud Campus
17
Dockerクイックツアー
アプリケーション導入済みイメージのダウンロード
 nginxをインストール済みのイメージを公式レジストリからダウンロードします。
# docker search nginx
NAME DESCRIPTION STARS...
nginx Official build of Nginx. 46
dockerfile/nginx Trusted Nginx (http://nginx.org/) Build ... 30�
fedora/nginx 18
...
# docker pull dockerfile/nginx
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
enakai/centos6 traceroute 44f1d7517217 7 minutes ago 171.6 MB
centos centos6 0c752394b855 3 days ago 124.1 MB
centos latest 0c752394b855 3 days ago 124.1 MB
dockerfile/nginx latest 2a106d243809 3 weeks ago 604.7 MB
centos 6.4 539c0211cd76 14 months ago 300.6 MB
Open Cloud Campus
18
Dockerクイックツアー
イメージの設定確認
 このイメージは自動でnginxが起動するように仕込まれています。
# image_id=2a106d243809; cat /var/lib/docker/graph/$image_id*/json | python -mjson.tool
{
"Size": 0,
"architecture": "amd64",
...
"Cmd": [
"nginx"
],
"Env": [
"HOME=/root",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"ExposedPorts": {
"443/tcp": {},
"80/tcp": {}
},
...
"Volumes": {
"/data": {},
"/etc/nginx/sites-enabled": {},
"/var/log/nginx": {}
},
...
イメージの詳細設定を確認する
裏ワザ(?)のコマンド
コンテナ起動時に実行するコマンド
ホストからポート転送可能にするポート
ホストのディレクトリをコンテナから共有可能
にする「コンテナ側」のマウントポイント
Open Cloud Campus
19
Dockerクイックツアー
アプリケーション導入済みのイメージからのコンテナ起動
 このイメージからコンテナを起動します。
– 「-d」でバックグランド実行
– 「-v 」はホストの「/tmp/log」をコンテナ内の「/var/log/nginx」にマウント
– 「-p 8000:80」はホストの8000番ポートをコンテナ内の80番ポートに転送
# mkdir /tmp/log
# docker run -d -p 8000:80 -v /tmp/log:/var/log/nginx dockerfile/nginx:latest
b4d1efd972391d0d67ace6b839751a5a25bd5d25bae448a21d95c22ef1923757
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
b4d1efd97239 dockerfile/nginx:latest nginx 8 seconds ago Up 6 seconds
443/tcp, 0.0.0.0:8000->80/tcp furious_heisenberg
# iptables-save
# Generated by iptables-save v1.4.19.1 on Fri Jun 13 22:02:34 2014
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8000 -j DNAT --to-destination 172.17.0.5:80
COMMIT
...
Open Cloud Campus
20
Dockerクイックツアー
コンテナの動作確認
 コンテナ内のWebサーバにアクセスします。
 コンテナ内にマウントされたディレクトリからログが確認できます。
# curl http://localhost:8000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
...
# cat /tmp/log/access.log
172.17.42.1 - - [13/Jun/2014:13:03:45 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.32.0"
Open Cloud Campus
21
Dockerクイックツアー
コンテナの動作確認
 コンテナ内のプロセスをホスト側から確認する際は、次のコマンドが使用できます。
– Dockerはsystemdと連携して、コンテナごとにcgroupsのグループを作成します。
# docker top b4d1efd97239
UID PID PPID C STIME TTY TIME CMD
root 1724 928 0 22:01 ? 00:00:00 nginx: master process nginx
33 1734 1724 0 22:01 ? 00:00:00 nginx: worker process
33 1735 1724 0 22:01 ? 00:00:00 nginx: worker process
33 1736 1724 0 22:01 ? 00:00:00 nginx: worker process
33 1737 1724 0 22:01 ? 00:00:00 nginx: worker process
# systemd-cgls
...
└─system.slice
├─docker-b4d1efd972391d0d67ace6b839751a5a25bd5d25bae448a21d95c22ef1923757.scope
│ ├─1724 nginx: master process ngin
│ ├─1734 nginx: worker proces
│ ├─1735 nginx: worker proces
│ ├─1736 nginx: worker proces
│ └─1737 nginx: worker proces
...
「docker-<コンテナID>.scope」が
cgroupsのグループ名
Dockerクイックツアー
アプリ導入済みイメージの作成
Open Cloud Campus
23
Dockerクイックツアー
アプリケーション導入済みイメージを自分で作成
 最初のCentOS6のイメージでやったように、手動でコンテナ内にアプリケーションをイン
ストールしてイメージを保存することもできます。
 ただし、一般には、「Dockerfile」を利用する方が便利です。
– インストール作業が自動化されるので、イメージの修正・再作成の手間がかかりません。
– コンテナ起動時に実行するコマンド、外部に公開するポート番号、ホストのディレクトリをコンテ
ナ内にマウント可能にする、などの追加設定も行えます。
Open Cloud Campus
24
Dockerクイックツアー
Dockerfileの使い方
 1つのディレクトリに「Dockerfile」と関連ファイルをまとめて入れておきます。
# ls enakai_httpd
Dockerfile authorized_keys init.sh src
FROM centos
MAINTAINER enakai
RUN yum -y install openssh-server sudo httpd
RUN useradd enakai
RUN mkdir /home/enakai/.ssh
ADD authorized_keys /home/enakai/.ssh/authorized_keys
RUN chown -R enakai.enakai /home/enakai/.ssh
RUN chmod 600 /home/enakai/.ssh/authorized_keys
RUN echo "enakai ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/enakai
ADD src /var/www/html
RUN chmod -R 644 /var/www/html/*
EXPOSE 22 80
ADD init.sh /usr/local/bin/init.sh
RUN chmod u+x /usr/local/bin/init.sh
CMD ["/usr/local/bin/init.sh"]
Dockerfile
#!/bin/sh
service sshd start
service httpd start
while [[ true ]]; do
/bin/bash
done
init.sh
sshdとhttpdを起動するコンテナの例
– Dockerfileには次のような指示を記述します。
• FROM : 出発点のイメージ
• RUN : コマンド実行
• ADD : ファイル(ディレクトリ)をコピー
• EXPOSE : 外部からアクセス可能なポート番号
• CMD/ENTRYPOINT : コンテナ起動時の実行コマンド
– 詳細は下記のドキュメントを参照
• http://docs.docker.io/reference/builder/
コンテナにSSHログインする際の認証用公開鍵
HTTPDで公開するコンテンツディレクトリ
Open Cloud Campus
25
Dockerクイックツアー
Dockerfileのビルドとコンテナの起動
 先のファイルを入れたディレクトリを指定して、ビルドを実施します。
 ビルドしたイメージからコンテナを起動してみます。
– 「docker attach」でbashに接続するには、「--itd」オプションが必要です。
– 「--name」オプションで名前をつけると、コンテンIDの代わりに名前で各種操作ができます。
# docker build -t enakai/httpd:ver1.0 enakai_httpd
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
enakai/httpd ver1.0 1b25b8646223 40 seconds ago 379.7 MB
...
# docker run -itd -p 8000:80 -p 2222:22 --name web01 enakai/httpd:ver1.0
1014c487be4eac6f3e895192262bd8cc6eb875916a6472e7895a0d8821eac2fe
# systemd-cgls
...
└─system.slice
├─docker-1014c487be4eac6f3e895192262bd8cc6eb875916a6472e7895a0d8821eac2fe.scop
│ ├─6127 /bin/sh /usr/local/bin/init.sh
│ ├─6165 /usr/sbin/sshd
│ ├─6177 /usr/sbin/httpd
│ ├─6179 /usr/sbin/httpd
│ ├─6180 /usr/sbin/httpd
│ ├─6181 /bin/bash
│ ├─6182 /usr/sbin/httpd
│ ├─6183 /usr/sbin/httpd
...
# curl http://localhost:8000
Hello, World!
Open Cloud Campus
26
Dockerクイックツアー
Dockerfileのビルドとコンテナの起動
– SSHでログインして、sudoでrootになる様子です。
# ssh enakai@localhost -p 2222
The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established.
RSA key fingerprint is 78:d1:17:dd:5d:d1:e0:76:46:94:e6:14:c8:0f:f0:0f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:2222' (RSA) to the list of known hosts.
[enakai@1014c487be4e ~]$ sudo -i
[root@1014c487be4e ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:24 ? 00:00:00 /bin/sh /usr/local/bin/init.sh
root 35 1 0 14:24 ? 00:00:00 /usr/sbin/sshd
root 47 1 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 49 47 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 50 47 0 14:24 ? 00:00:00 /usr/sbin/httpd
root 51 1 0 14:24 ? 00:00:00 /bin/bash
apache 52 47 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 53 47 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 54 47 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 55 47 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 56 47 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 57 47 0 14:24 ? 00:00:00 /usr/sbin/httpd
root 60 35 0 14:24 ? 00:00:00 sshd: enakai [priv]
enakai 62 60 0 14:25 ? 00:00:00 sshd: enakai@pts/0
enakai 63 62 0 14:25 pts/0 00:00:00 -bash
root 78 63 0 14:25 pts/0 00:00:00 sudo -i
root 79 78 0 14:25 pts/0 00:00:00 -bash
root 90 79 0 14:25 pts/0 00:00:00 ps -ef
Open Cloud Campus
27
Dockerクイックツアー
Dockerfileのビルドとコンテナの起動
 コンテナを停止した後、再度、起動する例です。
– 「docker run」は、最初にコンテナを起動した際と同じオプションで、再度、コンテナを作成しま
す。ディスクイメージは停止時に保存してあるものを再利用します。
– 不要になったコンテナは停止した後に、「docker rm」で削除しておきます。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
1014c487be4e enakai/httpd:ver1.0 /usr/local/bin/init. About a minute ago Up About a
minute 0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp web01
# docker stop web01
web01
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
1014c487be4e enakai/httpd:ver1.0 /usr/local/bin/init. About a minute ago Exited (-1) 2
seconds ago web01
# docker start web01
web01
[root@fedora20 ~]# !curl
curl http://localhost:8000
Hello, World!
# docker stop web01
web01
# docker rm web01
web01
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
Dockerクイックツアー
参考:Dockerが無いとき
( ´ー`)551が~ あるとき~(´ー` )
( ´ - `)ないとき~(´ - ` )
( ´ー`)あるとき~(´ー` )
( ´ - `)ないとき~(´ - ` )
( ´ー`)あるとき~(´ー` )
( ´ - `)ないとき~(´ - ` )
Open Cloud Campus
29
Dockerクイックツアー
libvirtによるコンテナ作成
 RHEL6.5の環境で、libvirtを使用してコンテナを作成する手順を紹介します。
– 図のようにKVM仮想マシンと同様にvirshコマンドでコンテナを作成・管理できます。ここで
は、busyboxによる簡易httpdサーバをコンテナ内で起動します。
– はじめに、通常の手順でKVMホスト環境を用意します。
仮想マシン#1
vnet1
eth0
仮想マシン#2
eth0
IPマスカレード
ホスト
Linuxvnet0
eth0
外部ネットワーク
veth0
eth0
コンテナ#1
virbr0 (default)
busybox
192.168.122.190
192.168.122.1
# yum groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform"
# chkconfig libvirtd on
# reboot
Open Cloud Campus
30
Dockerクイックツアー
仮想ルートファイルシステムの用意
 アプリケーションコンテナの仮想ルートファイルシステムを用意します。
– busyboxの動作に必要な最小限の環境を「/export/lxcguest01」以下に用意します。
– コンテナ起動時に最初に実行するスクリプト「/export/lxcguest01/bin/init」を作成します。
• これは、IPアドレスの設定と簡易Webサーバの起動を行います。最後の「sh」は、仮想コンソールで使用する
シェルになります。
– 「/export/lxcguset01/bin/init」に実行権を設定します。
– 簡易Webサーバで公開するコンテンツ「/export/lxcguest01/html/index.html」を用意します。
# mkdir -p /export/lxcguest01/bin
# mkdir -p /export/lxcguest01/html
# cd /export/lxcguest01/bin
# cp /sbin/busybox ./
# for i in echo grep ifconfig kill ps route test which cat false head ls pwd sh true date
find httpd ip ping rm sleep wget; do ln -s busybox $i; done
#!/bin/sh
ifconfig eth0 192.168.122.190
route add default gw 192.168.122.1 eth0
httpd -h /html
while [[ true ]]; do
sh
done
/export/lxcguest01/bin/init
# chmod u+x /export/lxcguest01/bin/init
<h1>Welcome to Linux Container</h1>
/export/lxcguest01/html/index.html
Open Cloud Campus
31
Dockerクイックツアー
コンテナの定義
 コンテナ「lxcguest01」を定義して、起動します。
– コンテナ定義のXMLファイル「/root/work/lxcguest01.xml」を作成します。
– コンテナを定義します。
<domain type='lxc'>
<name>lxcguest01</name>
<memory>200000</memory>
<os>
<type>exe</type>
<init>/bin/init</init>
</os>
<devices>
<interface type='network'>
<source network='default'/>
</interface>
<console type='pty'/>
<filesystem type='mount'>
<source dir='/export/lxcguest01'/>
<target dir='/'/>
</filesystem>
</devices>
</domain>
/root/work/lxcguest01.xml
# cd /root/work
# virsh -c lxc:/// define lxcguest01.xml
ドメイン lxcguest01 が lxcguest01.xml から定義されました
# virsh -c lxc:/// list --all
Id 名前 状態
----------------------------------
- lxcguest01 シャットオフ
Open Cloud Campus
32
Dockerクイックツアー
コンテナの起動
– コンテナを起動します。
– コンテナの仮想コンソールに接続して、コンテナ内部の状態を確認します。
• 最初に起動した「/export/lxcguest01/bin/init」がPID 1のプロセスとなり、その子プロセスが見えます。
ファイルシステムは「/export/lxcguset01」がルートファイルシステムとして見えます。
# virsh -c lxc:/// start lxcguest01
ドメイン lxcguest01 が起動されました
# virsh -c lxc:/// list --all
Id 名前 状態
----------------------------------
12123 lxcguest01 実行中
# virsh -c lxc:/// console lxcguest01
Connected to domain lxcguest01
エスケープ文字は ^] です
# ps -ef
PID USER TIME COMMAND
1 0 0:00 /bin/sh /bin/init
6 0 0:00 httpd -h /html
7 0 0:00 sh
8 0 0:00 ps -ef
# ls -l
drwxr-xr-x 2 0 0 4096 May 15 23:01 bin
drwxr-xr-x 10 0 0 200 May 15 23:05 cgroup
drwxr-xr-x 3 0 0 300 May 15 23:05 dev
drwxr-xr-x 2 0 0 4096 May 15 23:02 html
dr-xr-xr-x 324 0 0 0 May 15 23:05 proc
drwxr-xr-x 13 0 0 0 Mar 13 03:14 sys
Open Cloud Campus
33
Dockerクイックツアー
コンテナの起動
– コンテナ内部の状態確認の続きです。
• コンテナ内部には仮想NIC「eth0」がアサインされています。これは、ホストLinux上の「veth0」と接続され
ています。仮想コンソールへの接続は、「Ctrl+]」で終了します。
– ホストLinuxからWebサーバにアクセスできることも分かります。
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 52:54:00:44:E0:52
inet addr:192.168.122.190 Bcast:192.168.122.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe44:e052/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.122.1 0.0.0.0 UG 0 0 0 eth0
# ← Ctrl+]を押す
# curl http://192.168.122.190
<h1>Welcome to Linux Container</h1>
Open Cloud Campus
34
Dockerクイックツアー
ホストLinuxからの確認とコンテナの停止
 ホストLinux上でコンテナの状態を確認します。
– ホストLinux上でコンテナを実行するプロセスを確認します。
• libvirt_lxcから起動される子プロセスがコンテナ内部から見えるプロセスになります。
– 仮想ブリッジの状態を確認します。
# pstree
・・・
├─libvirt_lxc───init─┬─httpd
│ └─sh
・・・
# brctl show virbr0
bridge name bridge id STP enabled interfaces
virbr0 8000.52540031ddff no veth0
virbr0-nic
eth0
IPマスカレード
ホスト
Linux
外部ネットワーク
veth0
eth0
コンテナ#1
virbr0
busybox
192.168.122.190
192.168.122.1# virsh -c lxc:/// dumpxml lxcguest01 | grep veth
<target dev='veth0'/>
• この例では、「virbr0」に接続された「veth0」がコンテナ内部の仮想
NIC「eth0」に接続されています。
• 実際にコンテナに割り当てられた仮想イーサネットデバイスは、次のコマンド
で確認します。
– コンテナ「lxcguest01」を停止します。
# virsh -c lxc:/// destroy lxcguest01
ドメイン lxcguest01 は強制停止されました
Dockerクイックツアー
参考資料
Open Cloud Campus
36
Dockerクイックツアー
参考資料
 Dockerfile tutorial
– https://www.docker.io/learn/dockerfile/
Open Cloud Campus
37
Dockerクイックツアー
QA
Dockerクイックツアー
中井悦司
Twitter @enakai00
オープンクラウド・キャンパス
RHEL7 & Fedoraで最新技術を
学びましょう!

More Related Content

Dockerクイックツアー

  • 2. Open Cloud Campus 2 Dockerクイックツアー 自己紹介  中井悦司(なかいえつじ) – Twitter @enakai00  日々の仕事 – Senior Solution Architect and Cloud Evangelist at Red Hat K.K. 企業システムでオープンソースの活用を希望される お客様を全力でご支援させていただきます。  昔とった杵柄 – 素粒子論の研究(超弦理論とか) – 予備校講師(物理担当) – インフラエンジニア(Unix/Linux専門) 「Linux独習書の新定番」 書きました! 読者の声より ―― 「今はインターネット上に情報が溢れているけど、質の高い入門書が少なく   なっているのは不幸なことだと思う。そんな中、この本はすごくいい」 「平易な言葉でありながら、決して足りなくはない。慎重に選ばれています。  脳みそに染みこんで来ます」
  • 3. Open Cloud Campus 3 Dockerクイックツアー Contents  Dockerとは?  Dockerの導入とコンテナの起動  アプリ導入済みイメージの利用  アプリ導入済みイメージの作成  参考:Dcokerが無いとき  参考資料 (*) Dockerは開発速度が早く、使用するバージョンによって手順が異なる場合があります。  本資料の説明はFedora20を前提としており、具体的には、下記のRPMパッケージを使用して  検証しています。 ● kernel-3.14.6-200.fc20.x86_64 ● docker-io-1.0.0-1.fc20.x86_64
  • 5. Open Cloud Campus 5 Dockerクイックツアー 一般的なサーバ仮想化の分類 物理マシン 物理マシン ホスト OS ハイパーバイザ (カーネルモジュール) 仮想 マシン ゲスト OS VMware vSphere, Xen など Linux KVM ハードウェアによる仮想化 (物理マシンにハイパーバイザを内蔵) ソフトウェアによる仮想化 (物理マシン上にハイパーバイザを導入) ソフトウェアによる仮想化 (ホスト OS にハイパーバイザ機能を追加) 物理マシン OS 非仮想化環境 基本的には「物理マシン」と同等の「仮想マシン」を複数 作り出す技術です。 仮想 マシン ゲスト OS 仮想 マシン ゲスト OS 仮想 マシン ゲスト OS 仮想 マシン ゲスト OS 仮想 マシン ゲスト OS 仮想 マシン ゲスト OS 仮想 マシン ゲスト OS ハイパーバイザ(ソフトウェア) 仮想 マシン ゲスト OS 仮想 マシン ゲスト OS 仮想 マシン ゲスト OS 物理マシン ハイパーバイザ(ファームウェア)
  • 6. Open Cloud Campus 6 Dockerクイックツアー  「Linuxコンテナ」は、Linux標準のコンテナ型仮想化技術です。Linuxカーネルの機能によ り、ユーザプロセスの実行環境(ユーザ空間)を独立した「コンテナ」に閉じ込めます。  コンテナごとに独立したリソースを割り当てることで、アプリケーションの実行環境を分離 します。「カーネル共有型」の軽量な仮想化機能と言えます。 – コンテナごとに異なるファイルシステムを割り当て – コンテナごとに異なるネットワーク設定(仮想NIC)を割り当て – コンテナごとにCPU、メモリーの割り当て量を制限  クラウド上のLinux仮想マシンの上で、コンテナを利用することも可能です。 カーネル空間 ユーザプロセス ・・・ 物理マシン 物理マシン OS コンテナ型仮想化 非仮想化環境 ユーザプロセス ユーザプロセス ユーザ空間 カーネル空間 ユーザプロセス ユーザプロセス ユーザ空間 ユーザプロセス ユーザプロセス ユーザ空間 ・・・ コンテナ コンテナ型の仮想化とは?
  • 7. Open Cloud Campus 7 Dockerクイックツアー Dockerとは  Docker, Inc. が開発するオープンソースのLinuxコンテナ管理ツールです。  Red Hatが協力して、RHEL対応とさらなる機能拡張を行っています。 – RHELのThin Provisioning機能対応(ディスク性能の向上) – RHEL7のプロセス管理機能(systemd)との統合 – Docker専用ディストリビューション「Red Hat Enterprise Linux Atomic Host」の開発 http://www.docker.com/
  • 8. Open Cloud Campus 8 Dockerクイックツアー Dockerの特徴  独自の「イメージ管理機能」により、コンテナに割り当てるファイルシステムの内容をイ メージ化して管理することができます。 • 既存のイメージを編集して、新たなイメージとして登録可能。 • 作成したイメージを「レジストリ」に登録して共有可能 – 「AppStore」からアプリケーションをダウンロードする感覚で、「レジストリ」からア プリケーション導入済みイメージをダウンロードして、すぐにコンテナで実行すること ができます。 • Webサーバ(nginx)が入ったコンテナイメージをダウンロードして起動する例: – アプリケーションの新たな配信/実行基盤としての活用が期待されています。 # docker search nginx # docker pull dockerfile/nginx # docker run -d dockerfile/nginx 公開レジストリ内のイメージを検索 イメージをダウンロード イメージからコンテナを起動 アプリケーションの詰まった コンテナイメージを持ち運んで 好きなところで実行可能に!
  • 10. Open Cloud Campus 10 Dockerクイックツアー Fedora20とDockerのインストール  Fedora20を「最小構成」+「標準アドオン」でインストールします。 • http://download.fedoraproject.org/pub/fedora/linux/releases/20/Fedora/x86_64/iso – 涙を飲んでSELinuxをDisabledにします。  Dockerをインストールして、dockerサービスを起動します。 # systemctl stop firewalld.service # systemctl mask firewalld.service # yum -y install docker-io # systemctl enable docker.service # systemctl start docker.service # systemctl status docker.service docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled) Active: activating (start) since 金 2014-06-13 21:22:08 JST; 2s ago Docs: http://docs.docker.io Main PID: 928 (docker) CGroup: /system.slice/docker.service ├─928 /usr/bin/docker -d --selinux-enabled -H fd:// └─962 mkfs.ext4 -E nodiscard,lazy_itable_init=0,lazy_journal_init=... 6月 13 21:22:08 fedora20 systemd[1]: Starting Docker Application Containe..... 6月 13 21:22:08 fedora20 docker[928]: 2014/06/13 21:22:08 docker daemon: 1...: ... この後の説明の都合で実行しています。 マスタイメージのフォーマット中 フォーマットが終わるまでしばし待ちます # yum -y update # sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config # reboot
  • 11. Open Cloud Campus 11 Dockerクイックツアー CentOSイメージをダウンロード  構成情報を確認します。  CentOS6のイメージを公式レジストリからダウンロードします。 # docker info Containers: 0 Images: 0 Storage Driver: devicemapper Pool Name: docker-252:3-130516-pool Data file: /var/lib/docker/devicemapper/devicemapper/data Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 291.5 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.14.6-200.fc20.x86_64 # docker search centos NAME DESCRIPTION STARS.. centos The official build of CentOS. 146 tianon/centos CentOS 5 and 6, created using rinse instea... 22 blalor/centos Bare-bones base CentOS 6.5 image 4 ... # docker pull centos # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos centos6 0c752394b855 3 days ago 124.1 MB centos latest 0c752394b855 3 days ago 124.1 MB centos 6.4 539c0211cd76 14 months ago 300.6 MB イメージ管理には、Device Mapper ドライバ(Thin-Provisioning)を使用 イメージの保存領域は(最大)100GB
  • 12. Open Cloud Campus 12 Dockerクイックツアー レジストリ/リポジトリ/スナップショットの関係について  Dockerではイメージのスナップショットを何度も取得するので、1つの元イメージから作成 されたスナップショットの集合体をまとめて「リポジトリ(Repository)」と呼びます。 – 先ほどダウンロードした「centos」は、正確には複数のスナップショットを含む1つの「リポジト リ」になります。 – それぞれのスナップショットには、個別の「タグ(Tag)」が振られます。  Dockerの利用者は、ローカルサーバで作成した「リポジトリ」を「レジストリ (Registry)」にアップロードして公開することができます。 – デフォルトで使用されるリポジトリは、「https://index.docker.io」にあります。 – 同じユーザが複数のリポジトリを公開する際は「<ユーザ名>/hoge」のようにリポジトリ名の先頭 にユーザ名を付けます。これは、レジストリの登録ユーザ名に対応します。 リポジトリ enakai/fedora20 スナップショットの束が 1つのリポジトリ リポジトリ名は、先頭に 「<ユーザ名>/」を付ける Dokcer公式(パブリック)レジストリ https://index.docker.io oreore/hoge oreore/hoga oreore/fuga
  • 13. Open Cloud Campus 13 Dockerクイックツアー CentOSイメージからコンテナを起動  「リポジトリ名:タグ名」でイメージを指定してコンテナを起動します。 – コンテナ内で実行するコマンドとして、ここでは「/bin/bash」を指定します。 – 「-it」オプションで、インタラクティブにbashが操作できます。 – exitでbashを終了するとコンテナ内部のプロセスが無くなって、コンテナが終了します。ただし、 コンテナの定義情報とディスクイメージは、そのまま保存されています。 # docker run -it centos:latest /bin/bash bash-4.1# cat /etc/redhat-release CentOS release 6.5 (Final) bash-4.1# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 07:59 ? 00:00:00 /bin/bash root 6 1 0 07:59 ? 00:00:00 ps -ef bash-4.1# ifconfig eth0 eth0 Link encap:Ethernet HWaddr D2:E4:56:E5:D5:59 inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 ... bash-4.1# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.42.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 bash-4.1# yum -y install traceroute bash-4.1# traceroute -m 100 216.81.59.173 ... 謎のIPアドレスが振られていますが、 ホストからIPマスカレードで、 外部に出ることができます。 タグを省略した場合は 「latest」が選択されます。
  • 14. Open Cloud Campus 14 Dockerクイックツアー コンテナのディスクイメージを保存  終了したコンテナのディスクイメージを新規のリポジトリに保存します。  保存したイメージから、新たなコンテナを起動することができます。 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fb21d0c069bf centos:centos6 /bin/bash 3 minutes ago Exited (0) 1 seconds ago boring_bardeen # docker commit ca1f25132c15 enakai/centos6:traceroute a0725f4d429fb5c00e47fd9453eea654fc99fe71864d5946a01954ca630cb2e5 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE enakai/centos6 traceroute 44f1d7517217 6 seconds ago 171.6 MB centos centos6 0c752394b855 3 days ago 124.1 MB centos latest 0c752394b855 3 days ago 124.1 MB centos 6.4 539c0211cd76 14 months ago 300.6 MB # docker run -it enakai/centos6:traceroute /bin/bash bash-4.1# traceroute --version Modern traceroute for Linux, version 2.0.14, Nov 11 2010 Copyright (c) 2008 Dmitry Butskoy, License: GPL v2 or any later bash-4.1# exit
  • 15. Open Cloud Campus 15 Dockerクイックツアー コンテナのディスクイメージを保存  終了したコンテナで不要なものは、次のコマンドで削除しておきます。 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 16dd08fefadb enakai/centos6:traceroute /bin/bash 2 minutes ago Exited (0) 2 seconds ago distracted_fermi fb21d0c069bf centos:centos6 /bin/bash 7 minutes ago Exited (0) 4 minutes ago boring_bardeen # docker rm 16dd08fefadb docker r16dd08fefadb # docker rm fb21d0c069bf fb21d0c069bf # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 17. Open Cloud Campus 17 Dockerクイックツアー アプリケーション導入済みイメージのダウンロード  nginxをインストール済みのイメージを公式レジストリからダウンロードします。 # docker search nginx NAME DESCRIPTION STARS... nginx Official build of Nginx. 46 dockerfile/nginx Trusted Nginx (http://nginx.org/) Build ... 30� fedora/nginx 18 ... # docker pull dockerfile/nginx # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE enakai/centos6 traceroute 44f1d7517217 7 minutes ago 171.6 MB centos centos6 0c752394b855 3 days ago 124.1 MB centos latest 0c752394b855 3 days ago 124.1 MB dockerfile/nginx latest 2a106d243809 3 weeks ago 604.7 MB centos 6.4 539c0211cd76 14 months ago 300.6 MB
  • 18. Open Cloud Campus 18 Dockerクイックツアー イメージの設定確認  このイメージは自動でnginxが起動するように仕込まれています。 # image_id=2a106d243809; cat /var/lib/docker/graph/$image_id*/json | python -mjson.tool { "Size": 0, "architecture": "amd64", ... "Cmd": [ "nginx" ], "Env": [ "HOME=/root", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "ExposedPorts": { "443/tcp": {}, "80/tcp": {} }, ... "Volumes": { "/data": {}, "/etc/nginx/sites-enabled": {}, "/var/log/nginx": {} }, ... イメージの詳細設定を確認する 裏ワザ(?)のコマンド コンテナ起動時に実行するコマンド ホストからポート転送可能にするポート ホストのディレクトリをコンテナから共有可能 にする「コンテナ側」のマウントポイント
  • 19. Open Cloud Campus 19 Dockerクイックツアー アプリケーション導入済みのイメージからのコンテナ起動  このイメージからコンテナを起動します。 – 「-d」でバックグランド実行 – 「-v 」はホストの「/tmp/log」をコンテナ内の「/var/log/nginx」にマウント – 「-p 8000:80」はホストの8000番ポートをコンテナ内の80番ポートに転送 # mkdir /tmp/log # docker run -d -p 8000:80 -v /tmp/log:/var/log/nginx dockerfile/nginx:latest b4d1efd972391d0d67ace6b839751a5a25bd5d25bae448a21d95c22ef1923757 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b4d1efd97239 dockerfile/nginx:latest nginx 8 seconds ago Up 6 seconds 443/tcp, 0.0.0.0:8000->80/tcp furious_heisenberg # iptables-save # Generated by iptables-save v1.4.19.1 on Fri Jun 13 22:02:34 2014 *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :DOCKER - [0:0] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8000 -j DNAT --to-destination 172.17.0.5:80 COMMIT ...
  • 20. Open Cloud Campus 20 Dockerクイックツアー コンテナの動作確認  コンテナ内のWebサーバにアクセスします。  コンテナ内にマウントされたディレクトリからログが確認できます。 # curl http://localhost:8000 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> ... # cat /tmp/log/access.log 172.17.42.1 - - [13/Jun/2014:13:03:45 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.32.0"
  • 21. Open Cloud Campus 21 Dockerクイックツアー コンテナの動作確認  コンテナ内のプロセスをホスト側から確認する際は、次のコマンドが使用できます。 – Dockerはsystemdと連携して、コンテナごとにcgroupsのグループを作成します。 # docker top b4d1efd97239 UID PID PPID C STIME TTY TIME CMD root 1724 928 0 22:01 ? 00:00:00 nginx: master process nginx 33 1734 1724 0 22:01 ? 00:00:00 nginx: worker process 33 1735 1724 0 22:01 ? 00:00:00 nginx: worker process 33 1736 1724 0 22:01 ? 00:00:00 nginx: worker process 33 1737 1724 0 22:01 ? 00:00:00 nginx: worker process # systemd-cgls ... └─system.slice ├─docker-b4d1efd972391d0d67ace6b839751a5a25bd5d25bae448a21d95c22ef1923757.scope │ ├─1724 nginx: master process ngin │ ├─1734 nginx: worker proces │ ├─1735 nginx: worker proces │ ├─1736 nginx: worker proces │ └─1737 nginx: worker proces ... 「docker-<コンテナID>.scope」が cgroupsのグループ名
  • 23. Open Cloud Campus 23 Dockerクイックツアー アプリケーション導入済みイメージを自分で作成  最初のCentOS6のイメージでやったように、手動でコンテナ内にアプリケーションをイン ストールしてイメージを保存することもできます。  ただし、一般には、「Dockerfile」を利用する方が便利です。 – インストール作業が自動化されるので、イメージの修正・再作成の手間がかかりません。 – コンテナ起動時に実行するコマンド、外部に公開するポート番号、ホストのディレクトリをコンテ ナ内にマウント可能にする、などの追加設定も行えます。
  • 24. Open Cloud Campus 24 Dockerクイックツアー Dockerfileの使い方  1つのディレクトリに「Dockerfile」と関連ファイルをまとめて入れておきます。 # ls enakai_httpd Dockerfile authorized_keys init.sh src FROM centos MAINTAINER enakai RUN yum -y install openssh-server sudo httpd RUN useradd enakai RUN mkdir /home/enakai/.ssh ADD authorized_keys /home/enakai/.ssh/authorized_keys RUN chown -R enakai.enakai /home/enakai/.ssh RUN chmod 600 /home/enakai/.ssh/authorized_keys RUN echo "enakai ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/enakai ADD src /var/www/html RUN chmod -R 644 /var/www/html/* EXPOSE 22 80 ADD init.sh /usr/local/bin/init.sh RUN chmod u+x /usr/local/bin/init.sh CMD ["/usr/local/bin/init.sh"] Dockerfile #!/bin/sh service sshd start service httpd start while [[ true ]]; do /bin/bash done init.sh sshdとhttpdを起動するコンテナの例 – Dockerfileには次のような指示を記述します。 • FROM : 出発点のイメージ • RUN : コマンド実行 • ADD : ファイル(ディレクトリ)をコピー • EXPOSE : 外部からアクセス可能なポート番号 • CMD/ENTRYPOINT : コンテナ起動時の実行コマンド – 詳細は下記のドキュメントを参照 • http://docs.docker.io/reference/builder/ コンテナにSSHログインする際の認証用公開鍵 HTTPDで公開するコンテンツディレクトリ
  • 25. Open Cloud Campus 25 Dockerクイックツアー Dockerfileのビルドとコンテナの起動  先のファイルを入れたディレクトリを指定して、ビルドを実施します。  ビルドしたイメージからコンテナを起動してみます。 – 「docker attach」でbashに接続するには、「--itd」オプションが必要です。 – 「--name」オプションで名前をつけると、コンテンIDの代わりに名前で各種操作ができます。 # docker build -t enakai/httpd:ver1.0 enakai_httpd # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE enakai/httpd ver1.0 1b25b8646223 40 seconds ago 379.7 MB ... # docker run -itd -p 8000:80 -p 2222:22 --name web01 enakai/httpd:ver1.0 1014c487be4eac6f3e895192262bd8cc6eb875916a6472e7895a0d8821eac2fe # systemd-cgls ... └─system.slice ├─docker-1014c487be4eac6f3e895192262bd8cc6eb875916a6472e7895a0d8821eac2fe.scop │ ├─6127 /bin/sh /usr/local/bin/init.sh │ ├─6165 /usr/sbin/sshd │ ├─6177 /usr/sbin/httpd │ ├─6179 /usr/sbin/httpd │ ├─6180 /usr/sbin/httpd │ ├─6181 /bin/bash │ ├─6182 /usr/sbin/httpd │ ├─6183 /usr/sbin/httpd ... # curl http://localhost:8000 Hello, World!
  • 26. Open Cloud Campus 26 Dockerクイックツアー Dockerfileのビルドとコンテナの起動 – SSHでログインして、sudoでrootになる様子です。 # ssh enakai@localhost -p 2222 The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established. RSA key fingerprint is 78:d1:17:dd:5d:d1:e0:76:46:94:e6:14:c8:0f:f0:0f. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[localhost]:2222' (RSA) to the list of known hosts. [enakai@1014c487be4e ~]$ sudo -i [root@1014c487be4e ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 14:24 ? 00:00:00 /bin/sh /usr/local/bin/init.sh root 35 1 0 14:24 ? 00:00:00 /usr/sbin/sshd root 47 1 0 14:24 ? 00:00:00 /usr/sbin/httpd apache 49 47 0 14:24 ? 00:00:00 /usr/sbin/httpd apache 50 47 0 14:24 ? 00:00:00 /usr/sbin/httpd root 51 1 0 14:24 ? 00:00:00 /bin/bash apache 52 47 0 14:24 ? 00:00:00 /usr/sbin/httpd apache 53 47 0 14:24 ? 00:00:00 /usr/sbin/httpd apache 54 47 0 14:24 ? 00:00:00 /usr/sbin/httpd apache 55 47 0 14:24 ? 00:00:00 /usr/sbin/httpd apache 56 47 0 14:24 ? 00:00:00 /usr/sbin/httpd apache 57 47 0 14:24 ? 00:00:00 /usr/sbin/httpd root 60 35 0 14:24 ? 00:00:00 sshd: enakai [priv] enakai 62 60 0 14:25 ? 00:00:00 sshd: enakai@pts/0 enakai 63 62 0 14:25 pts/0 00:00:00 -bash root 78 63 0 14:25 pts/0 00:00:00 sudo -i root 79 78 0 14:25 pts/0 00:00:00 -bash root 90 79 0 14:25 pts/0 00:00:00 ps -ef
  • 27. Open Cloud Campus 27 Dockerクイックツアー Dockerfileのビルドとコンテナの起動  コンテナを停止した後、再度、起動する例です。 – 「docker run」は、最初にコンテナを起動した際と同じオプションで、再度、コンテナを作成しま す。ディスクイメージは停止時に保存してあるものを再利用します。 – 不要になったコンテナは停止した後に、「docker rm」で削除しておきます。 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1014c487be4e enakai/httpd:ver1.0 /usr/local/bin/init. About a minute ago Up About a minute 0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp web01 # docker stop web01 web01 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1014c487be4e enakai/httpd:ver1.0 /usr/local/bin/init. About a minute ago Exited (-1) 2 seconds ago web01 # docker start web01 web01 [root@fedora20 ~]# !curl curl http://localhost:8000 Hello, World! # docker stop web01 web01 # docker rm web01 web01 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 28. Dockerクイックツアー 参考:Dockerが無いとき ( ´ー`)551が~ あるとき~(´ー` ) ( ´ - `)ないとき~(´ - ` ) ( ´ー`)あるとき~(´ー` ) ( ´ - `)ないとき~(´ - ` ) ( ´ー`)あるとき~(´ー` ) ( ´ - `)ないとき~(´ - ` )
  • 29. Open Cloud Campus 29 Dockerクイックツアー libvirtによるコンテナ作成  RHEL6.5の環境で、libvirtを使用してコンテナを作成する手順を紹介します。 – 図のようにKVM仮想マシンと同様にvirshコマンドでコンテナを作成・管理できます。ここで は、busyboxによる簡易httpdサーバをコンテナ内で起動します。 – はじめに、通常の手順でKVMホスト環境を用意します。 仮想マシン#1 vnet1 eth0 仮想マシン#2 eth0 IPマスカレード ホスト Linuxvnet0 eth0 外部ネットワーク veth0 eth0 コンテナ#1 virbr0 (default) busybox 192.168.122.190 192.168.122.1 # yum groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform" # chkconfig libvirtd on # reboot
  • 30. Open Cloud Campus 30 Dockerクイックツアー 仮想ルートファイルシステムの用意  アプリケーションコンテナの仮想ルートファイルシステムを用意します。 – busyboxの動作に必要な最小限の環境を「/export/lxcguest01」以下に用意します。 – コンテナ起動時に最初に実行するスクリプト「/export/lxcguest01/bin/init」を作成します。 • これは、IPアドレスの設定と簡易Webサーバの起動を行います。最後の「sh」は、仮想コンソールで使用する シェルになります。 – 「/export/lxcguset01/bin/init」に実行権を設定します。 – 簡易Webサーバで公開するコンテンツ「/export/lxcguest01/html/index.html」を用意します。 # mkdir -p /export/lxcguest01/bin # mkdir -p /export/lxcguest01/html # cd /export/lxcguest01/bin # cp /sbin/busybox ./ # for i in echo grep ifconfig kill ps route test which cat false head ls pwd sh true date find httpd ip ping rm sleep wget; do ln -s busybox $i; done #!/bin/sh ifconfig eth0 192.168.122.190 route add default gw 192.168.122.1 eth0 httpd -h /html while [[ true ]]; do sh done /export/lxcguest01/bin/init # chmod u+x /export/lxcguest01/bin/init <h1>Welcome to Linux Container</h1> /export/lxcguest01/html/index.html
  • 31. Open Cloud Campus 31 Dockerクイックツアー コンテナの定義  コンテナ「lxcguest01」を定義して、起動します。 – コンテナ定義のXMLファイル「/root/work/lxcguest01.xml」を作成します。 – コンテナを定義します。 <domain type='lxc'> <name>lxcguest01</name> <memory>200000</memory> <os> <type>exe</type> <init>/bin/init</init> </os> <devices> <interface type='network'> <source network='default'/> </interface> <console type='pty'/> <filesystem type='mount'> <source dir='/export/lxcguest01'/> <target dir='/'/> </filesystem> </devices> </domain> /root/work/lxcguest01.xml # cd /root/work # virsh -c lxc:/// define lxcguest01.xml ドメイン lxcguest01 が lxcguest01.xml から定義されました # virsh -c lxc:/// list --all Id 名前 状態 ---------------------------------- - lxcguest01 シャットオフ
  • 32. Open Cloud Campus 32 Dockerクイックツアー コンテナの起動 – コンテナを起動します。 – コンテナの仮想コンソールに接続して、コンテナ内部の状態を確認します。 • 最初に起動した「/export/lxcguest01/bin/init」がPID 1のプロセスとなり、その子プロセスが見えます。 ファイルシステムは「/export/lxcguset01」がルートファイルシステムとして見えます。 # virsh -c lxc:/// start lxcguest01 ドメイン lxcguest01 が起動されました # virsh -c lxc:/// list --all Id 名前 状態 ---------------------------------- 12123 lxcguest01 実行中 # virsh -c lxc:/// console lxcguest01 Connected to domain lxcguest01 エスケープ文字は ^] です # ps -ef PID USER TIME COMMAND 1 0 0:00 /bin/sh /bin/init 6 0 0:00 httpd -h /html 7 0 0:00 sh 8 0 0:00 ps -ef # ls -l drwxr-xr-x 2 0 0 4096 May 15 23:01 bin drwxr-xr-x 10 0 0 200 May 15 23:05 cgroup drwxr-xr-x 3 0 0 300 May 15 23:05 dev drwxr-xr-x 2 0 0 4096 May 15 23:02 html dr-xr-xr-x 324 0 0 0 May 15 23:05 proc drwxr-xr-x 13 0 0 0 Mar 13 03:14 sys
  • 33. Open Cloud Campus 33 Dockerクイックツアー コンテナの起動 – コンテナ内部の状態確認の続きです。 • コンテナ内部には仮想NIC「eth0」がアサインされています。これは、ホストLinux上の「veth0」と接続され ています。仮想コンソールへの接続は、「Ctrl+]」で終了します。 – ホストLinuxからWebサーバにアクセスできることも分かります。 # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 52:54:00:44:E0:52 inet addr:192.168.122.190 Bcast:192.168.122.255 Mask:255.255.255.0 inet6 addr: fe80::5054:ff:fe44:e052/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:648 (648.0 B) # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.122.1 0.0.0.0 UG 0 0 0 eth0 # ← Ctrl+]を押す # curl http://192.168.122.190 <h1>Welcome to Linux Container</h1>
  • 34. Open Cloud Campus 34 Dockerクイックツアー ホストLinuxからの確認とコンテナの停止  ホストLinux上でコンテナの状態を確認します。 – ホストLinux上でコンテナを実行するプロセスを確認します。 • libvirt_lxcから起動される子プロセスがコンテナ内部から見えるプロセスになります。 – 仮想ブリッジの状態を確認します。 # pstree ・・・ ├─libvirt_lxc───init─┬─httpd │ └─sh ・・・ # brctl show virbr0 bridge name bridge id STP enabled interfaces virbr0 8000.52540031ddff no veth0 virbr0-nic eth0 IPマスカレード ホスト Linux 外部ネットワーク veth0 eth0 コンテナ#1 virbr0 busybox 192.168.122.190 192.168.122.1# virsh -c lxc:/// dumpxml lxcguest01 | grep veth <target dev='veth0'/> • この例では、「virbr0」に接続された「veth0」がコンテナ内部の仮想 NIC「eth0」に接続されています。 • 実際にコンテナに割り当てられた仮想イーサネットデバイスは、次のコマンド で確認します。 – コンテナ「lxcguest01」を停止します。 # virsh -c lxc:/// destroy lxcguest01 ドメイン lxcguest01 は強制停止されました
  • 36. Open Cloud Campus 36 Dockerクイックツアー 参考資料  Dockerfile tutorial – https://www.docker.io/learn/dockerfile/