Red Hat Enterprise Linux OpenStack Platform環境での Docker活用テク

Red Hat Enterprise Linux
OpenStack Platform環境での
Docker活用テクニック
Etsuji Nakai
Cloud Evangelist
Red Hat K.K.
4 November 2015
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
自己紹介
 中井悦司(なかいえつじ)
– Twitter @enakai00
 日々の仕事
– Senior Solution Architect and
Cloud Evangelist at Red Hat K.K.
企業システムでオープンソースの活用を希望される
お客様を全力でご支援させていただきます。
 昔とった杵柄
– 素粒子論の研究(超弦理論とか)
– 予備校講師(物理担当)
– インフラエンジニア(Unix/Linux専門)
本日のデモで使用する
コンテナイメージの作り方は、
この本に記載されています。
1
好評発売中!
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
デモの詳細はブログを参照してください
 デモの手順(スクリプトやコマンド)の詳細は下記のブログに掲載しています。
– OpenStack上でRHEL7のDockerを使う手順
– http://enakai00.hatenablog.com/entry/2015/10/06/194542
 本スライドに記載のスクリプトやコマンドは、一部を抜粋したものです。スクリプ
トの全体像は上記のブログを参考にしてください。
2
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Contents
 OpenStackの機能概要(復習)
 Dockerの機能概要(復習)
 OpenStackとDockerを組み合わせるメリット
 Docker用仮想マシンの構成
(ブロックボリュームを使わない例)
 Docker用仮想マシンの構成
(ブロックボリュームを使う例と複数コンテナの連携例)
 Kubernetes/OpenShiftによるオーケストレーション
3
OpenStackの機能概要(復習)
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
OpenStackが提供するコンピューティングリソース
OpenStackユーザ
 OpenStackのユーザは、Webコンソール/APIを利用して、
次のようなコンピューティングリソースを利用します。
外部ネットワーク
– 仮想ネットワーク
– 仮想マシンインスタンス
– ブロックボリューム
 各ユーザは特定の「プロジェクト」に
所属します。
– プロジェクト内でリソースを共有
– プロジェクト全体でのリソース使用
量の上限設定、リソース使用状況の
レポーティングなどが可能
プロジェクト環境
仮想ルータ
仮想スイッチ
OS領域
データ領域
5
仮想マシンインスタンス
ブロックボリューム
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
カスタマイズ・スクリプト(UserData)による自動化
 仮想マシンインスタンス起動時に「カスタマイズ・スクリプト(UserData)」を与えると任
意のテキストをメタデータとしてゲストOSに受け渡すことができます。
 Cloud-Initは、カスタマイズ・スクリプトを解釈して、さまざまな自動化を実現します。
– 下図はシェルスクリプトを渡して、「/etc/motd」を設定しています。
– この他にもCloud-Init独自の構文で、処理内容を指示することができます。
$ curl http://169.254.169.254/2009-04-04/user-data
#!/bin/sh
echo 'Hello, World' > /etc/motd
exit 0
6
Dockerの概要(復習)
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Dockerが提供する基本機能
OS上にインストール可能な
ものはすべてイメージ化可能
① Dockerイメージを自動作成
Dockerfile
イメージの
作成手順を記載
Docker
イメージ
OSイメージ
② Dockerイメージを保存・公開
③ Dockerサーバーに
イメージを配布・実行
8
アプリケーション
フレームワーク
アプリケーション
ライブラリー
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
サービス環境へのDocker適用のメリット
 テストが実施された「確実動くアプリケーション」をそのままDockerイメージに
固めて、本番環境に自動デプロイするという運用を想像してみましょう・・・。
フレームワーク
データベース
アプリケーション
フレームワーク
ライブラリー
Dockerイメージを
本番環境に展開!
9
OpenStackとDockerを
組み合わせるメリット
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
OpenStackによる自動化(オーケストレーション)手法
 Dockerが無かった時代は・・・
– 仮想マシン、ストレージ、ネットワークなどのインフラは、OpenStackで自動構成
– ゲストOS上のアプリはChef/Ansible/Puppetなどの構成管理ツールで自動構成
 ゲストOSとアプリの管理が別れているため「Immutable」な運用が困難!
