Docker上で
CloudStackを動かしてみる!!
2014/6/12,14
第18回 CloudStackユーザ会in札幌 / OSC北海道2014
わたし
大削 緑/Midori Oge
みろりん @star76popin
☆某SI会社 → 某通信事業者 → NTTコミュニケーションズで
の開発を担当しています
☆こんな記事を書いてます
オープンソースの「クラウド基盤ソフトウェア」を比較する【第1回】
機能を徹底比較! ∼Eucalyptus、CloudStack、OpenStack
オープンソースの「クラウド基盤ソフトウェア」を比較する【第2回】
【徹底比較】Eucalyptus、CloudStack、OpenStackの仮想マシン性能
☆いろんなユーザ会にいます
@副会長
CloudStackの青本登場!
CloudStack実践ガイド
1. CloudStackってなぁに?
2. CloudStackのしくみ
3. つくってみよう: CloudStackのインストール
4. つかってみよう: CloudStackの基本操作
!
5. もっとつかってみよう1: APIでもっと便利
6. もっとつかってみよう2: 自分だけのテンプレートを作ろう
7. もっとつかってみよう3: Virtual Private Cloud(VPC)を使おう
8. あたらしい機能たち
9. I♡CloudStack
前
編
後
編
インプレスR&D社より
絶賛発売中
今日のテーマ
・GO言語でかかれている
Dockerってなぁに?
・オープンソース
・コンテナ型(LXCベース)
・同一の環境を作りやすい
・差分管理型ファイルシステム(AUFS)
・構築を自動化できる(Dockerfile)
軽くて・お手軽
OS
速いの
ハードウェア
プ
ロ
セ
ス
プ
ロ
セ
ス
ハードウェア
プ
ロ
セ
ス
プ
ロ
セ
ス
プ
ロ
セ
ス
プ
ロ
セ
ス
ハードウェア
ホスト
OS
プ
ロ
セ
ス
プ
ロ
セ
ス
ハイパーバイザ
仮想化なし
ハイパーバイザ型
仮想化(KVM)
コンテナ型仮想化
プ
ロ
セ
ス
プ
ロ
セ
ス
プ
ロ
セ
ス
プ
ロ
セ
ス
コンテナ VM
OS上で直に動作するプロセスと変わらない
カーネル
ゲスト
OS
ゲスト
OS
OS
サイズが小さい
ハイパーバイザ型
仮想化(RAW形式)
作成
500MのPKGを
インストール
5Gのイメージ
10G5G
別のVM/コンテナ
を作成
10.5G 15.5G
コンテナ型仮想化 5G5G 5.5G 5.5G
(デフォルトのイメージ自体も、超最低限のPKGのみで作られている)
環境ごとにイメージを作らず、差分を保存
なぜDocker?
ビルドとデプロイが簡単に!
ツールでセットアップしたけど間違えてた!やべどやって戻そう…
色々いじれる環境が欲しいけど、VPS1台分しかお金ないや…
あーまたビルドし直しだよマンドクセ…
え? その手順で俺うまくいったぜ! …
Immutableとかカッコよくね?
ウソ!手元ではちゃんと動いてたんだってばよ!
あー色々いじってたら汚くなっちゃった…
イメージライブラリとかあって便利じゃね?
LXCじゃなくて?
試してみよう
CloudStackの基本コンポーネント
ユーザ
Management Server
Secondary Storage
Host
Primary Storage
VM VM
http://hoge.cloudstack.net:8080/client
・GUIを提供
・リソース管理
・イベント管理
VMを起動(CPU・メモリ)
VMのディスク領域 VMのイメージファイルや
ISO、スナップショットを格納
DB
今回試してみたこと
Host
VM VM
Management
Server
VM
コンテナ
Host
Management
Server
Secondary
Storage
Primary
Storage
CloudStack
CloudStack
CloudStackのVMの上にコンテナを立てて
コンテナの中にCloudStackを作る!
DB
Secondary
Storage
Primary
Storage
(1)Dockerのインストール
$ uname -a	
!
カーネルのアップデート(以下はkernel3.8未満の場合のみ実施)	
$ sudo apt-get update	
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring	
$ sudo reboot
今回は、Ubuntu12.04-4 Desktop版を使用
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys
36A1D7869245C8950F966E92D8576A8BA88D21E9	
!
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-
keyring /tmp/tmp.DSfHFTfBuw --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/
trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://
keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9	
gpg: requesting key A88D21E9 from hkp server keyserver.ubuntu.com	
gpg: key A88D21E9: public key "Docker Release Tool (releasedocker) <docker@dotcloud.com>"
imported	
gpg: Total number processed: 1	
gpg: imported: 1 (RSA: 1)
3.8未満の場合は置き換える
Dockerリポジトリの鍵をキーチェーンに追加
$ sudo vi /etc/apt/sources.list.d/docker.list	
deb https://get.docker.io/ubuntu docker main	
!
$ sudo apt-get update
Dockerリポジトリの登録
← 記入
$ sudo apt-get install lxc-docker	
!
$ sudo docker version	
Client version: 1.0.0	
Client API version: 1.12	
Go version (client): go1.2.1	
Git commit (client): 63fe64c	
Server version: 1.0.0	
Server API version: 1.12	
Go version (server): go1.2.1	
Git commit (server): 63fe64c
Dockerのインストール
(1)Dockerのインストール
(2)セットアップ
$ sudo docker run -t -i ubuntu:12.04 /bin/bash	
root@31d57febb148:/#	
!
!
!
!
イメージからコンテナを起動
①
② ③
① runでコンテナ起動
(シェルを起動するときは、-t tty割り当て、-i 対話モードをつける)
② Dockerリポジトリのubuntu12.04を使用
③ シェルを起動
# echo 'root:<PASSWORD>' | chpasswd	
!
# cp /usr/share/zoneinfo/Japan /etc/localtime	
# date	
Thu Jun 10 22:12:45 JST 2014	
!
# apt-get install vim
コンテナでの初期設定
パスワード変更
↑
コンテナに入った
localtimeをUTCからJSTに変更
ーーーーーーーー ここからはコンテナの設定! ーーーーーーーーー
CloudStackリポジトリの設定
# vi /etc/apt/sources.list.d/cloudstack.list	
deb http://repo.star76.jp/ubuntu/ ./	
!
(次の1行はCloudStackのリポジトリを使用する場合のみ実施)	
# wget -O - http://cloudstack.apt-get.eu/release.asc|apt-key add -	
!
# apt-get update
公式リポジトリのパッケージを使うと
エラーが出るため、リポジトリを変更しています
パッケージのインストール
# apt-get install -y openssh-server mysql-server supervisor net-tools inetutils-ping
supervisordの設定
# mkdir /var/run/sshd	
# mkdir -p /var/log/supervisor	
# mkdir -p /etc/supervisor/conf.d/
# vi /etc/supervisor/conf.d/supervisord.conf	
[supervisord]	
nodaemon=true	
!
[program:sshd]	
command=/usr/sbin/sshd -D	
!
[program:mysqld]	
command=/usr/bin/mysqld_safe
(2)セットアップ
mysqlの設定
# vi /etc/mysql/my.cnf	
!
[mysqld]	
# bind-address = 127.0.0.1	
!
bind-address = 0.0.0.0	
innodb_rollback_on_timeout=1	
innodb_lock_wait_timeout=600	
max_connections=350	
log-bin=mysql-bin	
binlog-format = 'ROW'
[mysqld]セクションの
“bind-address”の行をコメントアウト
[mysqld]セクションに追記
bind-addressの値を変更して
ホストから接続できるようにします
コンテナから抜ける
# exit
(2)セットアップ
一度コンテナから抜けます
コンテナをイメージ化して起動
$ sudo docker ps -a	
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES	
31d57febb148 ubuntu:12.04 /bin/bash 37 minutes ago Exited (0) About a minute ago boring_tesla	
!
!
$ sudo docker commit 31d57febb148 <REPOSITORY NAME>/<TAG NAME>	
477270d630b2e7b0ae0017381f049205bf788d6d125986824f984cc2bde5cbb3	
!
!
$ sudo docker run --privileged -d -p 22 -p 3306 -p 8080 -h management.hoge.local 	
--name="management-server" <REPOSITORY NAME>/<TAG NAME> /usr/bin/supervisord	
!
d4575d79977eae86df3c7b1efcd4e389146c1fbe7395dbb5b2644fd1831c90ff	
!
!
!
!
!
!
(2)セットアップ
コンテナの一覧を表示
① ② ③ ① コンテナをイメージ化
② コンテナID
③ イメージ名
新しくコンテナが起動
④ ⑤ ⑥
⑦ ⑧ ⑨
④ コンテナに特権モードを付与
⑤ 22,3306,8080ポートを開放
⑥ ホスト名をfqdnで付与
⑦ コンテナ名
⑧ 起動するイメージ
⑨ 起動するデーモン
$ sudo docker ps -a	
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES	
d4575d79977e mirorin/test:latest /usr/bin/supervisord About a minute ago Up About a minute
0.0.0.0:49161->22/tcp, 0.0.0.0:49162->3306/tcp, 0.0.0.0:49163->8080/tcp management-server	
31d57febb148 ubuntu:12.04 /bin/bash 50 minutes ago Exited (0) 13 minutes
ago	
!
起動したコンテナの情報を表示
(2)セットアップ
コンテナのポートとのマッピングが表示される
$ ssh root@<DOCKER0 IP> -p <PORT>
コンテナにssh接続
“DOCKER 0 IP”は、ifconfigで確認
# mysql -uroot -p	
!
mysql> SHOW VARIABLES WHERE Variable_name='innodb_rollback_on_timeout' OR
Variable_name='innodb_lock_wait_timeout' OR Variable_name='max_connections';	
!
mysql> SELECT host,user FROM mysql.user;	
!
mysql> DELETE FROM mysql.user WHERE host='::1';	
!
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '<PASSWORD>' WITH GRANT
OPTION;	
!
mysql> FLUSH PRIVILEGES;	
mysql> quit;	
mysqlの設定
(2)セットアップ
my.cnfの内容が反映されているか確認
rootユーザのパスワードを設定
ーーーーーーーー ここからはコンテナの設定! ーーーーーーーーー
# apt-get install cloudstack-management	
!
# wget http://launchpadlibrarian.net/88151258/tomcat6_6.0.33-1_all.deb	
# wget http://launchpadlibrarian.net/88151257/tomcat6-common_6.0.33-1_all.deb	
# wget http://launchpadlibrarian.net/88151260/libtomcat6-java_6.0.33-1_all.deb	
# dpkg -i tomcat6-common_6.0.33-1_all.deb	
# dpkg -i tomcat6_6.0.33-1_all.deb	
# dpkg -i libtomcat6-java_6.0.33-1_all.deb	
# dpkg -l | grep tomcat	
!
# cloudstack-setup-databases cloud:<PASSWORD>@localhost --deploy-as=root:<PASSWORD>	
!
# cloudstack-setup-management	
CloudStackのインストール
(2)セットアップ
Management Serverをインストール
データベースのセットアップ
Management Serverのセットアップ
Tomcat6.0.35は既知の不具合があるため
バージョンダウン
おおおおお…!
コンテナ
どやっ
Dockerfile
# CloudStack 4.3 Management Server installation	
# VERSION	0.1	
!
FROM ubuntu:12.04	
MAINTAINER star76 "mirorin@cloudstackers.net"	
!
# initial settings	
ENV DEBIAN_FRONTEND noninteractive	
RUN echo 'root:<PASSWORD>' | chpasswd	
RUN cp /usr/share/zoneinfo/Japan /etc/localtime	
!
# preparing repository	
ADD cloudstack.list /etc/apt/sources.list.d/	
RUN apt-get update	
!
# settings for supervisord	
RUN apt-get install -y openssh-server mysql-server supervisor net-tools	
RUN mkdir /var/run/sshd/	
RUN mkdir -p /var/log/supervisor/	
RUN mkdir -p /etc/supervisor/conf.d/	
ADD supervisord.conf /etc/supervisor/conf.d/	
!
# mysql configuration	
ADD my.cnf /etc/mysql/	
RUN (/usr/bin/mysqld_safe &); sleep 5; echo "DELETE FROM mysql.user WHERE host='::1';SET PASSWORD
FOR root@localhost = PASSWORD('<PASSWORD>'); GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY
'<PASSWORD>' WITH GRANT OPTION; FLUSH PRIVILEGES;" | mysql -uroot
FROM <image:tag> ベースイメージを指定
RUN <command> コマンドを実行
ENV <key> <value> 環境変数をセット
ADD <src> <dst> ファイルをコンテナにコピー
Dockerfile(続き)
# CloudStack installation	
RUN apt-get install -y --force-yes cloudstack-management	
RUN wget http://launchpadlibrarian.net/88151258/tomcat6_6.0.33-1_all.deb	
RUN wget http://launchpadlibrarian.net/88151257/tomcat6-common_6.0.33-1_all.deb	
RUN wget http://launchpadlibrarian.net/88151260/libtomcat6-java_6.0.33-1_all.deb	
RUN dpkg -i tomcat6-common_6.0.33-1_all.deb	
RUN dpkg -i tomcat6_6.0.33-1_all.deb	
RUN dpkg -i libtomcat6-java_6.0.33-1_all.deb	
!
# port expose	
EXPOSE 22	
EXPOSE 3306	
!
# CMD execution	
CMD "/usr/bin/supervisord"	
https://github.com/mirorin/CloudStack_on_Docker
EXPOSE <port> コンテナが公開するポート番号
CMD <実行するプログラム> プログラムの実行
Dockerfileの使い方
イメージでコンテナを起動してsshログイン
CloudStackのセットアップ
# cloudstack-setup-databases cloud:<PASSWORD>@localhost --deploy-as=root:<PASSWORD>	
# cloudstack-setup-management
$ sudo docker build -t <REPOSITORY NAME>/<TAG NAME> .
ビルドしてイメージ作成
$ sudo docker run --privileged -d -p 22 -p 3306 -p 8080 -h <SERVERNAME>.<DOMAIN> --
name="management-server" <REPOSITORY NAME>/<TAG NAME> /usr/bin/supervisord	
!
$ sudo docker ps -a	
!
# ssh root@<DOCKER 0 IP> -p<PORT>
結論
オススメしません
シンプルに、
必要なプロセスだけを動作させる
コンテナの使い方
CloudStack、使ってみてね

20140612_Docker上でCloudStackを動かしてみる!!