Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
OpenStackをさらに”使う”技術
Docker/Ansible編
パート2 OpenStack&Docker活用テクニック
中井悦司
openstackOpen source software to build public and pr...
2
OpenStack&Docker活用テクニック
自己紹介
 中井悦司(なかいえつじ)
– Twitter @enakai00
 日々の仕事
– Senior Solution Architect and
Cloud Evangelist...
3
OpenStack&Docker活用テクニック
Contents
 Dockerの概要
 OpenStackとDockerの組み合わせ
 ハンズオン① コンテナイメージ作成
 ハンズオン② イメージの動作確認
 ハンズオン③ イメ...
OpenStack&Docker活用テクニック
4
4
Dockerの概要
5
OpenStack&Docker活用テクニック
Dockerが提供する基本機能
Dockerfile
① Dockerイメージを自動作成
OSイメージ
アプリケーション
ライブラリー
アプリケーション
フレームワーク
イメージの
作成手順を...
6
OpenStack&Docker活用テクニック
Linuxコンテナの仕組み
コンテナ
物理サーバー/仮想マシン
Linuxカーネル
アプリケーション
アプリケーション
・・・
物理サーバー/仮想マシン
Linuxカーネル
・・・
コンテナ
...
7
OpenStack&Docker活用テクニック
Dockerとコンテナの関係
コンテナ
アプリケーション
ディレクトリーツリー
Linux上にマウント
ルートディレクトリー
として割り当て
 「Dockerイメージ」の実体は、コンテナに割...
8
OpenStack&Docker活用テクニック
フレームワーク
データベース
アプリケーション
フレームワーク
ライブラリー
Dockerイメージを
本番環境に展開!
 テストが実施された「確実動くアプリケーション」をそのままDocker...
9
OpenStack&Docker活用テクニック
Immutable Infrastructureとは?
– アプリケーションの設定変更、バージョンアップなどは、稼働中の本番環境を
いじるのではなく、大元のコードを変更して再テストした後に、本...
10
OpenStack&Docker活用テクニック
 コンテナは、起動(run)、停止(stop)、再開(start)、保存(commit)、削除(rm)
などの操作が実施できます。
– コンテナ起動時は指定イメージのスナップショットを自動...
OpenStack&Docker活用テクニック
11
11
OpenStackとDockerの組み合わせ
12
OpenStack&Docker活用テクニック
OpenStackによる自動化(オーケストレーション)手法
 Dockerが無かった時代は・・・
– 仮想マシン、ストレージ、ネットワークなどのインフラは、OpenStackで自動構成
–...
13
OpenStack&Docker活用テクニック
OpenStackとDockerの組み合わせ手法
 Dockerを用いた運用だと・・・