– ゲストOSのテンプレートはOpenStack側で管理
– 仮想マシン起動時に動的にアプリの導入・設定を実施
ゲストOSの変更に起因する
アプリ導入の失敗が発生
11
「第14章 Dockerを利用したアプリケーション展開」より引用
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
OpenStackとDockerの組み合わせ手法
 Dockerを用いた運用だと・・・
– OpenStackは、「インフラ+DockerホストOS」の提供に専念
– アプリの実行環境は、Dockerイメージで作成・管理・デプロイ
 インフラとアプリの管理を分離することで「Immutable」な運用が容易に!
– ゲストOSのテンプレートはDockerの稼働環境を提供
– 事前作成済みのDockerイメージを配布してアプリを起動
アプリの導入・管理を
OpenStackから分離可能
12
「第14章 Dockerを利用したアプリケーション展開」より引用
Docker用仮想マシンの構成手順
(ブロックボリュームを使わない例)
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Railsアプリをコンテナで起動する構成例
コンテナ内で
Railsアプリを起動
Railsアプリ(伝言板)
のイメージを事前登録
コンテナ
(Railsアプリ)
コンテナ
イメージ
Dockerで管理
OpenStackで管理
Dockerデーモン
仮想マシン
フローティングIP
フローティングIPにアクセス
Docker導入済み
VMテンプレート
OS領域
イメージ
保存領域
追加の
エフェメラルディスク
14
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
ゲストOSとイメージ保存領域の用意
 OS領域とイメージ保存領域のディスクを用意します。
– RHEL7の公式ゲストイメージにdockerパッケージを導入
したスナップショットを用意します。
– また、イメージ保存領域用に「一時ディスク」の容量を
設定したフレーバーを定義しておきます。
仮想マシン
Docker導入済み
VMテンプレート
OS領域
イメージ
保存領域
#
#
#
#
#
#
15
subscription-manager register
subscription-manager attach --pool=<pool id>
subscription-manager repos --disable=*
subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-extras-rpms
yum -y update
yum -y install docker lvm2
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
仮想マシンの作成とコンテナの起動(Railsアプリ)
 Nova APIから仮想マシンを作成します。
– 先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。
– 起動後に外部からアクセス可能なフローティングIPを割り当てます。
 UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。
