今日からできる レガシーシステムの段階的コンテナ化

今日からできる
レガシーシステムの段階的コンテナ化
NTTソフトウェアイノベーションセンタ
石井久治
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
背景/ねらい
• Docker/コンテナ系技術が熱いが、使っているのは、ほ
とんどWeb開発者ばかり
• 既存システム/レガシーシステムはブラックボックス化
していて、クラウドにすら乗せられていない
• 既存システムを一度にクラウド移行するのは無理でも、
段階的にコンテナ化していけば、無理なくクラウド化し
ていけるのではないか
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
2
概要
• 既存システムを部分的・段階的にコンテナ化する手法を学ぶ
• システム全体を一度にコンテナ化せずとも、コンテナ技術の恩恵を
受けられる
コンテナ技術の恩恵
• アプリケーションごとに実行環境(ライブラリのバージョン等)を分
離・固定化できる
• 本番環境への副作用が無い状態で、アップデートの検証が行える
• アップデート時のダウンタイムを最小化できる。切り戻しできるこ
とも保障される
到達目標
• Linuxコンテナの基本知識を習得
• Dockerの基本的な使い方を習得
• 既存システムの一部分をDockerコンテナで置き換える方法を習得
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
3
概要
• 既存システムを部分的・段階的にコンテナ化する手法を学ぶ
• システム全体を一度にコンテナ化せずとも、コンテナ技術の恩恵を
受けられる
コンテナ技術の恩恵
• アプリケーションごとに実行環境(ライブラリのバージョン等)を分
離・固定化できる
• 本番環境への副作用が無い状態で、アップデートの検証が行える
• アップデート時のダウンタイムを最小化できる。切り戻しできるこ
とも保障される
到達目標
• Linuxコンテナの基本知識を習得
• Dockerの基本的な使い方を習得
• 既存システムの一部分をDockerコンテナで置き換える方法を習得
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
4
講義の流れ
コンテナ技術の基礎知識
座学
Dockerの基本的な使い方
ハンズオン環境の確認
休憩
システム更新演習パート1
休憩
システム更新演習パート2
まとめ
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
5
コンテナ技術の基礎知識
コンテナとは?
Dockerとは?
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
コンテナ
dockerはコンテナ仮想化技術を使ったソリューション
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
7
chroot FreeBSD
Jail
1983
2000
LXC
docker
2008
2013
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
8
仮想化技術
一つの物理マシン上に実行環境を作る技術
ゲストOS
仮想
マシン
コンテナ
コンテナ
OS
ハイパーバイザ
OS
物理マシン
物理マシン
物理マシン
仮想なし環境
ハイパーバイザ型
コンテナ仮想化
OS(の一部)を共有する仮想化
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
9
Linuxコンテナ仮想化すこし正確に
プ
ロ
セ
ス
プ
ロ
セ
ス
プ
ロ
セ
ス
ユーザ空間
プ
ロ
セ
ス
プ
ロ
セ
ス
プ
ロ
セ
ス
プ
ロ
セ
ス
ユーザ空間
カーネル空間
カーネル空間
物理マシン
物理マシン
仮想なし環境
コンテナ仮想化
コンテナはLinuxカーネルを共有
独立したリソースを割り当て,プロセス実行環境を分離
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
10
コンテナを実現する技術
Linuxカーネルが提供する機能
cgroups:
プロセスグループのリソース(CPU,メモリ,I/Oなど)利用量を制限する機能
capability:
root権限の一部だけをプロセスに与える機能
namespace:
独立した空間内にリソースを隔離する機能
- ファイルシステム
: Mount namespace
- ホストネーム
: UTS namespace
- プロセス間通信
: IPC namespace
- ユーザID(UID/GID)
: User namespace
- プロセスID
: PID namespace
- ネットワーク
: Network namespace
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
11
Dockerがやること
アプリ実行環境をイメージとして保存し,コンテナ上に展開する
例:Ubuntuイメージでやってること
コンテナでリソースを隔離して
ubuntuの最低限必要なファイルを持ってきて
設定を書いて(/etc/apt/sources.listなど)
/bin/bashを実行
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
12
Dockerの基本的な使い方
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
Dockerコマンド
docker image
docker pull
docker ps
docker run
docker exec
docker attach
docker kill
docker rm
イメージの一覧表示
イメージをダウンロード
コンテナの一覧表示
コンテナを起動
コンテナ内でコマンド実行
コンテナ内の端末に接続
コンテナを停止
コンテナを削除
他にもいっぱい → http://docs.docker.com/engine/reference/commandline/cli/
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
14
docker images
ローカルマシン上のdockerイメージを一覧表示する
docker@node:~$ docker
REPOSITORY
TAG
mysql
latest
debian
latest
ubuntu
latest
busybox
latest
images
IMAGE ID
b01706fbc5a4
23cb15b0fcec
e9ae3c220b23
c51f86c28340
CREATED
5 days ago
6 days ago
4 weeks ago
5 weeks ago
この資料のURLは http://bit.ly/ood2015legacy
VIRTUAL SIZE
359.9 MB
125.1 MB
187.9 MB
1.109 MB
Copyright©2014 NTT corp. All Rights Reserved.
15
docker pull
DockerHubからイメージをダウンロードする
$ docker pull イメージ名
docker@node:~$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
fa5be2806d4c: Pull complete
0cd86ce0a197: Pull complete
e9407f1d4b65: Pull complete
c9853740aa05: Pull complete
e9fa5d3a0d0e: Pull complete
Digest:
sha256:c96eeb93f2590858b9e1396e808d817fa0ba4076c68b59395445cb957b52
4408
Status: Downloaded newer image for centos:latest
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
16
docker ps
起動中のコンテナを一覧表示
(-a オプション: 停止中のコンテナも表示)
docker@node:~$ docker ps
CONTAINER ID
IMAGE
c97a5785ac25
debian
917b22d24218
ubuntu
cad482fa6245
ubuntu
03299a7e8d40
ubuntu
eb06fbba6f56
ubuntu
COMMAND
"/bin/bash"
"/bin/bash"
"/bin/bash"
"/bin/bash"
"/bin/bash”
CREATED
3 seconds ago
31 hours ago
46 hours ago
2 days ago
2 days ago
STATUS
Up 2 seconds
Up 31 hours
Up 46 hours
Up 2 days
Up 2 days
この資料のURLは http://bit.ly/ood2015legacy
PORTS
NAMES
debian1
web2
web
app
ubuntu1
Copyright©2014 NTT corp. All Rights Reserved.
17
docker run
コンテナを起動
docker run [オプション] イメージ名 [コマンド]
オプション:
--name="コンテナ名"
-it
-d
コンテナ名を設定
擬似端末を作成
デタッチ状態で起動
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
18
docker run
docker@node:~$ docker run -itd --name=test centos
e0a6c8cdd0cba450b3096c43048d1e6d13cc983fa718a0299e7c8909f370e371
コンテナ起動
docker@node:~$ docker ps
CONTAINER ID
IMAGE COMMAND
CREATED
STATUS
PORTS
NAMES
e0a6c8cdd0cb
centos "/bin/bash" 6 seconds ago Up 4 seconds
test
起動中を確認
docker@node:~$ docker attach test
コンテナにアタッチ
[root@e0a6c8cdd0cb /]#
[root@e0a6c8cdd0cb /]# cat /etc/centos-release
CentOS Linux release 7.1.1503 (Core)
「CTRL+P CTRL+Q」で
[root@e0a6c8cdd0cb /]#
コンテナからデタッチ
docker@node:~$
PID TTY
24 ?
docker@node:~$
test
docker@node:~$
test
docker exec test ps
TIME CMD
00:00:00 ps
docker kill test
docker rm test
docker execでコマンド実行
コンテナ停止
コンテナ削除
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
19
ネームスペースの共有
ネームスペースで各リソースを隔離
...しないこともできる
docker run のオプションで
--ipc=共有先
--net=共有先
--pid=共有先
-v [host-dir]:[container-dir]
IPC空間を共有
ネットワークを共有
PIDを共有
ディレクトリを共有
共有先 に“host”を指定すればホストと共有
コンテナIDを指定すればコンテナ間で共有
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
20
--net=host
docker@node:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
mode DEFAULT group default
ホストのインターフェース確認
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default
link/ether 8a:e1:25:43:12:77 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group
default qlen 1000
link/ether 38:63:bb:43:4b:c8 brd ff:ff:ff:ff:ff:ff
4: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen
1000
link/ether 8c:dc:d4:0e:33:68 brd ff:ff:ff:ff:ff:ff
普通にコンテナ起動
docker@node:~$ docker run -it --rm ubuntu
root@c081019485ea:/# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
group default
ホストと異なるコンテナ用
link/ether 02:42:ac:11:00:08 brd ff:ff:ff:ff:ff:ff
のインターフェース
root@c081019485ea:/# exit
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
21
--net=host
docker@node:~$ docker run -it --net=host --rm ubuntu
root@node:/# ip link
--net=hostでコンテナ起動
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default
link/ether 8a:e1:25:43:12:77 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group
default qlen 1000
link/ether 38:63:bb:43:4b:c8 brd ff:ff:ff:ff:ff:ff
4: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen
1000
link/ether 8c:dc:d4:0e:33:68 brd ff:ff:ff:ff:ff:ff
ホストのインターフェースが見える!
ホスト名も共有
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
22
-v [host-dir]:[container-dir]
docker@node:~$ mkdir hoge
docker@node:~$ echo "volume test" > hoge/foo
docker@node:~$ cat hoge/foo
volume test
ホスト上の/home/docker/hogeディレクトを
コンテナ上の/hogeディレクトリに共有
docker@node:~$ docker run -it --rm -v /home/docker/hoge:/hoge ubuntu
root@80e7cb43d732:/# cat hoge/foo
volume test
root@80e7cb43d732:/# echo "container volume" >> hoge/foo
root@80e7cb43d732:/# cat hoge/foo
volume test
container volume
root@80e7cb43d732:/# exit
docker@node:~$ cat hoge/foo
volume test
container volume
docker@node:~$
コンテナ条の変更が
ホスト側にも反映されていることを確認
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
23
ハンズオン環境へのログイン
講師が指示する環境にSSHクライアントでログインして下さい
環境情報
• ホスト名
• IPアドレス
• ユーザ名
• パスワード
ishii:~$ ssh [email protected]
[email protected]'s password:
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-71-generic x86_64)
Last login: Fri Dec 11 04:59:21 2015 from xxx.xxx.xxx.xxx
xxxxxxx@xxx-xxxxxxx-x:~$
ブラウザで
http://IPアドレス/zabbix/
にアクセスしてログインして下さい
Zabbixユーザ: Admin
Zabbixパスワード: zabbix
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
24
システム更新演習パート1
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
演習パート1の要件
before
MySQLサーバを
バージョン5.6以降に
アップデートしたい
after
zabbix-server 2.4.7
php5
5.5.9
zabbix-server 2.4.7
php5
5.5.9
mysql-server
5.5.46
Apache2
2.4.7
mysql-server
5.6.28
Apache2
2.4.7
Ubuntu 14.04.3 server
Ubuntu 14.04.3 server
サーバー (VM)
サーバー (VM)
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
26
システム更新でよくある悩み
普通にアップデートするなら
sudo apt-get install mysql-server=5.6.28
ですが・・・
•
•
•
•
データは無事に引き継がれるだろうか・・・
システムの停止時間はどれくらいだろうか・・・
もしアップデートが失敗した場合に切り戻せるだろうか・・・
手順検証用に別のサーバを用意する余裕がない・・・
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
27
演習パート1の流れ
(1)コンテナ内で
MySQL 5.6を起動
zabbix-server 2.4.7
(3)現用系を
MySQL 5.6に切り替え
zabbix-server 2.4.7
zabbix-server 2.4.7
コンテナ
php5
5.5.9
Apache2
2.4.7
mysql
-server
5.5.46
Ubuntu 14.04.3 server
サーバー (VM)
コンテナ
php5
5.5.9
mysql
-server
5.6.28
php5
5.5.9
mysql
-server
5.6.28
Apache2
2.4.7
mysql
-server
5.5.46
Apache2
2.4.7
mysql
-server
5.5.46
Ubuntu 14.04.3 server (2)5.5から5.6へ
Ubuntu 14.04.3 server
データを移行
サーバー (VM)
この資料のURLは http://bit.ly/ood2015legacy
サーバー (VM)
Copyright©2014 NTT corp. All Rights Reserved.
28
(1)コンテナ内でMySQL 5.6を起動
rootユーザに変更
user@host:~$ su Password: [パスワードを入力]
最新版のDockerをインストール
root@host:~# curl https://get.docker.com/ | sh
MySQL 5.6.28 のコンテナイメージをダウンロード
root@host:~# docker pull mysql:5.6.28
コンテナを起動
root@host:~# docker run -itd --name mysql -v
/run/shm/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=handson
mysql:5.6.28
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
29
docker pullが終わらない場合
work aroundとして
root@host:~# cd /run/shm
root@host:/run/shm# wget http://10.10.2.252/mysql_5.6.28.tar.gz
root@host:/run/shm# docker import mysql_5.6.28.tar.gz mysql:5.6.28
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
30
(2)MySQL5.5から5.6へデータを移行
MySQL 5.5からZabbixのデータベースをファイルにダンプ
root@host:~# mysqldump -B zabbix-server -r /run/shm/data/dump.sql
コンテナの中に入り、ダンプファイルを読み込み、
Zabbix用のMySQLユーザとパスワードを設定する
root@host:~# docker exec -it mysql bash
root@container:~# cat /var/lib/mysql/dump.sql | mysql -phandson
root@container:~# mysql -phandson
mysql> GRANT ALL ON `zabbix-server`.* TO "zabbix-server" IDENTIFIED
BY "zabbix-server";
mysql> exit
root@container:~# exit
root@host:~#
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
31
(3)MySQL 5.6に切り替え
いったんコンテナを削除する
root@host:~# docker rm -f mysql
ホストOS上のMySQL 5.5を停止する
root@host:~# service mysql stop
ブラウザを再読み込みして、
DBアクセスエラーが出ることを確認する
TCP/3306番ポートをコンテナに転送する設定で、再度コンテナを起動する
root@host:~# docker run -itd --name mysql -v /data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=handson -p 3306:3306 mysql:5.6.28
ブラウザを再読み込みして、
正常に動作していることを確認する
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
32
システム更新演習パート2
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
演習パート2の要件
before
zabbix
-server
2.4.7
php5
5.5.9
Apache2
2.4.7
phpMyAdmin
4.5.0.2 を入れて
MySQLを管理したい
phpMyAdminには
php 5.6.9 が必要
Zabbix で使っている
PHP のバージョンは
変えたくない!!!
コンテナ"mysql"
after
phpMy
Admin
4.5.0.2
zabbix
-server
2.4.7
php5
5.6.9
php5
5.5.9
Apache2
2.4.7
コンテナ"mysql"
mysql
-server
5.6.28
mysql
-server
5.6.28
Ubuntu 14.04.3 server
Ubuntu 14.04.3 server
サーバー (VM)
サーバー (VM)
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
34
演習パート2の流れ
コンテナ
"phpmyadmin"
before
zabbix
-server
2.4.7
php5
5.5.9
phpMyAdmin
php 5.6.9
nginx
のセットをコンテナで
インストールする
Apache2
2.4.7
コンテナ"mysql"
after
phpMy
Admin
4.5.0.2
zabbix
-server
2.4.7
php5
5.6.9
php5
5.5.9
nginx
1.7.12
Apache2
2.4.7
コンテナ"mysql"
mysql
-server
5.6.28
mysql
-server
5.6.28
Ubuntu 14.04.3 server
Ubuntu 14.04.3 server
サーバー (VM)
サーバー (VM)
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
35
phpMyAdminをコンテナで起動する
phpMyAdminのコンテナイメージをダウンロード
root@host:~# docker pull corbinu/docker-phpmyadmin
コンテナを起動
root@host:~# docker run -itd --name phpmyadmin --link mysql:mysql -e
MYSQL_USERNAME=root -e MYSQL_PASSWORD=handson -p 8080:80
corbinu/docker-phpmyadmin
ブラウザで http://IPアドレス:8080/ にアクセスして
ユーザ名: root パスワード: handson
でログインできることを確認する
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
36
docker pullが終わらない場合
work aroundとして
root@host:~# cd /run/shm
root@host:/run/shm# wget http://10.10.2.252/phpmyadmin.tar.gz
root@host:/run/shm# docker import phpmyadmin.tar.gz corbinu/dockerphpmyadmin
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
37
まとめ
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
まとめ
• 既存システムを部分的・段階的にコンテナ化する手法を習得
• システム全体を一度にコンテナ化せずとも、コンテナ技術の恩恵を
受けられる
コンテナ技術の恩恵
• アプリケーションごとに実行環境(ライブラリのバージョン等)を分
離・固定化できる
• 本番環境への副作用が無い状態で、アップデートの検証が行える
• アップデート時のダウンタイムを最小化できる。切り戻しできるこ
とも保障される
この資料のURLは http://bit.ly/ood2015legacy
Copyright©2014 NTT corp. All Rights Reserved.
39