openstackをさらに”使う”技術 - openstack&docker活用テクニック
TRANSCRIPT
OpenStackをさらに”使う”技術Docker/Ansible編
パート2 OpenStack&Docker活用テクニック
中井悦司
openstackOpen source software to build public and private clouds.
2015/12/10 ver1.1
2
OpenStack&Docker活用テクニック
自己紹介
中井悦司(なかいえつじ)– Twitter @enakai00
日々の仕事– Senior Solution Architect and
Cloud Evangelist at Red Hat K.K.企業システムでオープンソースの活用を希望されるお客様を全力でご支援させていただきます。
昔とった杵柄– 素粒子論の研究(超弦理論とか)– 予備校講師(物理担当)– インフラエンジニア(Unix/Linux専門)
好評発売中!
3
OpenStack&Docker活用テクニック
Contents
Dockerの概要 OpenStackとDockerの組み合わせ ハンズオン① コンテナイメージ作成 ハンズオン② イメージの動作確認 ハンズオン③ イメージのアップロード ハンズオン④ 複数VMの連携 ハンズオン⑤ Userdataによる自動化 後片付け(次の演習に向けて) 参考資料
OpenStack&Docker活用テクニック
4
4
Dockerの概要
5
OpenStack&Docker活用テクニック
Dockerが提供する基本機能
Dockerfile
① Dockerイメージを自動作成
OSイメージ
アプリケーションライブラリー
アプリケーションフレームワーク
イメージの作成手順を記載
Dockerイメージ
OS上にインストール可能なものはすべてイメージ化可能
② Dockerイメージを保存・公開
③ Dockerサーバーに イメージを配布・実行
6
OpenStack&Docker活用テクニック
Linuxコンテナの仕組み
コンテナ
物理サーバー/仮想マシン
Linuxカーネル
アプ
リケ
ーシ
ョン
アプ
リケ
ーシ
ョン
・・・
物理サーバー/仮想マシン
Linuxカーネル
・・・
コンテナ
通常のLinux環境 コンテナで分割した環境
コンテナごとに見える環境が異なる
すべてのアプリケーションから同じ環境が見える
「Linuxコンテナ」は、プロセスグループごとに独立したOS環境を見せる技術– ローカルディスクの内容(ディレクトリー内のファイル)– ネットワーク環境(NIC、IPアドレス)– CPU、メモリー割り当て
※ Dockerよりもずっと古くから存在する技術です。
アプ
リケ
ーシ
ョン
アプ
リケ
ーシ
ョン
7
OpenStack&Docker活用テクニック
Dockerとコンテナの関係コンテナ
アプ
リケ
ーシ
ョン
ディレクトリーツリー
Linux上にマウント
ルートディレクトリーとして割り当て
「Dockerイメージ」の実体は、コンテナに割り当てるディスクイメージに、ネットワーク設定などの環境情報を付与したものにすぎません。
Dockerの真の価値は、次のような「イメージ管理機能」にあります。
– Dockerfile:Dockerイメージを自動作成する仕組み
– Docker Hub:Dockerイメージを共有・配布する仕組み
Dockerイメージ
8
OpenStack&Docker活用テクニック
フレームワーク
データベース
アプリケーションフレームワークライブラリー
Dockerイメージを本番環境に展開!
テストが実施された「確実動くアプリケーション」をそのままDockerイメージに固めて、本番環境に自動デプロイするという運用を想像してみましょう・・・。
サービス環境へのDocker適用のメリット
9
OpenStack&Docker活用テクニック
Immutable Infrastructureとは?
– アプリケーションの設定変更、バージョンアップなどは、稼働中の本番環境をいじるのではなく、大元のコードを変更して再テストした後に、本番環境を新規構築してそっくり置き換えるという運用手法。
–運用中の環境変更するリスク(想定外の不具合)を回避して、常にテスト済みの環境を本番提供可能に。
– 同一構成のサーバーを大量に並べるスケールアウト環境で、多数のサーバーの構成を常に同一に保ち続ける。
Dockerイメージによる自動デプロイにより、これまで実現困難と言われていた「Immutable Infrastructre」がついに実現可能になります。
Dockerによる自動デプロイのメリット
「Immutable Infrastructre」を実現して構成管理を容易に!
10
OpenStack&Docker活用テクニック
コンテナは、起動(run)、停止(stop)、再開(start)、保存(commit)、削除(rm)などの操作が実施できます。
– コンテナ起動時は指定イメージのスナップショットを自動作成します。– コンテナを削除すると、使用中のイメージは破棄されます。(イメージ内の保存データは失われま
す。)
コンテナのライフサイクル
保存イメージ スナップショット
コンテナ起動時にスナップショットを作成
×run
commit
rm
プロセス
スナップショット
stop
start
保存イメージ
コンテナを停止するとプロセスが停止(コンテナイメージは残っている)
コンテナを削除するとコンテナイメージを破棄
コンテナイメージを複製して保存イメージとして登録
OpenStack&Docker活用テクニック
11
11
OpenStackとDockerの組み合わせ
12
OpenStack&Docker活用テクニック
OpenStackによる自動化(オーケストレーション)手法
Dockerが無かった時代は・・・– 仮想マシン、ストレージ、ネットワークなどのインフラは、OpenStackで自動構成– ゲストOS上のアプリはChef/Ansible/Puppetなどの構成管理ツールで自動構成
ゲストOSとアプリの管理が別れているため「Immutable」な運用が困難!– ゲストOSのテンプレートはOpenStack側で管理– 仮想マシン起動時に動的にアプリの導入・設定を実施
「第14章 Dockerを利用したアプリケーション展開」より引用
ゲストOSの変更に起因するアプリ導入の失敗が発生
13
OpenStack&Docker活用テクニック
OpenStackとDockerの組み合わせ手法
Dockerを用いた運用だと・・・– OpenStackは、「インフラ+DockerホストOS」の提供に専念– アプリの実行環境は、Dockerイメージで作成・管理・デプロイ
インフラとアプリの管理を分離することで「Immutable」な運用が容易に!– ゲストOSのテンプレートはDockerの稼働環境を提供– 事前作成済みのDockerイメージを配布してアプリを起動
「第14章 Dockerを利用したアプリケーション展開」より引用
アプリの導入・管理をOpenStackから分離可能
14
OpenStack&Docker活用テクニック
Docker用仮想マシンの構成例
永続データ領域
OS領域Docker導入済みVMテンプレート
ホストLinuxの/dataにマウント
仮想マシン
ブロックボリューム
コンテナ(アプリケーション)
/data
コンテナイメージ
Dockerデーモン
ゲストOS(ホストLinux)
/var/lib/mysql
永続データは特定のディレクトリに保存
Dockerで管理
OpenStackで管理
15
OpenStack&Docker活用テクニック
MySQLにアクセスするコンテナの構成例
永続データ領域
OS領域
コンテナ(MySQL)
/data
コンテナイメージ
Dockerデーモン
/var/lib/mysql
フローティングIP
OS領域
コンテナ(node.jsアプリ)
コンテナイメージ
Dockerデーモン
フローティングIP フローティングIPにアクセス
フローティングIPにアクセス
接続先DBのIP/ポートは環境変数で参照
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
OpenStack&Docker活用テクニック
17
17
ハンズオン① コンテナイメージ作成
18
OpenStack&Docker活用テクニック
セキュリティグループの作成
Etherpad-Liteの利用に必要なセキュリティグループを作成します。– 次の手順で、以下の接続を許可したセキュリティグループ「eplite」を作成します。
• SSH(TCP22番)、HTTP(TCP80番)、MySQL(TCP3306番)– 「アクセスとセキュリティー」の画面で、「セキュリティグループの作成」から、名前
「eplite」でセキュリティグループを作成します。– 作成された「eplite」の「ルールの管理」から管理画面を表示した後、「ルールの追加」を押して、
ルール「SSH」を追加します。– 再度、「ルールの追加」を押して、同様に、ルール「HTTP」とルール「MYSQL」を追加します。
19
OpenStack&Docker活用テクニック
イメージ作成用インスタンスの起動
– 次を用いてインスタンスを起動します。• インスタンス名「docker01」• フレーバー「m1.small」• イメージ「Docker01」• セキュリティグループ「eplite」
– インスタンスにフローティングIPを割り当てておきます。
Dockerをインストール済みのVMイメージからインスタンスを起動します。
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
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
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
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
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を起動スクリプトに指定
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アドレス
OpenStack&Docker活用テクニック
26
OpenStack&Docker活用テクニック 26
ハンズオン② イメージの動作確認
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
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
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アドレスを環境変数に設定(次ページ参照)
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
31
OpenStack&Docker活用テクニック
動作確認とコンテナの停止
WebブラウザーからフローティングIPに接続すると、Etherpad-Liteが利用できます。
次のコマンドでコンテナを停止・破棄しておきます。
# docker stop eplite epmysql# docker rm eplite epmysql
OpenStack&Docker活用テクニック
32
OpenStack&Docker活用テクニック 32
ハンズオン③ イメージのアップロード
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
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
OpenStack&Docker活用テクニック
35
OpenStack&Docker活用テクニック 35
ハンズオン④ 複数VMの連携
36
OpenStack&Docker活用テクニック
構築する環境の全体像
永続データ領域
OS領域
コンテナ(MySQL)
/data
コンテナイメージ
Dockerデーモン
/var/lib/mysql
フローティングIP
OS領域
コンテナ(EP-Lite)
コンテナイメージ
Dockerデーモン
フローティングIP フローティングIPにアクセス
フローティングIPにアクセス
37
OpenStack&Docker活用テクニック
イメージ作成用インスタンスの起動
– 次を用いてインスタンスを起動します。• インスタンス名「eplite」• フレーバー「m1.small」• イメージ「Docker01」• インスタンス数「2」• セキュリティグループ「eplite」
– それぞれのインスタンスにフローティングIPを割り当てておきます。
– 1GBのCinderボリュームを作成して、1つ目のインスタンス「eplite-1」に接続します。
Dockerをインストール済みのイメージからインスタンスを2個起動します。
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
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
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
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
42
OpenStack&Docker活用テクニック
動作確認と仮想マシンインスタンスの停止
Webブラウザーから2つ目のインスタンスのフローティングIPに接続すると、Etherpad-Liteが利用できます。
仮想マシンインスタンス「eplite-1」「eplite-2」は、ここで削除しておきます。
OpenStack&Docker活用テクニック
43
OpenStack&Docker活用テクニック 43
ハンズオン⑤ Userdataによる自動化
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
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」• 「作成後」のタブで、カスタマイズス
クリプトに用意したスクリプトを入力
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
47
OpenStack&Docker活用テクニック
動作確認
カスタマイズスクリプトに記載したフローティングIPをインスタンスに割り当てて、WebブラウザーからフローティングIPに接続すると、Etherpad-Liteが利用できます。
OpenStack&Docker活用テクニック
48
OpenStack&Docker活用テクニック 48
後片付け(次の演習に向けて)
49
OpenStack&Docker活用テクニック
仮想マシンインスタンスの削除とフローティングIPの解放
不要な仮想マシンインスタンスを削除して、未使用のフローティングIPを開放しておきます。
– インスタンスの管理画面で「step-server」以外のインスタンスをすべて削除します。
– アクセスとセキュリティーの管理画面で「Floating IP」のタブから、未使用(停止中)のフローティングIPをすべて解放します。
OpenStack&Docker活用テクニック
50
OpenStack&Docker活用テクニック 50
参考資料
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
openstackOpen source software to build public and private clouds.