• 検索結果がありません。

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
39
0
0

読み込み中.... (全文を見る)

全文

(1)

今日からできる

レガシーシステムの段階的コンテナ化

NTTソフトウェアイノベーションセンタ

石井久治

(2)

背景/ねらい

• Docker/コンテナ系技術が熱いが、使っているのは、ほ

とんどWeb開発者ばかり

• 既存システム/レガシーシステムはブラックボックス化

していて、クラウドにすら乗せられていない

• 既存システムを一度にクラウド移行するのは無理でも、

段階的にコンテナ化

していけば、無理なくクラウド化し

ていけるのではないか

(3)

概要

• 既存システムを部分的・段階的にコンテナ化する手法を学ぶ

• システム全体を一度にコンテナ化せずとも、コンテナ技術の恩恵を

受けられる

コンテナ技術の恩恵

• アプリケーションごとに実行環境(ライブラリのバージョン等)を分

離・固定化できる

• 本番環境への副作用が無い状態で、アップデートの検証が行える

• アップデート時のダウンタイムを最小化できる。切り戻しできるこ

とも保障される

到達目標

• Linuxコンテナの基本知識を習得

• Dockerの基本的な使い方を習得

• 既存システムの一部分をDockerコンテナで置き換える方法を習得

(4)

概要

• 既存システムを部分的・段階的にコンテナ化する手法を学ぶ

• システム全体を一度にコンテナ化せずとも、コンテナ技術の恩恵を

受けられる

コンテナ技術の恩恵

• アプリケーションごとに実行環境(ライブラリのバージョン等)を分

離・固定化できる

• 本番環境への副作用が無い状態で、アップデートの検証が行える

• アップデート時のダウンタイムを最小化できる。切り戻しできるこ

とも保障される

到達目標

• Linuxコンテナの基本知識を習得

• Dockerの基本的な使い方を習得

• 既存システムの一部分をDockerコンテナで置き換える方法を習得

(5)

講義の流れ

コンテナ技術の基礎知識

Dockerの基本的な使い方

ハンズオン環境の確認

休憩

システム更新演習パート1

休憩

システム更新演習パート2

まとめ

座学

(6)

コンテナ技術の基礎知識

コンテナとは?

Dockerとは?

(7)

コンテナ

(8)

chroot

1983

FreeBSD

Jail

2000

LXC

2008

docker

2013

(9)

仮想化技術

物理マシン

OS

物理マシン

物理マシン

ハイパーバイザ

仮想

マシン

ゲストOS

OS

コンテナ コンテナ

仮想なし環境

ハイパーバイザ型

コンテナ仮想化

OS(の一部)を共有する仮想化

一つの物理マシン上に実行環境を作る技術

(10)

Linuxコンテナ仮想化すこし正確に

物理マシン

カーネル空間

ユーザ空間

プ ロ セ ス プ ロ セ ス プ ロ セ ス

仮想なし環境

物理マシン

カーネル空間

ユーザ空間

プ ロ セ ス プ ロ セ ス プ ロ セ ス プ ロ セ ス

コンテナ仮想化

コンテナはLinuxカーネルを共有

独立したリソースを割り当て,プロセス実行環境を分離

(11)

コンテナを実現する技術

Linuxカーネルが提供する機能

cgroups:

プロセスグループのリソース(CPU,メモリ,I/Oなど)利用量を制限する機能

capability:

root権限の一部だけをプロセスに与える機能

namespace:

独立した空間内にリソースを隔離する機能

- ファイルシステム

: Mount namespace

- ホストネーム

: UTS namespace

- プロセス間通信

: IPC namespace

- ユーザID(UID/GID)

: User namespace

- プロセスID

: PID namespace

(12)

Dockerがやること

アプリ実行環境を

イメージとして保存し,コンテナ上に展開する

例:Ubuntuイメージでやってること

ubuntuの最低限必要なファイルを持ってきて

コンテナでリソースを隔離して

設定を書いて(/etc/apt/sources.listなど)

/bin/bashを実行

(13)
(14)

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/

(15)

docker images

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

(16)

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

(17)

docker ps

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

起動中のコンテナを一覧表示

(18)

docker run

コンテナを起動

docker run [オプション] イメージ名 [コマンド]

オプション:

--name="コンテナ名"

コンテナ名を設定

-it

擬似端末を作成

-d

デタッチ状態で起動

(19)

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 /]#

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 コンテナ起動 起動中を確認 コンテナにアタッチ 「CTRL+P CTRL+Q」で コンテナからデタッチ docker execでコマンド実行 コンテナ停止 コンテナ削除

(20)

ネームスペースの共有

ネームスペースで各リソースを隔離

...しないこともできる

docker run のオプションで

--ipc=

共有先

IPC空間を共有

--net=

共有先

ネットワークを共有

--pid=

共有先

PIDを共有

-v [host-dir]:[container-dir] ディレクトリを共有

共有先

に“host”を指定すればホストと共有

コンテナIDを指定すればコンテナ間で共有

(21)

--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 ホストのインターフェース確認 普通にコンテナ起動 ホストと異なるコンテナ用 のインターフェース

(22)

--net=host

docker@node:~$ docker run -it --net=host --rm ubuntu root@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

--net=hostでコンテナ起動

ホストのインターフェースが見える! ホスト名も共有

(23)

-v [host-dir]:[container-dir]

docker@node:~$ mkdir hoge

docker@node:~$ echo "volume test" > hoge/foo docker@node:~$ cat hoge/foo

volume test

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:~$ ホスト上の/home/docker/hogeディレクトを コンテナ上の/hogeディレクトリに共有 コンテナ条の変更が ホスト側にも反映されていることを確認

(24)

ハンズオン環境へのログイン

講師が指示する環境に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

