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

52
OpenStackをさらに”使う”技術 Docker/Ansible編 パート2 OpenStack&Docker活用テクニック 中井悦司 openstack Open source software to build public and private clouds. 2015/12/10 ver1.1

Upload: etsuji-nakai

Post on 12-Jan-2017

4.679 views

Category:

Technology


1 download

TRANSCRIPT

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

OpenStackをさらに”使う”技術Docker/Ansible編

パート2 OpenStack&Docker活用テクニック

中井悦司

openstackOpen source software to build public and private clouds.

2015/12/10 ver1.1

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

2

OpenStack&Docker活用テクニック

自己紹介

中井悦司(なかいえつじ)– Twitter @enakai00

日々の仕事– Senior Solution Architect and

Cloud Evangelist at Red Hat K.K.企業システムでオープンソースの活用を希望されるお客様を全力でご支援させていただきます。

昔とった杵柄– 素粒子論の研究(超弦理論とか)– 予備校講師(物理担当)– インフラエンジニア(Unix/Linux専門)

好評発売中!

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

3

OpenStack&Docker活用テクニック

Contents

Dockerの概要 OpenStackとDockerの組み合わせ ハンズオン① コンテナイメージ作成 ハンズオン② イメージの動作確認 ハンズオン③ イメージのアップロード ハンズオン④ 複数VMの連携 ハンズオン⑤ Userdataによる自動化 後片付け(次の演習に向けて) 参考資料

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

OpenStack&Docker活用テクニック

4

4

Dockerの概要

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

5

OpenStack&Docker活用テクニック

Dockerが提供する基本機能

Dockerfile

① Dockerイメージを自動作成

OSイメージ

アプリケーションライブラリー

アプリケーションフレームワーク

イメージの作成手順を記載

Dockerイメージ

OS上にインストール可能なものはすべてイメージ化可能

② Dockerイメージを保存・公開

③ Dockerサーバーに イメージを配布・実行

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

6

OpenStack&Docker活用テクニック

Linuxコンテナの仕組み

コンテナ

物理サーバー/仮想マシン

Linuxカーネル

アプ

リケ

ーシ

ョン

アプ

リケ

ーシ

ョン

・・・

物理サーバー/仮想マシン

Linuxカーネル

・・・

コンテナ

通常のLinux環境 コンテナで分割した環境

コンテナごとに見える環境が異なる

すべてのアプリケーションから同じ環境が見える

「Linuxコンテナ」は、プロセスグループごとに独立したOS環境を見せる技術– ローカルディスクの内容(ディレクトリー内のファイル)– ネットワーク環境(NIC、IPアドレス)– CPU、メモリー割り当て

※ Dockerよりもずっと古くから存在する技術です。

アプ

リケ

ーシ

ョン

アプ

リケ

ーシ

ョン

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

7

OpenStack&Docker活用テクニック

Dockerとコンテナの関係コンテナ

アプ

リケ

ーシ

ョン

ディレクトリーツリー

Linux上にマウント

ルートディレクトリーとして割り当て

「Dockerイメージ」の実体は、コンテナに割り当てるディスクイメージに、ネットワーク設定などの環境情報を付与したものにすぎません。

Dockerの真の価値は、次のような「イメージ管理機能」にあります。

– Dockerfile:Dockerイメージを自動作成する仕組み

– Docker Hub:Dockerイメージを共有・配布する仕組み

Dockerイメージ

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

8

OpenStack&Docker活用テクニック

フレームワーク

データベース

アプリケーションフレームワークライブラリー

Dockerイメージを本番環境に展開!

テストが実施された「確実動くアプリケーション」をそのままDockerイメージに固めて、本番環境に自動デプロイするという運用を想像してみましょう・・・。

サービス環境へのDocker適用のメリット

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

9

OpenStack&Docker活用テクニック

Immutable Infrastructureとは?

– アプリケーションの設定変更、バージョンアップなどは、稼働中の本番環境をいじるのではなく、大元のコードを変更して再テストした後に、本番環境を新規構築してそっくり置き換えるという運用手法。

