Más contenido relacionado La actualidad más candente (20) Similar a Dockerクイックツアー (20) 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のグループ名
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
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 は強制停止されました