– OpenStackは、「インフラ+DockerホストOS」の提供に専念
– アプリの実行環境は、...
14
OpenStack&Docker活用テクニック
Docker用仮想マシンの構成例
永続データ
領域
OS領域Docker導入済み
VMテンプレート
ホストLinuxの
/dataにマウント
仮想マシン
ブロックボリューム
コンテナ
(アプ...
15
OpenStack&Docker活用テクニック
MySQLにアクセスするコンテナの構成例
永続データ
領域
OS領域
コンテナ
(MySQL)
/data
コンテナ
イメージ
Dockerデーモン
/var/lib/mysql
フローティ...
16
OpenStack&Docker活用テクニック
コンテナ
コンテナへのネットワーク接続経路
 それぞれのコンテナには独立した仮想NICとプライベートIPアドレスが割り当てられて、ホス
トLinuxの仮想ブリッジ(docker0)に接続し...
OpenStack&Docker活用テクニック
17
17
ハンズオン① コンテナイメージ作成
18
OpenStack&Docker活用テクニック
セキュリティグループの作成
 Etherpad-Liteの利用に必要なセキュリティグループを作成します。
– 次の手順で、以下の接続を許可したセキュリティグループ「eplite」を作成しま...
19
OpenStack&Docker活用テクニック
イメージ作成用インスタンスの起動
– 次を用いてインスタンスを起動します。
• インスタンス名「docker01」
• フレーバー「m1.small」
• イメージ「Docker01」
• ...
20
OpenStack&Docker活用テクニック
イメージ作成用インスタンスの起動
 起動したインスタンスにログインして、Dockerの稼働を確認します。
– ログインユーザーは「centos」を使用します。
$ ssh centos@1...
21
OpenStack&Docker活用テクニック
(参考)VMイメージの作成手順
 VMイメージ「Docker01」は次の手順で作成してあります。
– CentOS7のVMイメージからインスタンスを起動して、dockerのRPMパッケージ...
22
OpenStack&Docker活用テクニック
MySQLのコンテナイメージ作成
 Dockerfileを用いて、MySQLのコンテナイメージを作成します。
– Dockerfile一式をダウンロードして展開します。
– MySQLイメ...
23
OpenStack&Docker活用テクニック
EP-Liteのコンテナイメージ作成
 Dockerfileを用いて、EP-Liteのコンテナイメージを作成します。
– EP-Liteイメージ作成用のDockerfileを開いて、下記の...
24
OpenStack&Docker活用テクニック
(参考)Dockerfileの処理内容:MySQLイメージ
#!/bin/bash
service mysqld start
if [[ ! -f ~/.trap_in_bashrc ]];...
25
OpenStack&Docker活用テクニック
(参考)Dockerfileの処理内容:Etherpad-Liteイメージ
#!/bin/bash -x
sed -i "s/__FIP__/${FIP}/" /etc/nginx/conf...
OpenStack&Docker活用テクニック
26
OpenStack&Docker活用テクニック 26
ハンズオン② イメージの動作確認
27
OpenStack&Docker活用テクニック
動作確認方法
 先ほどコンテナイメージを作成したホストLinux上で、MySQLとEP-Liteのそれぞれのコン
テナをまとめて起動して動作確認します。
– EP-Liteにはフローティン...
28
OpenStack&Docker活用テクニック
MySQLをコンテナで起動
 MySQLのコンテナを起動します。
– 次のコマンドでローカルイメージを指定してコンテナを起動します。
– 次のコマンドでコンテナの稼動状態を確認します。
#...
29
OpenStack&Docker活用テクニック
EP-Liteをコンテナで起動
 EP-LiteLのコンテナを起動します。
– 次のコマンドでローカルイメージを指定してコンテナを起動します。
• 「FIP=192.168.253.17」...
30
OpenStack&Docker活用テクニック
(参考)コンテナ起動時の環境変数の設定
 EP-Liteのコンテナでは、コンテナ起動時に実行するスクリプト「init.sh」の中で、環境変
数を使って、次の2つのパラメーターを設定していま...
31
OpenStack&Docker活用テクニック
動作確認とコンテナの停止
 WebブラウザーからフローティングIPに接続すると、Etherpad-Liteが利用できます。
 次のコマンドでコンテナを停止・破棄しておきます。
# doc...
OpenStack&Docker活用テクニック
32
OpenStack&Docker活用テクニック 32
ハンズオン③ イメージのアップロード
33
OpenStack&Docker活用テクニック
プライベートレジストリーへのアップロード
 先ほど作成したコンテナイメージを環境内に用意してあるプライベートレジストリーに
アップロードします。
– アップロードするイメージに対して、レジ...
34
OpenStack&Docker活用テクニック
(参考)プライベートレジストリーの検索
 プライベートレジストリーの検索やアップロードイメージの削除は、次のコマンドで行い
ます。
– イメージの検索、および、タグを確認する例です。
– ...
OpenStack&Docker活用テクニック
35
OpenStack&Docker活用テクニック 35
ハンズオン④ 複数VMの連携
36
OpenStack&Docker活用テクニック
構築する環境の全体像
永続データ
領域
OS領域
コンテナ
(MySQL)
/data
コンテナ
イメージ
Dockerデーモン
/var/lib/mysql
フローティングIP
OS領域
...
37
OpenStack&Docker活用テクニック
イメージ作成用インスタンスの起動
– 次を用いてインスタンスを起動します。
• インスタンス名「eplite」
• フレーバー「m1.small」
• イメージ「Docker01」
• イン...
38
OpenStack&Docker活用テクニック
MySQLコンテナの起動
 1つ目のインスタンス「eplite-1」にログインして、Cinderボリュームをマウントします。
– ログインユーザーは「centos」を使用します。
• 最後...
39
OpenStack&Docker活用テクニック
MySQLコンテナの起動
 コンテナの稼動状態を確認します。
– コンテナ内でmysqldが稼働しています。
– ホストの /data 以下にMySQLのテーブルデータが保存されています。...
40
OpenStack&Docker活用テクニック
EP-Liteコンテナの起動
 2つ目のインスタンス「eplite-2」にログインして、コンテナを起動します。
– ログインユーザーは「centos」を使用します。
• 「student-...
41
OpenStack&Docker活用テクニック
EP-Liteコンテナの起動
 コンテナの稼動状態を確認します。
– コンテナ内でnginxとnode.jsが稼働しています。
# docker ps
CONTAINER ID IMAGE...
42
OpenStack&Docker活用テクニック
動作確認と仮想マシンインスタンスの停止
 Webブラウザーから2つ目のインスタンスのフローティングIPに接続すると、Etherpad-
Liteが利用できます。
 仮想マシンインスタンス...
OpenStack&Docker活用テクニック
43
OpenStack&Docker活用テクニック 43
ハンズオン⑤ Userdataによる自動化
44
OpenStack&Docker活用テクニック
Userdata(カスタマイズスクリプト)による自動化
 インスタンス起動時にUserdata(カスタマイズスクリプト)として、シェルスクリプトを
受け渡すと、ゲストOS起動後に自動的に実...
45
OpenStack&Docker活用テクニック
カスタマイズスクリプトを用いてインスタンスを起動
 カスタマイズスクリプトを用意します。
– 未使用のフローティングIPを確認して、下記のスクリプトを用意します。
• 「student-x...
46
OpenStack&Docker活用テクニック
カスタマイズスクリプトの実行ログ確認
 インスタンスのコンソールログから、cloud-intの処理が完了するのを確認します。
– コンテナイメージのダウンロードのログが出力されはじめて、数...
47
OpenStack&Docker活用テクニック
動作確認
 カスタマイズスクリプトに記載したフローティングIPをインスタンスに割り当てて、Web
ブラウザーからフローティングIPに接続すると、Etherpad-Liteが利用できます。
OpenStack&Docker活用テクニック
48
OpenStack&Docker活用テクニック 48
後片付け(次の演習に向けて)
49
OpenStack&Docker活用テクニック
仮想マシンインスタンスの削除とフローティングIPの解放
 不要な仮想マシンインスタンスを
削除して、未使用のフローティン
グIPを開放しておきます。
– インスタンスの管理画面で「step...
OpenStack&Docker活用テクニック
50
OpenStack&Docker活用テクニック 50
参考資料
51
OpenStack&Docker活用テクニック
参考資料
 Docker実践入門 ― Linuxコンテナ技術の基礎から応用まで
– 中井悦司(著)技術評論社
 OpenStackクラウドインテグレーション ― オープンソースクラウドに...
openstackOpen source software to build public and private clouds.
Próxima SlideShare
Cargando en…5
×

OpenStackをさらに”使う”技術 - OpenStack&Docker活用テクニック

6.927 visualizaciones

Publicado el

Okinawa OpenDays 2015 のハンズオンセミナーで使用する予定の資料です。
http://www.okinawaopenlabs.org/ood2015_9#14_1

2015/12/08 ver1.0 公開
2015/12/10 ver1.1 手順説明追加

Publicado en: Tecnología
  • Sé el primero en comentar

OpenStackをさらに”使う”技術 - OpenStack&Docker活用テクニック

  1. 1. OpenStackをさらに”使う”技術 Docker/Ansible編 パート2 OpenStack&Docker活用テクニック 中井悦司 openstackOpen source software to build public and private clouds. 2015/12/10 ver1.1
  2. 2. 2 OpenStack&Docker活用テクニック 自己紹介  中井悦司(なかいえつじ) – Twitter @enakai00  日々の仕事 – Senior Solution Architect and Cloud Evangelist at Red Hat K.K. 企業システムでオープンソースの活用を希望される お客様を全力でご支援させていただきます。  昔とった杵柄 – 素粒子論の研究(超弦理論とか) – 予備校講師(物理担当) – インフラエンジニア(Unix/Linux専門) 好評発売中!
  3. 3. 3 OpenStack&Docker活用テクニック Contents  Dockerの概要  OpenStackとDockerの組み合わせ  ハンズオン① コンテナイメージ作成  ハンズオン② イメージの動作確認  ハンズオン③ イメージのアップロード  ハンズオン④ 複数VMの連携  ハンズオン⑤ Userdataによる自動化  後片付け(次の演習に向けて)  参考資料
  4. 4. OpenStack&Docker活用テクニック 4 4 Dockerの概要
  5. 5. 5 OpenStack&Docker活用テクニック Dockerが提供する基本機能 Dockerfile ① Dockerイメージを自動作成 OSイメージ アプリケーション ライブラリー アプリケーション フレームワーク イメージの 作成手順を記載 Docker イメージ OS上にインストール可能な ものはすべてイメージ化可能 ② Dockerイメージを保存・公開 ③ Dockerサーバーに  イメージを配布・実行
  6. 6. 6 OpenStack&Docker活用テクニック Linuxコンテナの仕組み コンテナ 物理サーバー/仮想マシン Linuxカーネル アプリケーション アプリケーション ・・・ 物理サーバー/仮想マシン Linuxカーネル ・・・ コンテナ 通常のLinux環境 コンテナで分割した環境 コンテナごとに 見える環境が異なる すべてのアプリケーション から同じ環境が見える  「Linuxコンテナ」は、プロセスグループごとに独立したOS環境を見せる技術 – ローカルディスクの内容(ディレクトリー内のファイル) – ネットワーク環境(NIC、IPアドレス) – CPU、メモリー割り当て ※ Dockerよりもずっと古くから存在する技術です。 アプリケーション アプリケーション
  7. 7. 7 OpenStack&Docker活用テクニック Dockerとコンテナの関係 コンテナ アプリケーション ディレクトリーツリー Linux上にマウント ルートディレクトリー として割り当て  「Dockerイメージ」の実体は、コンテナに割 り当てるディスクイメージに、ネットワーク 設定などの環境情報を付与したものにすぎま せん。  Dockerの真の価値は、次のような「イメージ 管理機能」にあります。 – Dockerfile: Dockerイメージを自動作成する仕組み – Docker Hub: Dockerイメージを共有・配布する仕組み Dockerイメージ
  8. 8. 8 OpenStack&Docker活用テクニック フレームワーク データベース アプリケーション フレームワーク ライブラリー Dockerイメージを 本番環境に展開!  テストが実施された「確実動くアプリケーション」をそのままDockerイメージに 固めて、本番環境に自動デプロイするという運用を想像してみましょう・・・。 サービス環境へのDocker適用のメリット
  9. 9. 9 OpenStack&Docker活用テクニック Immutable Infrastructureとは? – アプリケーションの設定変更、バージョンアップなどは、稼働中の本番環境を いじるのではなく、大元のコードを変更して再テストした後に、本番環境を新 規構築してそっくり置き換えるという運用手法。 – 運用中の環境変更するリスク(想定外の不具合)を回避して、常にテスト済み の環境を本番提供可能に。 – 同一構成のサーバーを大量に並べるスケールアウト環境で、多数のサーバーの 構成を常に同一に保ち続ける。  Dockerイメージによる自動デプロイにより、これまで実現困難と言われていた 「Immutable Infrastructre」がついに実現可能になります。 Dockerによる自動デプロイのメリット 「Immutable Infrastructre」を実現して 構成管理を容易に!
  10. 10. 10 OpenStack&Docker活用テクニック  コンテナは、起動(run)、停止(stop)、再開(start)、保存(commit)、削除(rm) などの操作が実施できます。 – コンテナ起動時は指定イメージのスナップショットを自動作成します。 – コンテナを削除すると、使用中のイメージは破棄されます。(イメージ内の保存データは失われま す。) コンテナのライフサイクル 保存イメージ スナップ ショット コンテナ起動時に スナップショットを作成 × run commit rm プロセス スナップ ショット stop start 保存イメージ コンテナを停止するとプロセスが停止 (コンテナイメージは残っている) コンテナを削除すると コンテナイメージを破棄 コンテナイメージを複製して 保存イメージとして登録
  11. 11. OpenStack&Docker活用テクニック 11 11 OpenStackとDockerの組み合わせ
  12. 12. 12 OpenStack&Docker活用テクニック OpenStackによる自動化(オーケストレーション)手法  Dockerが無かった時代は・・・ – 仮想マシン、ストレージ、ネットワークなどのインフラは、OpenStackで自動構成 – ゲストOS上のアプリはChef/Ansible/Puppetなどの構成管理ツールで自動構成  ゲストOSとアプリの管理が別れているため「Immutable」な運用が困難! – ゲストOSのテンプレートはOpenStack側で管理 – 仮想マシン起動時に動的にアプリの導入・設定を実施 「第14章 Dockerを利用したアプリケーション展開」より引用 ゲストOSの変更に起因する アプリ導入の失敗が発生
  13. 13. 13 OpenStack&Docker活用テクニック OpenStackとDockerの組み合わせ手法  Dockerを用いた運用だと・・・ – OpenStackは、「インフラ+DockerホストOS」の提供に専念 – アプリの実行環境は、Dockerイメージで作成・管理・デプロイ  インフラとアプリの管理を分離することで「Immutable」な運用が容易に! – ゲストOSのテンプレートはDockerの稼働環境を提供 – 事前作成済みのDockerイメージを配布してアプリを起動 「第14章 Dockerを利用したアプリケーション展開」より引用 アプリの導入・管理を OpenStackから分離可能
  14. 14. 14 OpenStack&Docker活用テクニック Docker用仮想マシンの構成例 永続データ 領域 OS領域Docker導入済み VMテンプレート ホストLinuxの /dataにマウント 仮想マシン ブロックボリューム コンテナ (アプリケーション) /data コンテナ イメージ Dockerデーモン ゲストOS (ホストLinux) /var/lib/mysql 永続データは特定の ディレクトリに保存 Dockerで管理 OpenStackで管理
  15. 15. 15 OpenStack&Docker活用テクニック MySQLにアクセスするコンテナの構成例 永続データ 領域 OS領域 コンテナ (MySQL) /data コンテナ イメージ Dockerデーモン /var/lib/mysql フローティングIP OS領域 コンテナ (node.jsアプリ) コンテナ イメージ Dockerデーモン フローティングIP フローティングIPにアクセス フローティングIPにアクセス 接続先DBのIP/ポートは 環境変数で参照
  16. 16. 16 OpenStack&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 ポート フォワー ディング フローティングIP
  17. 17. OpenStack&Docker活用テクニック 17 17 ハンズオン① コンテナイメージ作成
  18. 18. 18 OpenStack&Docker活用テクニック セキュリティグループの作成  Etherpad-Liteの利用に必要なセキュリティグループを作成します。 – 次の手順で、以下の接続を許可したセキュリティグループ「eplite」を作成します。 • SSH(TCP22番)、HTTP(TCP80番)、MySQL(TCP3306番) – 「アクセスとセキュリティー」の画面で、「セキュリティグループの作成」から、名前 「eplite」でセキュリティグループを作成します。 – 作成された「eplite」の「ルールの管理」から管理画面を表示した後、「ルールの追加」を押して、 ルール「SSH」を追加します。 – 再度、「ルールの追加」を押して、同様に、ルール「HTTP」とルール「MYSQL」を追加します。
  19. 19. 19 OpenStack&Docker活用テクニック イメージ作成用インスタンスの起動 – 次を用いてインスタンスを起動します。 • インスタンス名「docker01」 • フレーバー「m1.small」 • イメージ「Docker01」 • セキュリティグループ「eplite」 – インスタンスにフローティングIPを割り当 てておきます。  Dockerをインストール済みのVMイメージからインスタンスを起動します。
  20. 20. 20 OpenStack&Docker活用テクニック イメージ作成用インスタンスの起動  起動したインスタンスにログインして、Dockerの稼働を確認します。 – ログインユーザーは「centos」を使用します。 $ ssh centos@192.168.253.18 Last login: Fri Dec 4 05:54:00 2015 from 192.168.251.36 $ sudo -i # docker info Containers: 1 Images: 13 Storage Driver: devicemapper Pool Name: docker-253:1-33559298-pool Pool Blocksize: 65.54 kB Backing Filesystem: xfs Data file: /dev/loop0 Metadata file: /dev/loop1 Data Space Used: 2.249 GB Data Space Total: 107.4 GB Data Space Available: 18.01 GB Metadata Space Used: 2.163 MB Metadata Space Total: 2.147 GB Metadata Space Available: 2.145 GB Udev Sync Supported: true Deferred Removal Enabled: false Data loop file: /var/lib/docker/devicemapper/devicemapper/data Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.93-RHEL7 (2015-01-28) Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 3.10.0-229.20.1.el7.x86_64 Operating System: CentOS Linux 7 (Core) CPUs: 1 Total Memory: 1.797 GiB Name: docker01 ID: APIU:AY72:ELLU:WBVM:AFRL:2NPW:KM46:5OZF:CH7K:AS5Q:5GJ3:JG7A
  21. 21. 21 OpenStack&Docker活用テクニック (参考)VMイメージの作成手順  VMイメージ「Docker01」は次の手順で作成してあります。 – CentOS7のVMイメージからインスタンスを起動して、dockerのRPMパッケージを導入します。 – Dockerの設定ファイル/etc/sysconfig/dockerに下記のオプションをセットします。 – docker.serviceを起動して、ローカルのイメージ保存領域を初期化しておきます。 – docker-storage-setup.serviceをmaskで完全無効化します。(これは、Userdataの実行前に docker.serviceを起動させるために必要となります。) – インスタンスを停止して、インスタンスのスナップショットを取得します。 # yum -y update # yum -y install docker OPTIONS='--selinux-enabled --storage-opt dm.no_warn_on_loop_devices=true' INSECURE_REGISTRY='--insecure-registry 192.168.253.13:5000' # systemctl enable docker.service # systemctl start docker.service 本環境に用意してあるプライベート レジストリーを使用するための設定 # systemctl mask docker-storage-setup.service ハンズオンでは、この作業は 実施する必要はありません。
  22. 22. 22 OpenStack&Docker活用テクニック MySQLのコンテナイメージ作成  Dockerfileを用いて、MySQLのコンテナイメージを作成します。 – Dockerfile一式をダウンロードして展開します。 – MySQLイメージ作成用のDockerfileを開いて、下記の部分を編集します。 – Dockerfileを用いてコンテナイメージを作成します。 # yum -y install git # cd ~ # git clone https://github.com/enakai00/docker_eplite # cd docker_eplite/build_epmysql # vi Dockerfile FROM 192.168.253.13:5000/library/centos:6.7 MAINTAINER Docker Tarou RUN yum -y install mysql-server ADD init.sh /usr/local/bin/init.sh RUN chmod u+x /usr/local/bin/init.sh EXPOSE 3306 CMD ["/usr/local/bin/init.sh"] CentOS6.7のイメージを本環境の プライベートレジストリーから取得 あなたの名前(任意)を記載します。 # docker build -t epmysql:ver1.0 ./ ...(完成までしばらく待ちます)... # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE epmysql ver1.0 81700756f51a 11 minutes ago 339.3 MB 192.168.253.13:5000/library/centos 6.7 3fba1048142f 7 weeks ago 190.6 MB
  23. 23. 23 OpenStack&Docker活用テクニック EP-Liteのコンテナイメージ作成  Dockerfileを用いて、EP-Liteのコンテナイメージを作成します。 – EP-Liteイメージ作成用のDockerfileを開いて、下記の部分を編集します。 – Dockerfileを用いてコンテナイメージを作成します。 # cd ~/docker_eplite/build_eplite # vi Dockerfile FROM 192.168.253.13:5000/library/centos:6.7 MAINTAINER Docker Tarou ADD setup.sh /usr/local/bin/setup.sh RUN chmod u+x /usr/local/bin/setup.sh RUN /usr/local/bin/setup.sh ADD settings.json /opt/etherpad/etherpad-lite/settings.json ADD eplite.conf /etc/nginx/conf.d/eplite.conf ADD etherpad-lite /etc/init.d/etherpad-lite RUN chmod 755 /etc/init.d/etherpad-lite ADD init.sh /usr/local/bin/init.sh RUN chmod u+x /usr/local/bin/init.sh CMD ["/usr/local/bin/init.sh"] CentOS6.7のイメージを本環境の プライベートレジストリーから取得 あなたの名前(任意)を記載します。 # docker build -t eplite:ver1.0 ./ ...(完成までしばらく待ちます)... # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE epmysql ver1.0 81700756f51a 50 minutes ago 339.3 MB eplite ver1.0 c48a3b84249b 11 minutes ago 729.1 MB 192.168.253.13:5000/library/centos 6.7 3fba1048142f 7 weeks ago 190.6 MB
  24. 24. 24 OpenStack&Docker活用テクニック (参考)Dockerfileの処理内容:MySQLイメージ #!/bin/bash service mysqld start if [[ ! -f ~/.trap_in_bashrc ]]; then cat <<EOF >>~/.bashrc trap 'service mysqld stop; exit 0' TERM EOF touch ~/.trap_in_bashrc fi if [[ ! -d /var/lib/mysql/epdb ]]; then mysqladmin -u root password 'password' cat << EOF > /tmp/sql.txt DELETE FROM mysql.user WHERE user = '' OR ( user = 'root' AND host != 'localhost' ); FLUSH PRIVILEGES; CREATE DATABASE epdb CHARACTER SET utf8; GRANT ALL PRIVILEGES ON epdb.* TO 'epuser'@'%' IDENTIFIED BY 'eppasswd'; FLUSH PRIVILEGES; SELECT user, password, host FROM mysql.user; EOF mysql -uroot -ppassword < /tmp/sql.txt fi exec /bin/bash FROM centos:6.7 MAINTAINER Etsuji Nakai RUN yum -y install mysql-server ADD init.sh /usr/local/bin/init.sh RUN chmod u+x /usr/local/bin/init.sh EXPOSE 3306 CMD ["/usr/local/bin/init.sh"] Dockerfile init.sh MySQLをインストールして、 起動スクリプト init.sh をイメージ内にコピー MySQLを起動 コンテナ停止時のMySQL停止処理を設定 データベース「epdb」が存在しなければ、作成して初期化する bashを起動 init.shを起動スクリプトに指定
  25. 25. 25 OpenStack&Docker活用テクニック (参考)Dockerfileの処理内容:Etherpad-Liteイメージ #!/bin/bash -x sed -i "s/__FIP__/${FIP}/" /etc/nginx/conf.d/eplite.conf sed -i "s/__DBIP__/${DB_PORT_3306_TCP_ADDR}/" /opt/etherpad/etherpad-lite/settings.json service etherpad-lite start service nginx start if [[ ! -f ~/.trap_in_bashrc ]]; then cat <<EOF >>~/.bashrc trap 'service nginx stop; service etherpad-lite stop; exit 0' TERM EOF touch ~/.trap_in_bashrc fi exec /bin/bash FROM centos:6.7 MAINTAINER Etsuji Nakai ADD setup.sh /usr/local/bin/setup.sh RUN chmod u+x /usr/local/bin/setup.sh RUN /usr/local/bin/setup.sh ADD settings.json /opt/etherpad/etherpad-lite/settings.json ADD eplite.conf /etc/nginx/conf.d/eplite.conf ADD etherpad-lite /etc/init.d/etherpad-lite RUN chmod 755 /etc/init.d/etherpad-lite ADD init.sh /usr/local/bin/init.sh RUN chmod u+x /usr/local/bin/init.sh CMD ["/usr/local/bin/init.sh"] Dockerfile 各種設定ファイルの雛形とEtherpad-Lite 起動スクリプトをイメージ内にコピー Etherpad-Liteのインストールスクリプトを イメージ内にコピーして実行 コンテナ停止時の アプリケーション停止処理を設定 Etherpad-Liteとnginxを起動 bashを起動 init.shをイメージ内にコピーして 起動スクリプトに指定 init.sh 各種設定ファイル内の パラメータを環境変数から設定 FIP : Etherpad-LiteのIPアドレス DB_PORT_3306_TCP_ADDR : MySQLのIPアドレス
  26. 26. OpenStack&Docker活用テクニック 26 OpenStack&Docker活用テクニック 26 ハンズオン② イメージの動作確認
  27. 27. 27 OpenStack&Docker活用テクニック 動作確認方法  先ほどコンテナイメージを作成したホストLinux上で、MySQLとEP-Liteのそれぞれのコン テナをまとめて起動して動作確認します。 – EP-LiteにはフローティングIPで接続します。 – EP-LiteからMySQLは、ホストLinux上の内部ネットワーク経由で接続します。 – MySQLのテーブル領域は、コンテナイメージ内に用意します。(永続保存はしません。) コンテナ ホストLinux TCP 80 TCP 80 フローティングIP EP-Lite コンテナ MySQL TCP 3306
  28. 28. 28 OpenStack&Docker活用テクニック MySQLをコンテナで起動  MySQLのコンテナを起動します。 – 次のコマンドでローカルイメージを指定してコンテナを起動します。 – 次のコマンドでコンテナの稼動状態を確認します。 # docker run -itd --name epmysql --expose 3306 epmysql:ver1.0 同じホストのコンテナから 3306番ポートへの接続を許可 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 67fb2201191a epmysql:ver1.0 "/usr/local/bin/init." 7 seconds ago Up 5 seconds 3306/tcp epmysql # docker top epmysql | unexpand -t20 UID PID PPID C STIME TTY TIME CMD root 25818 3557 0 08:38 pts/1 00:00:00 /bin/bash root 25915 25818 0 08:38 pts/1 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid- file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql 27 26017 25915 0 08:38 pts/1 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid- file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
  29. 29. 29 OpenStack&Docker活用テクニック EP-Liteをコンテナで起動  EP-LiteLのコンテナを起動します。 – 次のコマンドでローカルイメージを指定してコンテナを起動します。 • 「FIP=192.168.253.17」の部分は、このインスタンスのフローティングIPを指定します。 – 次のコマンドでコンテナの稼動状態を確認します。 # docker run -itd --name eplite -p 80:80 -e FIP=192.168.253.17 --link epmysql:db eplite:ver1.0 ホストの80番ポートへのアクセスを コンテナ内の80番ポートに転送 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f1cb2952c0d0 eplite:ver1.0 "/usr/local/bin/init." 6 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp eplite 67fb2201191a epmysql:ver1.0 "/usr/local/bin/init." 13 minutes ago Up 13 minutes 3306/tcp epmysql # docker top eplite | unexpand -t20 UID PID PPID C STIME TTY TIME CMD root 26183 3557 0 08:52 pts/2 00:00:00 /bin/bash 500 26216 26183 18 08:52 ? 00:00:02 /usr/bin/node node_modules/ep_etherpad-lite/node/server.js root 26238 26183 0 08:52 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 499 26241 26238 0 08:52 ? 00:00:00 nginx: worker process nginxの設定に必要な環境変数 (外部からのアクセス先IP)を指定 MySQLのコンテナのIPアドレスを 環境変数に設定(次ページ参照)
  30. 30. 30 OpenStack&Docker活用テクニック (参考)コンテナ起動時の環境変数の設定  EP-Liteのコンテナでは、コンテナ起動時に実行するスクリプト「init.sh」の中で、環境変 数を使って、次の2つのパラメーターを設定しています。 – FIP : nginx の設定ファイルに、外部クライントがアクセスしてくるIPアドレスを記載 – DB_PORT_3306_TCP_ADDR : node.jsの設定ファイルに、MySQLの接続先IPアドレスを記載  これらの環境変数は、コンテナ起動時の次のオプションで設定しています。 – 「-e FIP=192.168.253.17」: 環境変数を明示的に指定するオプションです。 – 「--link epmysql:db」: コンテナ「epmysql」のexpose指定されたポート(今の場合は、3306)に 到達可能な内部IPアドレスを環境変数「DB_PORT_3306_TCP_ADDR」に自動設定します。 sed -i "s/__FIP__/${FIP}/" /etc/nginx/conf.d/eplite.conf sed -i "s/__DBIP__/${DB_PORT_3306_TCP_ADDR}/" /opt/etherpad/etherpad-lite/settings.json
  31. 31. 31 OpenStack&Docker活用テクニック 動作確認とコンテナの停止  WebブラウザーからフローティングIPに接続すると、Etherpad-Liteが利用できます。  次のコマンドでコンテナを停止・破棄しておきます。 # docker stop eplite epmysql # docker rm eplite epmysql
  32. 32. OpenStack&Docker活用テクニック 32 OpenStack&Docker活用テクニック 32 ハンズオン③ イメージのアップロード
  33. 33. 33 OpenStack&Docker活用テクニック プライベートレジストリーへのアップロード  先ほど作成したコンテナイメージを環境内に用意してあるプライベートレジストリーに アップロードします。 – アップロードするイメージに対して、レジストリーの「IPアドレス:ポート番号」を付与したイメー ジ名を付けます。演習環境では、「192.168.253.13:5000」になります。 • 「student-xxx」の部分は、各自のユーザー番号(「student-001」など)を指定します。 – レジストリー情報を付与したイメージ名を指定してアップロードします。 # docker tag epmysql:ver1.0 192.168.253.13:5000/student-xxx/epmysql:ver1.0 # docker tag eplite:ver1.0 192.168.253.13:5000/student-xxx/eplite:ver1.0 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 192.168.253.13:5000/student-xxx/epmysql ver1.0 81700756f51a About an hour ago 339.3 MB epmysql ver1.0 81700756f51a About an hour ago 339.3 MB 192.168.253.13:5000/student-xxx/eplite ver1.0 c48a3b84249b 4 hours ago 729.1 MB eplite ver1.0 c48a3b84249b 4 hours ago 729.1 MB docker.io/centos 6.7 3fba1048142f 7 weeks ago 190.6 MB # docker push 192.168.253.13:5000/student-xxx/epmysql # docker push 192.168.253.13:5000/student-xxx/eplite
  34. 34. 34 OpenStack&Docker活用テクニック (参考)プライベートレジストリーの検索  プライベートレジストリーの検索やアップロードイメージの削除は、次のコマンドで行い ます。 – イメージの検索、および、タグを確認する例です。 – アップロードしたイメージを削除する例です。(誤って実行しないように注意してください。) # docker search 192.168.253.13:5000/student-xxx INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED 192.168.253.13 192.168.253.13:5000/student-xxx/eplite 0 192.168.253.13 192.168.253.13:5000/student-xxx/epmysql 0 # curl -s http://192.168.253.13:5000/v1/repositories/student-xxx/eplite/tags | python -mjson.tool { "ver1.0": "c48a3b84249b6f7a4e160bb880da1480ae5e9b0e1c2464a78c4b8910199894a9" } # curl -LX DELETE http://192.168.253.13:5000/v1/repositories/student-xxx/epmysql
  35. 35. OpenStack&Docker活用テクニック 35 OpenStack&Docker活用テクニック 35 ハンズオン④ 複数VMの連携
  36. 36. 36 OpenStack&Docker活用テクニック 構築する環境の全体像 永続データ 領域 OS領域 コンテナ (MySQL) /data コンテナ イメージ Dockerデーモン /var/lib/mysql フローティングIP OS領域 コンテナ (EP-Lite) コンテナ イメージ Dockerデーモン フローティングIP フローティングIPにアクセス フローティングIPにアクセス
  37. 37. 37 OpenStack&Docker活用テクニック イメージ作成用インスタンスの起動 – 次を用いてインスタンスを起動します。 • インスタンス名「eplite」 • フレーバー「m1.small」 • イメージ「Docker01」 • インスタンス数「2」 • セキュリティグループ「eplite」 – それぞれのインスタンスにフローティング IPを割り当てておきます。 – 1GBのCinderボリュームを作成して、1つ 目のインスタンス「eplite-1」に接続しま す。  Dockerをインストール済みのイメージからインスタンスを2個起動します。
  38. 38. 38 OpenStack&Docker活用テクニック MySQLコンテナの起動  1つ目のインスタンス「eplite-1」にログインして、Cinderボリュームをマウントします。 – ログインユーザーは「centos」を使用します。 • 最後のchconコマンドは、SELinuxでコンテナ内部からのアクセスを許可するために必要です。  プライベートレジストリーのイメージを指定して、コンテナを起動します。 • 「student-xxx」の部分は、各自のユーザー番号(「student-001」など)を指定します。 – 各オプションの意味は次のとおりです。 • -p 3306:3306 : ホストの3306番ポートへのアクセスをコンテナ内の3306番ポートに転送 • -v /data:/var/lib/mysql : ホストの /data をコンテナ内の /var/lib/mysql にマッピング $ ssh centos@192.168.253.18 Last login: Fri Dec 4 05:54:00 2015 from 192.168.251.36 $ sudo -i # mkfs.xfs /dev/vdb # mkdir /data # mount /dev/vdb /data # chcon -Rt svirt_sandbox_file_t /data # docker run -itd --name epmysql -p 3306:3306 -v /data:/var/lib/mysql 192.168.253.13:5000/student-xxx/epmysql:ver1.0
  39. 39. 39 OpenStack&Docker活用テクニック MySQLコンテナの起動  コンテナの稼動状態を確認します。 – コンテナ内でmysqldが稼働しています。 – ホストの /data 以下にMySQLのテーブルデータが保存されています。 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5c889e0ca142 192.168.253.13:5000/enakai/epmysql:ver1.0 "/usr/local/bin/init." 6 minutes ago Up 6 minutes 0.0.0.0:3306->3306/tcp epmysql # docker top epmysql | unexpand -t20 UID PID PPID C STIME TTY TIME CMD root 19164 3590 0 10:04 pts/1 00:00:00 /bin/bash root 19260 19164 0 10:04 pts/1 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid- file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql 27 19362 19260 0 10:04 pts/1 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid- file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock # ls /data epdb ib_logfile0 ib_logfile1 ibdata1 mysql mysql.sock test
  40. 40. 40 OpenStack&Docker活用テクニック EP-Liteコンテナの起動  2つ目のインスタンス「eplite-2」にログインして、コンテナを起動します。 – ログインユーザーは「centos」を使用します。 • 「student-xxx」の部分は、各自のユーザー番号(「student-001」など)を指定します。 – 各オプションの意味は次のとおりです。 • -p 80:80 : ホストの80番ポートへのアクセスをコンテナ内の80番ポートに転送 • -e FIP=192.168.253.19 : 外部からアクセスするIPアドレス(つまり、このインスタンスのフ ローティングIP)を指定します。環境に応じて、値を変更してください。 • -e DB_PORT_3306_TCP_ADDR=192.168.253.18 : MySQLに接続するIPアドレス(つまり、1 つ目のインスタンスのフローティングIP)を指定します。環境に応じて、値を変更してくださ い。 $ ssh centos@192.168.253.18 Last login: Fri Dec 4 05:54:00 2015 from 192.168.251.36 $ sudo -i # docker run -itd -p 80:80 -e FIP=192.168.253.19 -e DB_PORT_3306_TCP_ADDR=192.168.253.18 --name eplite 192.168.253.13:5000/student-xxx/eplite:ver1.0
  41. 41. 41 OpenStack&Docker活用テクニック EP-Liteコンテナの起動  コンテナの稼動状態を確認します。 – コンテナ内でnginxとnode.jsが稼働しています。 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 279515d8f5a3 192.168.253.13:5000/enakai/eplite:ver1.0 "/usr/local/bin/init." 5 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp eplite # docker top eplite | unexpand -t20 UID PID PPID C STIME TTY TIME CMD root 19046 3590 0 10:19 pts/1 00:00:00 /bin/bash 500 19078 19046 9 10:19 ? 00:00:01 /usr/bin/node node_modules/ep_etherpad-lite/node/server.js root 19100 19046 0 10:19 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 499 19103 19100 0 10:19 ? 00:00:00 nginx: worker process
  42. 42. 42 OpenStack&Docker活用テクニック 動作確認と仮想マシンインスタンスの停止  Webブラウザーから2つ目のインスタンスのフローティングIPに接続すると、Etherpad- Liteが利用できます。  仮想マシンインスタンス「eplite-1」「eplite-2」は、ここで削除しておきます。
  43. 43. OpenStack&Docker活用テクニック 43 OpenStack&Docker活用テクニック 43 ハンズオン⑤ Userdataによる自動化
  44. 44. 44 OpenStack&Docker活用テクニック Userdata(カスタマイズスクリプト)による自動化  インスタンス起動時にUserdata(カスタマイズスクリプト)として、シェルスクリプトを 受け渡すと、ゲストOS起動後に自動的に実行されます。 – ここでは、dockerコマンドでMySQLとEtherpad-Liteのコンテナを起動して、インスタンスの起動 とアプリケーションの実行をまとめて自動化します。 コンテナイメージ カスタマイズスクリプト コンテナ VMインスタンス TCP 80 TCP 80 フローティングIP EP-Lite コンテナ MySQL TCP 3306 レジストリー Etherpad-Lite 利用者 Docker ① Dockerインストール済みの  イメージからVMを起動 ② カスタマイズスクリプトで   Dockerコマンドを実行 ③ アプリケーションイメージを    ダウンロードしてコンテナで起動
  45. 45. 45 OpenStack&Docker活用テクニック カスタマイズスクリプトを用いてインスタンスを起動  カスタマイズスクリプトを用意します。 – 未使用のフローティングIPを確認して、下記のスクリプトを用意します。 • 「student-xxx」の部分は、各自のユーザー番号(「student-001」など)を指定します。 • 「FIP=192.168.200.105」の部分は、確認したフローティングIPを指定します。 #!/bin/sh -x docker run -itd --name epmysql --expose 3306 192.168.253.13:5000/student-xxx/epmysql:ver1.0 sleep 5 docker run -itd --name eplite -p 80:80 -e FIP=192.168.200.105 --link epmysql:db 192.168.253.13:5000/student-xxx/eplite:ver1.0  カスタマイズスクリプトを用いて、イン スタンスを起動します。 – 次を用いてインスタンスを起動します。 • インスタンス名「eplite」 • フレーバー「m1.small」 • イメージ「Docker01」 • セキュリティグループ「eplite」 • 「作成後」のタブで、カスタマイズス クリプトに用意したスクリプトを入力
  46. 46. 46 OpenStack&Docker活用テクニック カスタマイズスクリプトの実行ログ確認  インスタンスのコンソールログから、cloud-intの処理が完了するのを確認します。 – コンテナイメージのダウンロードのログが出力されはじめて、数分後に下記のメッセージが出力さ れますので、それまでしばらく待ちます。 ec2: ############################################################# ec2: -----BEGIN SSH HOST KEY FINGERPRINTS----- ec2: 256 e0:20:2b:57:af:a5:85:e4:78:e4:a6:10:8a:fd:20:78 (ECDSA) ec2: 256 6d:15:2f:b8:be:d4:f5:d7:01:f2:7e:99:d6:33:e1:c5 (ED25519) ec2: 2048 74:67:47:2d:06:65:3f:66:66:5d:f9:78:9c:d3:68:78 (RSA) ec2: -----END SSH HOST KEY FINGERPRINTS----- ec2: ############################################################# -----BEGIN SSH HOST KEY KEYS----- ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBE4CSNSsMHMLb6xqSHOJlfcKhCa1Yz2 peSrXqINfivOvn31JxynqNQuXBiWM5BI3StZI/5H1kWAMU6UyptgrrwM= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHKGd6Z1pEmcpjNuoX3+d25JpQ0+P9AdxbvO+ZnT7cqy ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMqdEBPxn+pRwo3YtTYn9Nz1PwuQsrqfBJZ7ZFrujqEAQsOeavuUp UnTS1RjJkV1X7Rc0rSCmDnYOy4PLsqbZaD3kBwUtXtzORtrLbyC7nPKb2Iqx+0/mNwl3xzYg2vNZpyE4CSL koVShBInPjjaJD2515dfoNEM0+4Yy9cugK7WThchV7q6sz8w7EXWxLebu/ipLCoSlOBpsH1KN4zPBl0foI8 GlH3kuYSUCAS0JhLlEV776MvvFfM12fefNQ+5VHzjVlAdSjtI9OaPSff4KjJ8bAcLdmGMzSj3Ou0HjpuSGy J+crKjN/y2/twOxBtwL3GNCoUQViEpf2s0AJJBV3 -----END SSH HOST KEY KEYS----- cloud-init[3477]: Cloud-init v. 0.7.5 finished at Sun, 06 Dec 2015 10:39:42 +0000. Datasource DataSourceOpenStack [net,ver=2]. Up 392.05 seconds
  47. 47. 47 OpenStack&Docker活用テクニック 動作確認  カスタマイズスクリプトに記載したフローティングIPをインスタンスに割り当てて、Web ブラウザーからフローティングIPに接続すると、Etherpad-Liteが利用できます。
  48. 48. OpenStack&Docker活用テクニック 48 OpenStack&Docker活用テクニック 48 後片付け(次の演習に向けて)
  49. 49. 49 OpenStack&Docker活用テクニック 仮想マシンインスタンスの削除とフローティングIPの解放  不要な仮想マシンインスタンスを 削除して、未使用のフローティン グIPを開放しておきます。 – インスタンスの管理画面で「step- server」以外のインスタンスをすべ て削除します。 – アクセスとセキュリティーの管理画 面で「Floating IP」のタブから、未 使用(停止中)のフローティングIP をすべて解放します。
  50. 50. OpenStack&Docker活用テクニック 50 OpenStack&Docker活用テクニック 50 参考資料
  51. 51. 51 OpenStack&Docker活用テクニック 参考資料  Docker実践入門 ― Linuxコンテナ技術の基礎から応用まで – 中井悦司(著)技術評論社  OpenStackクラウドインテグレーション ― オープンソースクラウドによるサービス構築入門 – 日本OpenStackユーザ会(著)翔泳社  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
  52. 52. openstackOpen source software to build public and private clouds.

×