– イメージ保存領域をセットアップ
cat <<'EOF' >/etc/sysconfig/docker-storage-setup
VG=vg_pool
DATA_SIZE=18G
EOF
rm -rf /var/lib/docker/*
pvcreate -f /dev/vdb
vgcreate vg_pool /dev/vdb
docker-storage-setup
「/dev/vdb」にVGを作成して、
イメージ保存領域として構成
– コンテナイメージを取得して、コンテナを起動
docker run -itd -p 8000:80 --name dengonban01 \
registry01:5000/enakai00/rails:ver1.0
8000番ポートへのアクセスを
コンテナの80番ポートに転送
仮想マシン
Docker導入済み
テンプレート
ゲストOSからは
「/dev/vdb」として認識
16
OS領域
イメージ
保存領域
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
(参考)Dockerの内部ネットワーク構成
 それぞれのコンテナーには独立した仮想NICとプライベートIPアドレスが割り当てられて、ホ
ストLinuxの仮想ブリッジ(docker0)に接続します。
– IPアドレスは自動で割り当てられますが、他のコンテナーからは環境変数で参照できるように設定が
可能です。
 外部ネットワークからアクセスする際は、ホストLinuxで受信したパケットをコンテナー内に
転送するように設定します。
– 外部のクライアントはホストLinuxにアクセスするので、コン
テナーの存在を意識することはありません。
– OpenStack環境の場合、外部からは、仮想マシンに割り当てた
「フローティングIP」にアクセスします。
コンテナー
TCP 80
ホストLinux
ポート
フォワー
ディング
# docker run -it -p 8000:80 ...
TCP 8000
17
外部ネットワーク
vethXX
docker0
eth0
ホストLinuxの
IPアドレスに接続
eth0
172.17.42.1
Docker用仮想マシンの構成手順
(ブロックボリュームを使う例と
複数コンテナの連携例)
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
MySQLをコンテナで起動する構成例
コンテナ
(MySQL)
コンテナ内で
MySQLを起動
MySQLのイメージを
事前登録
/var/lib/mysql
コンテナ
イメージ
Dockerで管理
OpenStackで管理
Dockerデーモン
OS領域
イメージ
保存領域
追加の
エフェメラルディスク
19
/data
仮想マシン
Docker導入済み
テンプレート
MySQLのデータ領域
「/var/lib/mysql」に
ブロックボリュームの
ディクレクトリを割り当て
ホストLinuxの
/dataにマウント
永続データ
領域
ブロックボリューム
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
仮想マシンの作成とコンテナの起動(MySQL)
 Nova APIから仮想マシンを作成します。
– 先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。
– 起動後にフローティングIPとブロックボリュームを割り当てます。
 UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。
– イメージ保存領域をセットアップ
– ブロックボリュームが割り当てられるのを待って、ホストLinuxの/dataにマウント
mkfs.xfs -f /dev/vdd
mkdir /data
mount /dev/vdd /data
chcon -Rt svirt_sandbox_file_t /data
– コンテナイメージを取得して、コンテナを起動
docker run -itd --name mysql01 -v /data:/var/lib/mysql -p 10000:3306 registry01:5000/enakai00/mysql:ver1.0
sleep 5
docker exec mysql01 mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'nodeuser'@'localhost';"
docker exec mysql01 mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'nodeuser'@'%' IDENTIFIED BY 'pas4mysql';"
docker exec mysql01 mysql -u nodeuser -e "CREATE DATABASE shorturl_service;"
docker exec mysql01 mysql shorturl_service -u nodeuser -e " \
CREATE TABLE url_list ( \
hash CHAR(12) PRIMARY KEY, \
この後で起動するnode.jsアプリで
url VARCHAR(256) UNIQUE NOT NULL COLLATE utf8_bin \
使用するデータベースを作成
);"
EOF
20
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
MySQLにアクセスするコンテナの構成例
接続先DBのIP/ポートは
環境変数で参照
var DBHOST = process.env.DB_PORT_3306_TCP_ADDR;
var DBPORT = process.env.DB_PORT_3306_TCP_PORT;
コンテナ
(MySQL)
/var/lib/mysql
コンテナ
イメージ
コンテナ
(node.jsアプリ)
コンテナ
イメージ
Dockerデーモン
/data
Dockerデーモン
フローティングIP
フローティングIP
フローティングIPにアクセス
OS領域
イメージ
保存領域
21
永続データ
領域
OS領域
イメージ
保存領域
フローティングIPにアクセス
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
仮想マシンの作成とコンテナの起動(node.jsアプリ)
 Nova APIから仮想マシンを作成します。
– 先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。
– 起動後に外部からアクセス可能なフローティングIPを割り当てます。
 UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。
– イメージ保存領域をセットアップ
– コンテナイメージを取得して、コンテナを起動
docker run -itd --name shorturl01 -p 8000:80 \
-e DB_PORT_3306_TCP_ADDR=192.168.1.104 \
-e DB_PORT_3306_TCP_PORT=10000 \
registry01:5000/enakai00/shorturl:ver1.0
接続先DBのIP/ポートを
環境変数に設定して
コンテナを起動
var DBHOST = process.env.DB_PORT_3306_TCP_ADDR;
var DBPORT = process.env.DB_PORT_3306_TCP_PORT;
接続先DBのIP/ポートは
環境変数で参照
コンテナ
(node.jsアプリ)
コンテナ
イメージ
Dockerデーモン
仮想マシン
22
Kubernetes/OpenShiftによる
オーケストレーション
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Docker活用パターン1:アプリのデプロイを安全/簡単に
 仮想マシン上のアプリケーションをコンテナイメージ化することで、アプリケー
ションのデプロイを安全/簡単にします。
– 「1仮想マシンに1アプリケーション」という配置はあえて変更しないことで、運用方
法やアプリケーションのデザインへの影響を最小限に留めます。
– 外部からアプリケーションに接続するユーザー/外部システムは、アプリケーションが
コンテナ化されていることを意識する必要がありません。
– コンテナイメージを開発する環境(OpenShiftなど)は、別途、必要となります。
アプリケーションの
コンテナイメージ化
これまでの環境
アプリA
仮想マシン
(ゲストOS)
アプリB
・・・
仮想マシン
(ゲストOS) ・・・
OpenStack/仮想化基盤
24
アプリA
(コンテナ
イメージ)
仮想マシン
アプリB
(コンテナ ・・・
イメージ)
仮想マシン
(Dockerホスト) (Dockerホスト)
OpenStack/仮想化基盤
・・・
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Docker活用パターン2:コンテナ化によるリソース有効活用
 コンテナの配置先を自動的に振り分ける仕組みを用いて、複数ホストを「1つの
コンピューティングリソース」として活用します。
– Kubernetesなどのオーケストレーションツールを使用します。
 アプリケーションを機能単位に分割してコンテナ化することで、さらなるメリッ
トが得られます。
– 必要な機能を負荷に応じてオートスケールします。
– 機能単位でコンテナを入れ替えることにより、稼働中のアプリケーションの動的な機能
変更が可能になります。
複数ホストを束ねて「1つのコンピュータ」として活用
仮想マシン
仮想マシン
仮想マシン
(Dockerホスト) (Dockerホスト) (Dockerホスト)
25
OpenStack/仮想化基盤
・・・
マイクロサービス化
アプリケーション
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Kubernetes:Dockerをより高度に管理する仕組みを提供
今後は、Kubernetesを利用した
DevOps基盤が開発されていきます
http://jp.techcrunch.com/2014/07/11/20140710google-microsoft-ibm-and-others-collaborate-to-make-managing-docker-containers-easier/
26
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
OpenShift v3:DockerによるDevOps環境を実現
 OpenShift v3は、Docker/Kubernetesをコアコンポーネントとして、インテグレートされた
DevOps環境を提供します。
UI、モニタリング、
イメージ作成ワークフロー
etc.
OpenShift v3
DevOps環境
複数サーバーに跨る
オーケストレーション
Kubernetes
・・・
コンテナー管理
Docker
Docker
・・・
実行リソース提供
サーバー/仮想マシン
サーバー/仮想マシン
・・・
27
RHEL
Atomic Host
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
まとめ
 サービス環境でDockerを使用するメリットは、大きく2種類あります。
 アプリケーションのデプロイを簡単/安全に実施する。
本日ご紹介した
利用パターン
– 開発側で、テスト済みのアプリケーション環境をイメージ化する仕組みを用意する必要
があります。OpenShiftの開発支援機能を活用してください。
– 1VM(1ホスト)に1コンテナを配置することで、アプリケーションの設計/運用は従
来と同じ方法を踏襲します。
– OpenStack + Dockerにより、VMの作成とコンテナの配置を自動化する事も可能です。
 複数のホストをプール化して、リソースの有効活用を行う。
次世代のアプリ
ケーション環境
– Kubernetes, OpenShiftなど、コンテナの自動配置(オーケストレーション)を行うツー
ルと組み合わせる必要があります。OpenStackを用いて、Kubernetes/OpenShift環境を
自動構築する事も可能です。
– ハイパーバイザーのオーバーヘッドを回避したい場合は、OpenStackのベアメタルプロ
ビジョニング機能が利用できます。
– アプリケーションのマイクロサービス化により、機能単位のオートスケール、アプリ
ケーションの動的な機能変更が実現可能になります。
28
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
参考資料
 OpenStack上でRHEL7のDockerを使う手順
– http://enakai00.hatenablog.com/entry/2015/10/06/194542
 "Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
– http://www.slideshare.net/enakai/docker-is-not-container-dockerpaas
 Dockerイメージ管理の内部構造
– http://www.slideshare.net/enakai/docker-43975886
 Red Hat Enterprise Linux 7.1 Kubernetes入門
– http://www.slideshare.net/enakai/red-hat-enterprise-linux-71-kubernetes
 Open shift 3 technical architecture
– http://www.slideshare.net/hyoungseunglee/open-shift-3-technical-architecture
29
Thank You
Red Hat Forum 2015
Energize Your Enterprise