–運用中の環境変更するリスク(想定外の不具合)を回避して、常にテスト済みの環境を本番提供可能に。

– 同一構成のサーバーを大量に並べるスケールアウト環境で、多数のサーバーの構成を常に同一に保ち続ける。

Dockerイメージによる自動デプロイにより、これまで実現困難と言われていた「Immutable Infrastructre」がついに実現可能になります。

Dockerによる自動デプロイのメリット

「Immutable Infrastructre」を実現して構成管理を容易に!

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

10

OpenStack&Docker活用テクニック

コンテナは、起動(run)、停止(stop)、再開(start)、保存(commit)、削除(rm)などの操作が実施できます。

– コンテナ起動時は指定イメージのスナップショットを自動作成します。– コンテナを削除すると、使用中のイメージは破棄されます。(イメージ内の保存データは失われま

す。)

コンテナのライフサイクル

保存イメージ スナップショット

コンテナ起動時にスナップショットを作成

×run

commit

rm

プロセス

スナップショット

stop

start

保存イメージ

コンテナを停止するとプロセスが停止(コンテナイメージは残っている)

コンテナを削除するとコンテナイメージを破棄

コンテナイメージを複製して保存イメージとして登録

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

OpenStack&Docker活用テクニック

11

11

OpenStackとDockerの組み合わせ

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

12

OpenStack&Docker活用テクニック

OpenStackによる自動化(オーケストレーション)手法

Dockerが無かった時代は・・・– 仮想マシン、ストレージ、ネットワークなどのインフラは、OpenStackで自動構成– ゲストOS上のアプリはChef/Ansible/Puppetなどの構成管理ツールで自動構成

ゲストOSとアプリの管理が別れているため「Immutable」な運用が困難!– ゲストOSのテンプレートはOpenStack側で管理– 仮想マシン起動時に動的にアプリの導入・設定を実施

「第14章 Dockerを利用したアプリケーション展開」より引用

ゲストOSの変更に起因するアプリ導入の失敗が発生

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

13

OpenStack&Docker活用テクニック

OpenStackとDockerの組み合わせ手法

Dockerを用いた運用だと・・・– OpenStackは、「インフラ+DockerホストOS」の提供に専念– アプリの実行環境は、Dockerイメージで作成・管理・デプロイ

インフラとアプリの管理を分離することで「Immutable」な運用が容易に!– ゲストOSのテンプレートはDockerの稼働環境を提供– 事前作成済みのDockerイメージを配布してアプリを起動

「第14章 Dockerを利用したアプリケーション展開」より引用

アプリの導入・管理をOpenStackから分離可能

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

14

OpenStack&Docker活用テクニック

Docker用仮想マシンの構成例

永続データ領域

OS領域Docker導入済みVMテンプレート

ホストLinuxの/dataにマウント

仮想マシン

ブロックボリューム

コンテナ(アプリケーション)

/data

コンテナイメージ

Dockerデーモン

ゲストOS(ホストLinux)

/var/lib/mysql

永続データは特定のディレクトリに保存

Dockerで管理

OpenStackで管理

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

15

OpenStack&Docker活用テクニック

MySQLにアクセスするコンテナの構成例

永続データ領域

OS領域

コンテナ(MySQL)

/data

コンテナイメージ

Dockerデーモン

/var/lib/mysql

フローティングIP

OS領域

コンテナ(node.jsアプリ)

コンテナイメージ

Dockerデーモン

フローティングIP フローティングIPにアクセス

フローティングIPにアクセス

接続先DBのIP/ポートは環境変数で参照

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

16

OpenStack&Docker活用テクニック

コンテナ

コンテナへのネットワーク接続経路

それぞれのコンテナには独立した仮想NICとプライベートIPアドレスが割り当てられて、ホストLinuxの仮想ブリッジ(docker0)に接続します。

– IPアドレスは自動で割り当てられますが、他のコンテナーからは環境変数で参照できるように設定が可能です。