(25)
(26)

演習パート1の要件

before

サーバー (VM) Ubuntu 14.04.3 server mysql-server 5.5.46 php5 5.5.9 Apache2 2.4.7 zabbix-server 2.4.7

after

サーバー (VM) Ubuntu 14.04.3 server mysql-server 5.6.28 php5 5.5.9 Apache2 2.4.7 zabbix-server 2.4.7

MySQLサーバを

バージョン5.6以降に

アップデートしたい

(27)

システム更新でよくある悩み

普通にアップデートするなら

ですが・・・

• データは無事に引き継がれるだろうか・・・

• システムの停止時間はどれくらいだろうか・・・

• もしアップデートが失敗した場合に切り戻せるだろうか・・・

• 手順検証用に別のサーバを用意する余裕がない・・・

(28)

演習パート1の流れ

サーバー (VM) Ubuntu 14.04.3 server mysql -server 5.5.46 php5 5.5.9 Apache2 2.4.7 zabbix-server 2.4.7 サーバー (VM) Ubuntu 14.04.3 server mysql -server 5.5.46 php5 5.5.9 Apache2 2.4.7 zabbix-server 2.4.7 mysql -server 5.6.28 サーバー (VM) Ubuntu 14.04.3 server mysql -server 5.5.46 php5 5.5.9 Apache2 2.4.7 zabbix-server 2.4.7 mysql -server 5.6.28

コンテナ

コンテナ

(1)コンテナ内で

MySQL 5.6を起動

(2)5.5から5.6へ

データを移行

(3)現用系を

MySQL 5.6に切り替え

(29)

(1)コンテナ内でMySQL 5.6を起動

rootユーザに変更

最新版のDockerをインストール

MySQL 5.6.28 のコンテナイメージをダウンロード

コンテナを起動

root@host:~#

curl https://get.docker.com/ | sh

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

user@host:~$

su

(30)

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

(31)

(2)MySQL5.5から5.6へデータを移行

MySQL 5.5からZabbixのデータベースをファイルにダンプ

コンテナの中に入り、ダンプファイルを読み込み、

Zabbix用のMySQLユーザとパスワードを設定する

root@host:~#

mysqldump -B zabbix-server -r /run/shm/data/dump.sql

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

(32)

(3)MySQL 5.6に切り替え

いったんコンテナを削除する

ホストOS上のMySQL 5.5を停止する

TCP/3306番ポートをコンテナに転送する設定で、再度コンテナを起動する

root@host:~#

service mysql stop

root@host:~#

docker run -itd --name mysql -v /data:/var/lib/mysql

-e MYSQL_ROOT_PASSWORD=handson

-p 3306:3306

mysql:5.6.28

root@host:~#

docker rm -f mysql

ブラウザを再読み込みして、

DBアクセスエラーが出ることを確認する

ブラウザを再読み込みして、

正常に動作していることを確認する

(33)
(34)

演習パート2の要件

after

サーバー (VM) Ubuntu 14.04.3 server mysql -server 5.6.28

コンテナ"mysql"

php5 5.6.9 phpMy Admin 4.5.0.2

before

サーバー (VM) Ubuntu 14.04.3 server php5 5.5.9 Apache2 2.4.7 zabbix -server 2.4.7 mysql -server 5.6.28

コンテナ"mysql"

php5 5.5.9 Apache2 2.4.7 zabbix -server 2.4.7

phpMyAdmin

4.5.0.2 を入れて

MySQLを管理したい

phpMyAdminには

php 5.6.9 が必要

Zabbix で使っている

PHP のバージョンは

変えたくない!!!

(35)

演習パート2の流れ

after

サーバー (VM) Ubuntu 14.04.3 server mysql -server 5.6.28

コンテナ"mysql"

nginx 1.7.12 php5 5.6.9 phpMy Admin 4.5.0.2

コンテナ

"phpmyadmin"

before

サーバー (VM) Ubuntu 14.04.3 server php5 5.5.9 Apache2 2.4.7 zabbix -server 2.4.7 mysql -server 5.6.28

コンテナ"mysql"

php5 5.5.9 Apache2 2.4.7 zabbix -server 2.4.7

phpMyAdmin

php 5.6.9

nginx

のセットをコンテナで

インストールする

(36)

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

(37)

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/docker-phpmyadmin

(38)
(39)

まとめ

• 既存システムを部分的・段階的にコンテナ化する手法を習得

• システム全体を一度にコンテナ化せずとも、コンテナ技術の恩恵を

受けられる

コンテナ技術の恩恵

• アプリケーションごとに実行環境(ライブラリのバージョン等)を分

離・固定化できる

• 本番環境への副作用が無い状態で、アップデートの検証が行える

• アップデート時のダウンタイムを最小化できる。切り戻しできるこ

とも保障される

参照

関連したドキュメント

岩手県 ポワッソン・ブラン - 洋食専門店が作業効率改善により取組む新テイクアウト商品の開発 岩手県 有限会社幸楼

5) Goéré D, Glehen O, Quenet F, et al: Second-look surgery plus hyperthermic intraperitoneal chemotherapy versus surveillance in patients at high risk of developing

CleverGet Crackle 動画ダウンロードは、すべての Crackle 動画を最大 1080P までのフル HD

このうち、大型X線検査装置については、コンテナで輸出入される貨物やコンテナ自体を利用した密輸

放射性廃棄物処理配管における接続調査結果 8福島第二原子力発電所1号機 原子炉建屋

“〇~□までの数字を表示する”というプログラムを組み、micro:bit

名称 原材料名 添加物 内容量 賞味期限 保存方法.

建屋カバー改造 本格コンテナ 上部コンテナ 上部コンテナ改造 燃取カバー ※ 3 本格コンテナ1.