今さら聞けない人のためのdocker超入門 – openstack最新情報セミナー...
TRANSCRIPT
自己紹介
• 本名:宮原徹• 1972年1月神奈川県生まれ• 1994年3月中央大学法学部法律学科卒業• 1994年4月日本オラクル株式会社入社
– PCサーバ向けRDBMS製品マーケティングに従事– Linux版Oracle8の日本市場向け出荷に貢献
• 2000年3月株式会社デジタルデザイン東京支社長および株式会社アクアリウムコンピューター代表取締役社長に就任– 2000年6月 (株)デジタルデザイン、ナスダック・ジャパン上場(4764)
• 2001年1月株式会社びぎねっと設立• 2006年12月日本仮想化技術株式会社設立• 2008年10月 IPA「日本OSS貢献者賞」受賞• 2009年10月日中韓OSSアワード 「特別貢献賞」受賞
2
日本仮想化技術株式会社概要
• 社名:日本仮想化技術株式会社– 英語名:VirtualTech Japan Inc.– 略称:日本仮想化技術/VTJ
• 設立:2006年12月• 資本金:2,000万円• 売上高:1億3,573万円(2013年7月期)• 本社:東京都渋谷区渋谷1-8-1• 取締役:宮原徹(代表取締役社長兼CEO)• 伊藤宏通(取締役CTO)• スタッフ:8名(うち、6名が仮想化技術専門エンジニアです)• URL:http://VirtualTech.jp/• 仮想化技術に関する研究および開発
– 仮想化技術に関する各種調査– 仮想化技術に関連したソフトウェアの開発– 仮想化技術を導入したシステムの構築– OpenStackの導入支援・新規機能開発
ベンダーニュートラルな独立系仮想化技術のエキスパート集団
3
情報サイト:EnterpriseCloud.jp
• OpenStackで始めるエ
ンタープライズクラウドの情報サイト
• OpenStack導入手順書のダウンロード
• 各種プレゼン資料
• その他ブログ記事
4
本日のアジェンダ
• Dockerを動かそう• Dockerコンテナのライフサイクル• Dockerの操作とトラブルシューティング基礎の基礎• Dockerfileを書いてみる• DockerとOpenStack
• スタッフ募集のお知らせ
• Dockerを触ったことがない、という方向けです• ごく基本的な話しかしていません
• バージョンアップして変更になったり、もっと色々なテクニックも存在します
5
Dockerの特徴
• 1コンテナ1プロセスで動作する– ハイパーバイザーのオーバーヘッドが無い
• ≒コンテナ内で1プロセスが動作する– サービスプロセスと並行で対話型シェルを動かすなどの考え方は基本的に無い
– コンテナの中であれもこれも動作させるのには向かない
• Dockerイメージはファイルシステム– chrootを思い浮かべるとちょうどいい
7
Dockerをインストールする
1. CentOS 7をインストール
2. Dockerパッケージをインストール
– # yum install docker
3. bridge-utilsパッケージも入れておきます
– # yum install bridge-utils
4. dockerサービスを起動しておきます
– # systemctl start docker.service
– # systemctl enable docker.service
8
Dockerイメージをダウンロード
1. CentOS 7のDockerイメージを検索
– # docker search centos
2. CentOSのDockerイメージをダウンロード
– # docker pull centos
– 最新版(latest)がダウンロードされる
3. Dockerイメージを確認
– # docker images
– 基本的にはIDで識別(同一IDに複数TAGも)
9
Dockerコンテナを実行(基本)
1. CentOSイメージでコンテナを実行
– # docker run -it centos /bin/bash
– -i, --interactive=true|false
– -t, --tty=true|false
2. 実行中のコンテナを確認
– # docker ps -a
– -a, --all=true|false
– 一意のIDと名前が割り当てられる
10
Dockerコンテナ実行(応用)
1. コンテナ名を付ける
– # docker run --name=名前イメージ名コマンド
2. シェルからコマンドを実行させる
– # docker run イメージ名 /bin/bash -c "コマンド"
– yumでパッケージをインストールしたり
3. より複雑な実行時処理を行いたい場合はDockerfileを記述する(後述)
– どこまで複雑にするかはケースバイケース?
11
イメージとコンテナの変移
13
centos
①コンテナとして実行(docker run)
httpd ② # yum install httpd
centos
httpd
③コンテナをイメージ化(docker commit)④イメージをコンテナ化(docker run)
centos
コンテナをイメージ化
1. コンテナにhttpdパッケージをインストール
– # docker run --name=httpd centos /bin/bash -c
"yum install httpd -y"
2. httpdコンテナをコミットしてイメージ化
– # docker commit httpd httpd_template
3. イメージを確認
– # docker images
14
新たなイメージからコンテナ実行
1. コンテナでhttpdを実行し、コンテナのポート80
番をホストの8080番に紐付ける
– # docker run -d -p 8080:80 --name=web1
httpd_template /usr/sbin/htttpd -D FOREGROUND
– -d, --detach=true|false
2. ポートが紐付いていることを確認
– # docker ps -a
– # curl localhost:8080
15
httpdが動かない!?
• CentOS 7.1へのバージョンアップが原因
• /run mounted as tmpfs in container and causes changes in the directory to not be persistent
– https://bugzilla.redhat.com/show_bug.cgi?id=1194542
• Dockerコンテナ内に/run/httpdディレクトリが存在しない– systemd-tmpfiles-setup.serviceが作成する
16
httpdが動かない場合の手順
1. 対話型でDockerコンテナを起動– # docker run -it --name=httpd centos /bin/bash
2. httpdパッケージをインストールする– # yum install httpd
3. Bug情報にあるシェルスクリプトを仕込む
4. docker commitする– # docker commit httpd httpd_template
5. docker runする時にシェルスクリプトを起動する– # docker run -d -p 8080:80 --name=web1
httpd_template /usr/bin/my_httpd_startup.bash
17
/usr/bin/my_httpd_startup.bash
#!/bin/bash
# Make sure we're not confused by old, incompletely-shutdown httpd
# context after restarting the container. httpd won't start correctly
# if it thinks it is already running.
rm -rf /run/httpd/*
# need to create directories per /usr/lib/tmpfiles.d/httpd.conf
## d /run/httpd 710 root apache
## d /run/httpd/htcacheclean 700 apache apache
mkdir -p /run/httpd/htcacheclean
chmod 710 /run/httpd
chmod 700 /run/httpd/htcacheclean
chown root:apache /run/httpd
chown apache:apache /run/httpd/htcacheclean
exec /usr/sbin/apachectl -D FOREGROUND
18
覚えておきたいコマンド
• docker inspect– 実行中のコンテナの情報を確認できる
• docker stop/start/pause– 実行中のコンテナを停止/再実行/一時停止
• docker attach– 実行中のコンテナに接続(事前にstartが必要)
• docker rm– 停止中のコンテナをコンテナリストから削除
• docker rmi– イメージを削除
20
トラブルシューティング
• 対話式シェルを実行して手動実行– エラーで停止したコンテナにログインできないので、原因を探るにはシェル実行
– nsenterを使用する方法も
• dockerサービスを再起動してみる– # systemctl restart docker
– 動作中のコンテナは停止してしまう
• ネットワーク周りならiptablesを確認– # iptables-save
21
nsenterを便利に使う
1. util-linuxパッケージをインストールする– # yum install util-linux
2. /usr/bin/docker-nsenterスクリプトを作る
1. コンテナIDか名前を引数に実行– # docker-nsenter コンテナID|名前
2. 各種コマンドが実行できます
22
#!/bin/sh
/bin/nsenter \
--mount --uts --ipc --net --pid --target \
`docker inspect --format '{{.State.Pid}}' $1`
ホストのNIC周りの確認[root@localhost ~]# ip addr show
(略)2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1c:42:1e:f2:ad brd ff:ff:ff:ff:ff:ff
inet 172.16.6.246/16 brd 172.16.255.255 scope global dynamic eth0
valid_lft 2984sec preferred_lft 2984sec
inet6 fe80::21c:42ff:fe1e:f2ad/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::5484:7aff:fefe:9799/64 scope link
valid_lft forever preferred_lft forever
35: veth1f3e585: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master docker0 state UP qlen 1000
link/ether 92:d8:4a:6c:20:b2 brd ff:ff:ff:ff:ff:ff
inet6 fe80::90d8:4aff:fe6c:20b2/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.56847afe9799 no veth1f3e585
23
Dockerのネットワーク構成図
24
Dockerコンテナ
eth0
eth0
docker0
veth veth
Dockerコンテナ
eth0
仮想的に直結
ブリッジ接続
NAPT接続(IPマスカレードやポート転送)
外部
iptables-saveの実行結果*nat
:PREROUTING ACCEPT [3251:517949]
:INPUT ACCEPT [1495:211919]
:OUTPUT ACCEPT [74:5868]
:POSTROUTING ACCEPT [73:5828]
: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 ! -o docker0 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.11:80
COMMIT
*filter
:INPUT ACCEPT [3028:437371]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [92:8782]
-A FORWARD -d 172.17.0.11/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
COMMIT
赤:コンテナが外部に出ていくための設定 青:コンテナへの接続設定
25
※firewalldを止めています
Dockerfileに書ける内容
命令 内容
FROM 元となるイメージ
MAINTAINER Dockerfileの制作者
RUN コマンドの実行
ADD ファイル、ディレクトリの追加
CMD コンテナの実行コマンド(実行時上書き可)
ENTRYPOINT コンテナの実行コマンド(実行時上書き不可)
WORKDIR 作業ディレクトリの指定
ENV 環境変数の指定
USER 実行ユーザの指定
EXPOSE ポートの紐付け
VOLUME ボリュームのマウント27
Dockerfileの使用例
• Dockerfileを作成する
– ENTRYPOINTでhttpdの起動を指定しているので、docker run時に指定が不要
• docker buildでイメージを作る
– # docker build -t イメージ名 ./Dockerfile
28
FROM centos:latest
MAINTAINER tmiyahar <[email protected]>
RUN yum install httpd -y
ENTRYPOINT /usr/sbin/httpd -D FOREGROUND
DockerとOpenStack
• HavanaでNova hypervisor driverとして登場
• IcehouseとJunoでは"out-of-tree"
– 色々と改良を加えるのに制限が少ない状態
• Kiloでmainlineに復帰しますよ
• DockerイメージをGlanceに格納– docker saveコマンドの出力(tarball)をglanceコマンドにパイプで流し込む
– コンテナフォーマットはdocker
– あまり細かい制御はできないのでDockerfileで事前設定必須
30
https://wiki.openstack.org/wiki/Docker より
DockerDriverのアーキテクチャ
31
GlanceへのDockerイメージの格納はdocker saveコマンドを使う
docker-registryは今後不要となる
https://wiki.openstack.org/wiki/Docker より
募集している職種は
• サーバー・ネットワークエンジニア– LPIC、CCNAなどの保有者歓迎
• プログラマー– オブジェクト指向言語が理解できている事
– OpenStackのコードを読んだり、書いたり
• 営業・企画・マーケティング– SE、PL、PM経験者大歓迎
優れた環境が優れた成果を生む
渋谷駅徒歩5分の新オフィス
幅140cmのゆったりデスクとアーロンチェアMacBook Pro/Airと大型液晶モニタが標準キーボード・マウスも自由
充実の検証環境最新機材で作業
充実の福利厚生
• マッサージチェア
• 充実のフリードリンクコーナー
– 各種お茶類、ネスプレッソなど各種取り揃え
• 誕生日はケーキでお祝い
• 雑誌年間購読制度
– 何でも好きな雑誌を年間購読
• 書籍購入支援制度
– 好きな書籍(漫画も可)を1万円/年購入
39