外部ネットワークからアクセスする際は、ホストLinuxで受信したパケットをコンテナ内に転送するように設定します。

ホストLinuxvethXX

eth0

docker0

eth0

– 外部のクライアントはホストLinuxにアクセスするので、コンテナの存在を意識することはありません。

– OpenStack環境の場合、外部からは、仮想マシンに割り当てた「フローティングIP」にアクセスします。

172.17.42.1

# docker run -it -p 8000:80 ...

ホストLinuxのIPアドレスに接続

TCP 8000

TCP 80

ポートフォワーディング

フローティングIP

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

OpenStack&Docker活用テクニック

17

17

ハンズオン① コンテナイメージ作成

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

18

OpenStack&Docker活用テクニック

セキュリティグループの作成

Etherpad-Liteの利用に必要なセキュリティグループを作成します。– 次の手順で、以下の接続を許可したセキュリティグループ「eplite」を作成します。

• SSH(TCP22番)、HTTP(TCP80番)、MySQL(TCP3306番)– 「アクセスとセキュリティー」の画面で、「セキュリティグループの作成」から、名前

「eplite」でセキュリティグループを作成します。– 作成された「eplite」の「ルールの管理」から管理画面を表示した後、「ルールの追加」を押して、

ルール「SSH」を追加します。– 再度、「ルールの追加」を押して、同様に、ルール「HTTP」とルール「MYSQL」を追加します。

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

19

OpenStack&Docker活用テクニック

イメージ作成用インスタンスの起動

– 次を用いてインスタンスを起動します。• インスタンス名「docker01」• フレーバー「m1.small」• イメージ「Docker01」• セキュリティグループ「eplite」

– インスタンスにフローティングIPを割り当てておきます。

Dockerをインストール済みのVMイメージからインスタンスを起動します。

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

20

OpenStack&Docker活用テクニック

イメージ作成用インスタンスの起動

起動したインスタンスにログインして、Dockerの稼働を確認します。– ログインユーザーは「centos」を使用します。

$ ssh [email protected] login: Fri Dec 4 05:54:00 2015 from 192.168.251.36$ sudo -i# docker infoContainers: 1Images: 13Storage 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.2Logging Driver: json-fileKernel Version: 3.10.0-229.20.1.el7.x86_64Operating System: CentOS Linux 7 (Core)CPUs: 1Total Memory: 1.797 GiBName: docker01ID: APIU:AY72:ELLU:WBVM:AFRL:2NPW:KM46:5OZF:CH7K:AS5Q:5GJ3:JG7A

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

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

ハンズオンでは、この作業は実施する必要はありません。

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

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.7MAINTAINER Docker Tarou

RUN yum -y install mysql-serverADD init.sh /usr/local/bin/init.shRUN chmod u+x /usr/local/bin/init.sh

EXPOSE 3306CMD ["/usr/local/bin/init.sh"]

CentOS6.7のイメージを本環境のプライベートレジストリーから取得

あなたの名前(任意)を記載します。

# docker build -t epmysql:ver1.0 ./...(完成までしばらく待ちます)...

# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEepmysql ver1.0 81700756f51a 11 minutes ago 339.3 MB192.168.253.13:5000/library/centos 6.7 3fba1048142f 7 weeks ago 190.6 MB

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

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.7MAINTAINER Docker Tarou

ADD setup.sh /usr/local/bin/setup.shRUN chmod u+x /usr/local/bin/setup.shRUN /usr/local/bin/setup.sh

ADD settings.json /opt/etherpad/etherpad-lite/settings.jsonADD eplite.conf /etc/nginx/conf.d/eplite.confADD etherpad-lite /etc/init.d/etherpad-liteRUN chmod 755 /etc/init.d/etherpad-lite

ADD init.sh /usr/local/bin/init.shRUN chmod u+x /usr/local/bin/init.shCMD ["/usr/local/bin/init.sh"]

CentOS6.7のイメージを本環境のプライベートレジストリーから取得

あなたの名前(任意)を記載します。

# docker build -t eplite:ver1.0 ./...(完成までしばらく待ちます)...

# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEepmysql ver1.0 81700756f51a 50 minutes ago 339.3 MBeplite ver1.0 c48a3b84249b 11 minutes ago 729.1 MB192.168.253.13:5000/library/centos 6.7 3fba1048142f 7 weeks ago 190.6 MB

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

24

OpenStack&Docker活用テクニック

(参考)Dockerfileの処理内容:MySQLイメージ

#!/bin/bash

service mysqld start

if [[ ! -f ~/.trap_in_bashrc ]]; then cat <<EOF >>~/.bashrctrap 'service mysqld stop; exit 0' TERMEOF touch ~/.trap_in_bashrcfi

if [[ ! -d /var/lib/mysql/epdb ]]; then mysqladmin -u root password 'password' cat << EOF > /tmp/sql.txtDELETE 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.txtfi

exec /bin/bash

FROM centos:6.7MAINTAINER Etsuji Nakai

RUN yum -y install mysql-serverADD init.sh /usr/local/bin/init.shRUN chmod u+x /usr/local/bin/init.sh

EXPOSE 3306CMD ["/usr/local/bin/init.sh"]

Dockerfile

init.sh

MySQLをインストールして、起動スクリプト init.sh をイメージ内にコピー

MySQLを起動

コンテナ停止時のMySQL停止処理を設定

データベース「epdb」が存在しなければ、作成して初期化する

bashを起動

init.shを起動スクリプトに指定

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

25

OpenStack&Docker活用テクニック

(参考)Dockerfileの処理内容:Etherpad-Liteイメージ

#!/bin/bash -x

sed -i "s/__FIP__/${FIP}/" /etc/nginx/conf.d/eplite.confsed -i "s/__DBIP__/${DB_PORT_3306_TCP_ADDR}/" /opt/etherpad/etherpad-lite/settings.json

service etherpad-lite startservice nginx start

if [[ ! -f ~/.trap_in_bashrc ]]; then cat <<EOF >>~/.bashrctrap 'service nginx stop; service etherpad-lite stop; exit 0' TERMEOF touch ~/.trap_in_bashrcfi

exec /bin/bash

FROM centos:6.7MAINTAINER Etsuji Nakai

ADD setup.sh /usr/local/bin/setup.shRUN chmod u+x /usr/local/bin/setup.shRUN /usr/local/bin/setup.sh

ADD settings.json /opt/etherpad/etherpad-lite/settings.jsonADD eplite.conf /etc/nginx/conf.d/eplite.confADD etherpad-lite /etc/init.d/etherpad-liteRUN chmod 755 /etc/init.d/etherpad-lite

