Weitere ähnliche Inhalte Ähnlich wie Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック (20) Mehr von Etsuji Nakai (20) Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック1. Red Hat Enterprise Linux
OpenStack Platform環境での
Docker活用テクニック
レッドハット株式会社
v1.3 2015-11-04
2. 2
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
自己紹介
中井悦司(なかいえつじ)
– Twitter @enakai00
日々の仕事
– Senior Solution Architect and
Cloud Evangelist at Red Hat K.K.
企業システムでオープンソースの活用を希望される
お客様を全力でご支援させていただきます。
昔とった杵柄
– 素粒子論の研究(超弦理論とか)
– 予備校講師(物理担当)
– インフラエンジニア(Unix/Linux専門)
好評発売中!
本日のデモで使用する
コンテナイメージの作り方は、
この本に記載されています。
3. 3
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
デモの詳細はブログを参照してください
デモの手順(スクリプトやコマンド)の詳細は下記のブログに掲載しています。
– OpenStack上でRHEL7のDockerを使う手順
– http://enakai00.hatenablog.com/entry/2015/10/06/194542
本スライドに記載のスクリプトやコマンドは、一部を抜粋したものです。スクリプ
トの全体像は上記のブログを参考にしてください。
4. 4
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Contents
OpenStackの機能概要(復習)
Dockerの機能概要(復習)
OpenStackとDockerを組み合わせるメリット
Docker用仮想マシンの構成
(ブロックボリュームを使わない例)
Docker用仮想マシンの構成
(ブロックボリュームを使う例と複数コンテナの連携例)
Kubernetes/OpenShiftによるオーケストレーション
6. 6
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
OpenStackが提供するコンピューティングリソース
OpenStackのユーザは、Webコンソール/APIを利用して、
次のようなコンピューティングリソースを利用します。
– 仮想ネットワーク
– 仮想マシンインスタンス
– ブロックボリューム
データ領域 ブロックボリューム
仮想ルータ
仮想スイッチ
外部ネットワーク
プロジェクト環境
OpenStackユーザ
OS領域
各ユーザは特定の「プロジェクト」に
所属します。
– プロジェクト内でリソースを共有
– プロジェクト全体でのリソース使用
量の上限設定、リソース使用状況の
レポーティングなどが可能
仮想マシンインスタンス
7. 7
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
9. 9
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Dockerが提供する基本機能
Dockerfile
① Dockerイメージを自動作成
OSイメージ
アプリケーション
ライブラリー
アプリケーション
フレームワーク
イメージの
作成手順を記載
Docker
イメージ
OS上にインストール可能な
ものはすべてイメージ化可能
② Dockerイメージを保存・公開
③ Dockerサーバーに
イメージを配布・実行
10. 10
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
フレームワーク
データベース
アプリケーション
フレームワーク
ライブラリー
Dockerイメージを
本番環境に展開!
テストが実施された「確実動くアプリケーション」をそのままDockerイメージに
固めて、本番環境に自動デプロイするという運用を想像してみましょう・・・。
サービス環境へのDocker適用のメリット
12. 12
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
OpenStackによる自動化(オーケストレーション)手法
Dockerが無かった時代は・・・
– 仮想マシン、ストレージ、ネットワークなどのインフラは、OpenStackで自動構成
– ゲストOS上のアプリはChef/Ansible/Puppetなどの構成管理ツールで自動構成
ゲストOSとアプリの管理が別れているため「Immutable」な運用が困難!
– ゲストOSのテンプレートはOpenStack側で管理
– 仮想マシン起動時に動的にアプリの導入・設定を実施
「第14章 Dockerを利用したアプリケーション展開」より引用
ゲストOSの変更に起因する
アプリ導入の失敗が発生
13. 13
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
OpenStackとDockerの組み合わせ手法
Dockerを用いた運用だと・・・
– OpenStackは、「インフラ+DockerホストOS」の提供に専念
– アプリの実行環境は、Dockerイメージで作成・管理・デプロイ
インフラとアプリの管理を分離することで「Immutable」な運用が容易に!
– ゲストOSのテンプレートはDockerの稼働環境を提供
– 事前作成済みのDockerイメージを配布してアプリを起動
「第14章 Dockerを利用したアプリケーション展開」より引用
アプリの導入・管理を
OpenStackから分離可能
14. 14
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Docker用仮想マシンの構成(全体像)
永続データ
領域
イメージ
保存領域
OS領域Docker導入済み
VMテンプレート
ホストLinuxの
/dataにマウント
仮想マシン
ブロックボリューム
追加の
エフェメラルディスク
コンテナ
(アプリケーション)
/data
コンテナ
イメージ
Dockerデーモン
ゲストOS
(ホストLinux)
/var/lib/mysql
永続データは特定の
ディレクトリに保存
Dockerで管理
OpenStackで管理
16. 16
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Railsアプリをコンテナで起動する構成例
イメージ
保存領域
OS領域Docker導入済み
VMテンプレート
仮想マシン
追加の
エフェメラルディスク
コンテナ
(Railsアプリ)
コンテナ
イメージ
DockerデーモンDockerで管理
OpenStackで管理 フローティングIP
コンテナ内で
Railsアプリを起動
Railsアプリ(伝言板)
のイメージを事前登録
フローティングIPにアクセス
17. 17
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
ゲストOSとイメージ保存領域の用意
イメージ
保存領域
OS領域Docker導入済み
VMテンプレート
仮想マシン
OS領域とイメージ保存領域のディスクを用意します。
– RHEL7の公式ゲストイメージにdockerパッケージを導入
したスナップショットを用意します。
– また、イメージ保存領域用に「一時ディスク」の容量を
設定したフレーバーを定義しておきます。
# 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
18. 18
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
仮想マシンの作成とコンテナの起動(Railsアプリ)
イメージ
保存領域
OS領域Docker導入済み
テンプレート
仮想マシン
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
docker run -itd -p 8000:80 --name dengonban01
registry01:5000/enakai00/rails:ver1.0
「/dev/vdb」にVGを作成して、
イメージ保存領域として構成
ゲストOSからは
「/dev/vdb」として認識
8000番ポートへのアクセスを
コンテナの80番ポートに転送
19. 19
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
コンテナー
(参考)Dockerの内部ネットワーク構成
それぞれのコンテナーには独立した仮想NICとプライベートIPアドレスが割り当てられて、ホ
ストLinuxの仮想ブリッジ(docker0)に接続します。
– IPアドレスは自動で割り当てられますが、他のコンテナーからは環境変数で参照できるように設定が
可能です。
外部ネットワークからアクセスする際は、ホストLinuxで受信したパケットをコンテナー内に
転送するように設定します。
ホストLinux
vethXX
eth0
docker0
eth0
外部ネットワーク
– 外部のクライアントはホストLinuxにアクセスするので、コン
テナーの存在を意識することはありません。
– OpenStack環境の場合、外部からは、仮想マシンに割り当てた
「フローティングIP」にアクセスします。
172.17.42.1
# docker run -it -p 8000:80 ...
ホストLinuxの
IPアドレスに接続
TCP 8000
TCP 80
ポート
フォワー
ディング
21. 21
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
MySQLをコンテナで起動する構成例
永続データ
領域
イメージ
保存領域
OS領域Docker導入済み
テンプレート
ホストLinuxの
/dataにマウント
仮想マシン
ブロックボリューム
追加の
エフェメラルディスク
コンテナ
(MySQL)
/data
コンテナ
イメージ
Dockerデーモン
/var/lib/mysql
MySQLのデータ領域
「/var/lib/mysql」に
ブロックボリュームの
ディクレクトリを割り当て
Dockerで管理
OpenStackで管理
コンテナ内で
MySQLを起動
MySQLのイメージを
事前登録
22. 22
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,
url VARCHAR(256) UNIQUE NOT NULL COLLATE utf8_bin
);"
EOF
この後で起動するnode.jsアプリで
使用するデータベースを作成
23. 23
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
MySQLにアクセスするコンテナの構成例
永続データ
領域
イメージ
保存領域
OS領域
コンテナ
(MySQL)
/data
コンテナ
イメージ
Dockerデーモン
/var/lib/mysql
フローティングIP
イメージ
保存領域
OS領域
コンテナ
(node.jsアプリ)
コンテナ
イメージ
Dockerデーモン
フローティングIP フローティングIPにアクセス
フローティングIPにアクセス
var DBHOST = process.env.DB_PORT_3306_TCP_ADDR;
var DBPORT = process.env.DB_PORT_3306_TCP_PORT;
接続先DBのIP/ポートは
環境変数で参照
24. 24
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/ポートを
環境変数に設定して
コンテナを起動
接続先DBのIP/ポートは
環境変数で参照
コンテナ
(node.jsアプリ)
コンテナ
イメージ
Dockerデーモン
var DBHOST = process.env.DB_PORT_3306_TCP_ADDR;
var DBPORT = process.env.DB_PORT_3306_TCP_PORT;
26. 26
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Docker活用パターン1:アプリのデプロイを安全/簡単に
仮想マシン上のアプリケーションをコンテナイメージ化することで、アプリケー
ションのデプロイを安全/簡単にします。
– 「1仮想マシンに1アプリケーション」という配置はあえて変更しないことで、運用方
法やアプリケーションのデザインへの影響を最小限に留めます。
– 外部からアプリケーションに接続するユーザー/外部システムは、アプリケーションが
コンテナ化されていることを意識する必要がありません。
– コンテナイメージを開発する環境(OpenShiftなど)は、別途、必要となります。
OpenStack/仮想化基盤
仮想マシン
(ゲストOS)
アプリA
・・・
・・・
これまでの環境
アプリケーションの
コンテナイメージ化
OpenStack/仮想化基盤
仮想マシン
(Dockerホスト)
アプリA
(コンテナ
イメージ)
仮想マシン
(Dockerホスト)
アプリB
(コンテナ
イメージ)
・・・
・・・
仮想マシン
(ゲストOS)
アプリB
27. 27
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Docker活用パターン2:コンテナ化によるリソース有効活用
コンテナの配置先を自動的に振り分ける仕組みを用いて、複数ホストを「1つの
コンピューティングリソース」として活用します。
– Kubernetesなどのオーケストレーションツールを使用します。
アプリケーションを機能単位に分割してコンテナ化することで、さらなるメリッ
トが得られます。
– 必要な機能を負荷に応じてオートスケールします。
– 機能単位でコンテナを入れ替えることにより、稼働中のアプリケーションの動的な機能
変更が可能になります。
OpenStack/仮想化基盤
仮想マシン
(Dockerホスト)
仮想マシン
(Dockerホスト)
仮想マシン
(Dockerホスト)
・・・
複数ホストを束ねて「1つのコンピュータ」として活用
マイクロサービス化
アプリケーション
28. 28
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Kubernetes:Dockerをより高度に管理する仕組みを提供
http://jp.techcrunch.com/2014/07/11/20140710google-microsoft-ibm-and-others-collaborate-to-make-managing-docker-containers-easier/
今後は、Kubernetesを利用した
DevOps基盤が開発されていきます
30. 30
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
まとめ
サービス環境でDockerを使用するメリットは、大きく2種類あります。
アプリケーションのデプロイを簡単/安全に実施する。
– 開発側で、テスト済みのアプリケーション環境をイメージ化する仕組みを用意する必要
があります。OpenShiftの開発支援機能を活用してください。
– 1VM(1ホスト)に1コンテナを配置することで、アプリケーションの設計/運用は従
来と同じ方法を踏襲します。
– OpenStack + Dockerにより、VMの作成とコンテナの配置を自動化する事も可能です。
複数のホストをプール化して、リソースの有効活用を行う。
– Kubernetes, OpenShiftなど、コンテナの自動配置(オーケストレーション)を行うツー
ルと組み合わせる必要があります。OpenStackを用いて、Kubernetes/OpenShift環境を
自動構築する事も可能です。
– ハイパーバイザーのオーバーヘッドを回避したい場合は、OpenStackのベアメタルプロ
ビジョニング機能が利用できます。
– アプリケーションのマイクロサービス化により、機能単位のオートスケール、アプリ
ケーションの動的な機能変更が実現可能になります。
本日ご紹介した
利用パターン
先進企業が
取り組む世界
31. 31
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