今日からできる レガシーシステムの段階的コンテナ化 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
© Copyright 2024 ExpyDoc