今日からできるレガシーシステムの段階的コンテナ化 NTT ソフトウェアイノベーションセンタ石井久治 Copyright 2014 NTT corp. All Rights Reserved.
背景 / ねらい Docker/ コンテナ系技術が熱いが 使っているのは ほとんど Web 開発者ばかり 既存システム / レガシーシステムはブラックボックス化していて クラウドにすら乗せられていない 既存システムを一度にクラウド移行するのは無理でも 段階的にコンテナ化していけば 無理なくクラウド化していけるのではないか Copyright 2014 NTT corp. All Rights Reserved. 2
概要 既存システムを部分的 段階的にコンテナ化する手法を学ぶ システム全体を一度にコンテナ化せずとも コンテナ技術の恩恵を受けられる コンテナ技術の恩恵 アプリケーションごとに実行環境 ( ライブラリのバージョン等 ) を分離 固定化できる 本番環境への副作用が無い状態で アップデートの検証が行える アップデート時のダウンタイムを最小化できる 切り戻しできることも保障される 到達目標 Linux コンテナの基本知識を習得 Docker の基本的な使い方を習得 既存システムの一部分を Docker コンテナで置き換える方法を習得 Copyright 2014 NTT corp. All Rights Reserved. 3
概要 既存システムを部分的 段階的にコンテナ化する手法を学ぶ システム全体を一度にコンテナ化せずとも コンテナ技術の恩恵を受けられる コンテナ技術の恩恵 アプリケーションごとに実行環境 ( ライブラリのバージョン等 ) を分離 固定化できる 本番環境への副作用が無い状態で アップデートの検証が行える アップデート時のダウンタイムを最小化できる 切り戻しできることも保障される 到達目標 Linux コンテナの基本知識を習得 Docker の基本的な使い方を習得 既存システムの一部分を Docker コンテナで置き換える方法を習得 Copyright 2014 NTT corp. All Rights Reserved. 4
講義の流れ コンテナ技術の基礎知識 Docker の基本的な使い方 座学 ハンズオン環境の確認 休憩 システム更新演習パート 1 休憩 システム更新演習パート 2 まとめ Copyright 2014 NTT corp. All Rights Reserved. 5
コンテナ技術の基礎知識 コンテナとは? Docker とは? Copyright 2014 NTT corp. All Rights Reserved.
コンテナ docker はコンテナ仮想化技術を使ったソリューション Copyright 2014 NTT corp. All Rights Reserved. 7
chroot FreeBSD Jail LXC docker 1983 2000 2008 2013 Copyright 2014 NTT corp. All Rights Reserved. 8
仮想化技術 一つの物理マシン上に実行環境を作る技術 ゲスト OS OS 物理マシン 仮想マシン ハイパーバイザ 物理マシン コンテナコンテナ OS 物理マシン 仮想なし環境ハイパーバイザ型コンテナ仮想化 OS( の一部 ) を共有する仮想化 Copyright 2014 NTT corp. All Rights Reserved. 9
Linux コンテナ仮想化すこし正確に プロセス プロセス プロセス プロセス プロセス プロセス プロセス ユーザ空間カーネル空間 物理マシン 仮想なし環境 ユーザ空間 カーネル空間 物理マシン コンテナ仮想化 コンテナは Linux カーネルを共有独立したリソースを割り当て, プロセス実行環境を分離 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 Copyright 2014 NTT corp. All Rights Reserved. 11
Docker がやること アプリ実行環境をイメージとして保存し, コンテナ上に展開する例 :Ubuntu イメージでやってること コンテナでリソースを隔離して ubuntu の最低限必要なファイルを持ってきて 設定を書いて (/etc/apt/sources.list など ) /bin/bash を実行 Copyright 2014 NTT corp. All Rights Reserved. 12
Docker の基本的な使い方 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/ Copyright 2014 NTT corp. All Rights Reserved. 14
docker images ローカルマシン上の docker イメージを一覧表示する docker@node:~$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE mysql latest b01706fbc5a4 5 days ago 359.9 MB debian latest 23cb15b0fcec 6 days ago 125.1 MB ubuntu latest e9ae3c220b23 4 weeks ago 187.9 MB busybox latest c51f86c28340 5 weeks ago 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 Copyright 2014 NTT corp. All Rights Reserved. 16
docker ps 起動中のコンテナを一覧表示 (-a オプション : 停止中のコンテナも表示 ) docker@node:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c97a5785ac25 debian "/bin/bash" 3 seconds ago Up 2 seconds debian1 917b22d24218 ubuntu "/bin/bash" 31 hours ago Up 31 hours web2 cad482fa6245 ubuntu "/bin/bash" 46 hours ago Up 46 hours web 03299a7e8d40 ubuntu "/bin/bash" 2 days ago Up 2 days app eb06fbba6f56 ubuntu "/bin/bash 2 days ago Up 2 days ubuntu1 Copyright 2014 NTT corp. All Rights Reserved. 17
docker run コンテナを起動 docker run [ オプション ] イメージ名 [ コマンド ] オプション : --name=" コンテナ名 " コンテナ名を設定 -it 擬似端末を作成 -d デタッチ状態で起動 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) [root@e0a6c8cdd0cb /]# コンテナにアタッチ CTRL+P CTRL+Q でコンテナからデタッチ 起動中を確認 docker@node:~$ docker exec test ps PID TTY TIME CMD 24? 00:00:00 ps docker@node:~$ docker kill test test docker@node:~$ docker rm test test docker exec でコマンド実行 コンテナ停止 コンテナ削除 Copyright 2014 NTT corp. All Rights Reserved. 19
ネームスペースの共有 ネームスペースで各リソースを隔離... しないこともできる docker run のオプションで --ipc= 共有先 IPC 空間を共有 --net= 共有先 ネットワークを共有 --pid= 共有先 PIDを共有 -v [host-dir]:[container-dir] ディレクトリを共有 共有先に host を指定すればホストと共有 コンテナ ID を指定すればコンテナ間で共有 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 ホストと異なるコンテナ用のインターフェース 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 ホストのインターフェースが見える! ホスト名も共有 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:~$ コンテナ条の変更がホスト側にも反映されていることを確認 Copyright 2014 NTT corp. All Rights Reserved. 23
ハンズオン環境へのログイン 講師が指示する環境に SSH クライアントでログインして下さい 環境情報 ホスト名 IPアドレス ユーザ名 パスワード ishii:~$ ssh xxxxxxx@xxx.xxx.xxx.xxx xxxxxxx@xxx.xxx.xxx.xxx'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 Copyright 2014 NTT corp. All Rights Reserved. 24
システム更新演習パート 1 Copyright 2014 NTT corp. All Rights Reserved.
演習パート 1 の要件 before after 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 php5 5.5.9 Apache2 2.4.7 mysql-server 5.6.28 Ubuntu 14.04.3 server Ubuntu 14.04.3 server サーバー (VM) サーバー (VM) Copyright 2014 NTT corp. All Rights Reserved. 26
システム更新でよくある悩み 普通にアップデートするなら sudo apt-get install mysql-server=5.6.28 ですが データは無事に引き継がれるだろうか システムの停止時間はどれくらいだろうか もしアップデートが失敗した場合に切り戻せるだろうか 手順検証用に別のサーバを用意する余裕がない Copyright 2014 NTT corp. All Rights Reserved. 27
演習パート 1 の流れ zabbix-server 2.4.7 (1) コンテナ内で MySQL 5.6 を起動 zabbix-server 2.4.7 (3) 現用系を MySQL 5.6 に切り替え zabbix-server 2.4.7 コンテナ コンテナ php5 5.5.9 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 Apache2 2.4.7 mysql -server 5.5.46 Ubuntu 14.04.3 server Ubuntu 14.04.3 server (2)5.5から5.6へデータを移行 Ubuntu 14.04.3 server サーバー (VM) サーバー (VM) サーバー (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 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 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:~# 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 ブラウザを再読み込みして 正常に動作していることを確認する Copyright 2014 NTT corp. All Rights Reserved. 32
システム更新演習パート 2 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 のバージョンは変えたくない!!! phpmy Admin 4.5.0.2 php5 5.6.9 zabbix -server 2.4.7 php5 5.5.9 Apache2 2.4.7 after コンテナ "mysql" mysql -server 5.6.28 コンテナ "mysql" mysql -server 5.6.28 Ubuntu 14.04.3 server サーバー (VM) Ubuntu 14.04.3 server サーバー (VM) Copyright 2014 NTT corp. All Rights Reserved. 34
演習パート 2 の流れ before コンテナ "phpmyadmin" after zabbix -server 2.4.7 php5 5.5.9 phpmyadmin php 5.6.9 nginx のセットをコンテナでインストールする phpmy Admin 4.5.0.2 php5 5.6.9 zabbix -server 2.4.7 php5 5.5.9 Apache2 2.4.7 nginx 1.7.12 Apache2 2.4.7 コンテナ "mysql" mysql -server 5.6.28 コンテナ "mysql" mysql -server 5.6.28 Ubuntu 14.04.3 server サーバー (VM) Ubuntu 14.04.3 server サーバー (VM) 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 でログインできることを確認する 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 Copyright 2014 NTT corp. All Rights Reserved. 37
まとめ Copyright 2014 NTT corp. All Rights Reserved.
まとめ 既存システムを部分的 段階的にコンテナ化する手法を習得 システム全体を一度にコンテナ化せずとも コンテナ技術の恩恵を受けられる コンテナ技術の恩恵 アプリケーションごとに実行環境 ( ライブラリのバージョン等 ) を分離 固定化できる 本番環境への副作用が無い状態で アップデートの検証が行える アップデート時のダウンタイムを最小化できる 切り戻しできることも保障される Copyright 2014 NTT corp. All Rights Reserved. 39