ADD init.sh /usr/local/bin/init.shRUN chmod u+x /usr/local/bin/init.shCMD ["/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アドレス

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

OpenStack&Docker活用テクニック

26

OpenStack&Docker活用テクニック 26

ハンズオン② イメージの動作確認

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

27

OpenStack&Docker活用テクニック

動作確認方法

先ほどコンテナイメージを作成したホストLinux上で、MySQLとEP-Liteのそれぞれのコンテナをまとめて起動して動作確認します。

– EP-LiteにはフローティングIPで接続します。– EP-LiteからMySQLは、ホストLinux上の内部ネットワーク経由で接続します。– MySQLのテーブル領域は、コンテナイメージ内に用意します。(永続保存はしません。)

コンテナ

ホストLinuxTCP 80

TCP 80

フローティングIP

EP-Lite

コンテナ

MySQL

TCP 3306

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

28

OpenStack&Docker活用テクニック

MySQLをコンテナで起動

MySQLのコンテナを起動します。– 次のコマンドでローカルイメージを指定してコンテナを起動します。

– 次のコマンドでコンテナの稼動状態を確認します。

# docker run -itd --name epmysql --expose 3306 epmysql:ver1.0

同じホストのコンテナから3306番ポートへの接続を許可

# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES67fb2201191a epmysql:ver1.0 "/usr/local/bin/init." 7 seconds ago Up 5 seconds 3306/tcp epmysql

# docker top epmysql | unexpand -t20UID PID PPID C STIME TTY TIME CMDroot 25818 3557 0 08:38 pts/1 00:00:00 /bin/bashroot 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=mysql27 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

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

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 psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf1cb2952c0d0 eplite:ver1.0 "/usr/local/bin/init." 6 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp eplite67fb2201191a epmysql:ver1.0 "/usr/local/bin/init." 13 minutes ago Up 13 minutes 3306/tcp epmysql

# docker top eplite | unexpand -t20UID PID PPID C STIME TTY TIME CMDroot 26183 3557 0 08:52 pts/2 00:00:00 /bin/bash500 26216 26183 18 08:52 ? 00:00:02 /usr/bin/node node_modules/ep_etherpad-lite/node/server.jsroot 26238 26183 0 08:52 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf499 26241 26238 0 08:52 ? 00:00:00 nginx: worker process

nginxの設定に必要な環境変数(外部からのアクセス先IP)を指定

MySQLのコンテナのIPアドレスを環境変数に設定(次ページ参照)

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

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.confsed -i "s/__DBIP__/${DB_PORT_3306_TCP_ADDR}/" /opt/etherpad/etherpad-lite/settings.json

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

31

OpenStack&Docker活用テクニック

動作確認とコンテナの停止

WebブラウザーからフローティングIPに接続すると、Etherpad-Liteが利用できます。

次のコマンドでコンテナを停止・破棄しておきます。

# docker stop eplite epmysql# docker rm eplite epmysql

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

OpenStack&Docker活用テクニック

32

OpenStack&Docker活用テクニック 32

ハンズオン③ イメージのアップロード

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

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 imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE192.168.253.13:5000/student-xxx/epmysql ver1.0 81700756f51a About an hour ago 339.3 MBepmysql ver1.0 81700756f51a About an hour ago 339.3 MB192.168.253.13:5000/student-xxx/eplite ver1.0 c48a3b84249b 4 hours ago 729.1 MBeplite ver1.0 c48a3b84249b 4 hours ago 729.1 MBdocker.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

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

34

OpenStack&Docker活用テクニック

(参考)プライベートレジストリーの検索

プライベートレジストリーの検索やアップロードイメージの削除は、次のコマンドで行います。

– イメージの検索、および、タグを確認する例です。

– アップロードしたイメージを削除する例です。(誤って実行しないように注意してください。)

# docker search 192.168.253.13:5000/student-xxxINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED192.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

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

OpenStack&Docker活用テクニック

35

OpenStack&Docker活用テクニック 35

ハンズオン④ 複数VMの連携

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

36

OpenStack&Docker活用テクニック

構築する環境の全体像

永続データ領域

OS領域

コンテナ(MySQL)

/data

コンテナイメージ

Dockerデーモン

/var/lib/mysql

フローティングIP

OS領域

コンテナ(EP-Lite)

コンテナイメージ

Dockerデーモン

フローティングIP フローティングIPにアクセス

フローティングIPにアクセス

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

37

OpenStack&Docker活用テクニック

イメージ作成用インスタンスの起動

– 次を用いてインスタンスを起動します。• インスタンス名「eplite」• フレーバー「m1.small」• イメージ「Docker01」• インスタンス数「2」• セキュリティグループ「eplite」

– それぞれのインスタンスにフローティングIPを割り当てておきます。

– 1GBのCinderボリュームを作成して、1つ目のインスタンス「eplite-1」に接続します。

Dockerをインストール済みのイメージからインスタンスを2個起動します。

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

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 [email protected] 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

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

39

OpenStack&Docker活用テクニック

MySQLコンテナの起動

コンテナの稼動状態を確認します。– コンテナ内でmysqldが稼働しています。

– ホストの /data 以下にMySQLのテーブルデータが保存されています。

# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES5c889e0ca142 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 -t20UID PID PPID C STIME TTY TIME CMDroot 19164 3590 0 10:04 pts/1 00:00:00 /bin/bashroot 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=mysql27 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 /dataepdb ib_logfile0 ib_logfile1 ibdata1 mysql mysql.sock test

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

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 [email protected] 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

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

41

OpenStack&Docker活用テクニック

EP-Liteコンテナの起動

コンテナの稼動状態を確認します。– コンテナ内でnginxとnode.jsが稼働しています。

# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES279515d8f5a3 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 -t20UID PID PPID C STIME TTY TIME CMDroot 19046 3590 0 10:19 pts/1 00:00:00 /bin/bash500 19078 19046 9 10:19 ? 00:00:01 /usr/bin/node node_modules/ep_etherpad-lite/node/server.jsroot 19100 19046 0 10:19 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf499 19103 19100 0 10:19 ? 00:00:00 nginx: worker process

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

42

OpenStack&Docker活用テクニック

動作確認と仮想マシンインスタンスの停止

Webブラウザーから2つ目のインスタンスのフローティングIPに接続すると、Etherpad-Liteが利用できます。

仮想マシンインスタンス「eplite-1」「eplite-2」は、ここで削除しておきます。

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

OpenStack&Docker活用テクニック

43

OpenStack&Docker活用テクニック 43

ハンズオン⑤ Userdataによる自動化

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

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コマンドを実行

③ アプリケーションイメージを   ダウンロードしてコンテナで起動

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

45

OpenStack&Docker活用テクニック

カスタマイズスクリプトを用いてインスタンスを起動

カスタマイズスクリプトを用意します。– 未使用のフローティングIPを確認して、下記のスクリプトを用意します。

• 「student-xxx」の部分は、各自のユーザー番号(「student-001」など)を指定します。• 「FIP=192.168.200.105」の部分は、確認したフローティングIPを指定します。

#!/bin/sh -xdocker run -itd --name epmysql --expose 3306 \ 192.168.253.13:5000/student-xxx/epmysql:ver1.0sleep 5docker 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」• 「作成後」のタブで、カスタマイズス

クリプトに用意したスクリプトを入力

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

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 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBE4CSNSsMHMLb6xqSHOJlfcKhCa1Yz2peSrXqINfivOvn31JxynqNQuXBiWM5BI3StZI/5H1kWAMU6UyptgrrwM= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHKGd6Z1pEmcpjNuoX3+d25JpQ0+P9AdxbvO+ZnT7cqy ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMqdEBPxn+pRwo3YtTYn9Nz1PwuQsrqfBJZ7ZFrujqEAQsOeavuUpUnTS1RjJkV1X7Rc0rSCmDnYOy4PLsqbZaD3kBwUtXtzORtrLbyC7nPKb2Iqx+0/mNwl3xzYg2vNZpyE4CSLkoVShBInPjjaJD2515dfoNEM0+4Yy9cugK7WThchV7q6sz8w7EXWxLebu/ipLCoSlOBpsH1KN4zPBl0foI8GlH3kuYSUCAS0JhLlEV776MvvFfM12fefNQ+5VHzjVlAdSjtI9OaPSff4KjJ8bAcLdmGMzSj3Ou0HjpuSGyJ+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

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

47

OpenStack&Docker活用テクニック

動作確認

カスタマイズスクリプトに記載したフローティングIPをインスタンスに割り当てて、WebブラウザーからフローティングIPに接続すると、Etherpad-Liteが利用できます。

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

OpenStack&Docker活用テクニック

48

OpenStack&Docker活用テクニック 48

後片付け(次の演習に向けて)

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

49

OpenStack&Docker活用テクニック

仮想マシンインスタンスの削除とフローティングIPの解放

不要な仮想マシンインスタンスを削除して、未使用のフローティングIPを開放しておきます。

– インスタンスの管理画面で「step-server」以外のインスタンスをすべて削除します。

– アクセスとセキュリティーの管理画面で「Floating IP」のタブから、未使用(停止中)のフローティングIPをすべて解放します。

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

OpenStack&Docker活用テクニック

50

OpenStack&Docker活用テクニック 50

参考資料

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

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

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

openstackOpen source software to build public and private clouds.