今日からできる
レガシーシステムの段階的コンテナ化
NTTソフトウェアイノベーションセンタ
石井久治
背景/ねらい
• Docker/コンテナ系技術が熱いが、使っているのは、ほ
とんどWeb開発者ばかり
• 既存システム/レガシーシステムはブラックボックス化
していて、クラウドにすら乗せられていない
• 既存システムを一度にクラウド移行するのは無理でも、
段階的にコンテナ化
していけば、無理なくクラウド化し
ていけるのではないか
概要
• 既存システムを部分的・段階的にコンテナ化する手法を学ぶ
• システム全体を一度にコンテナ化せずとも、コンテナ技術の恩恵を
受けられる
コンテナ技術の恩恵
• アプリケーションごとに実行環境(ライブラリのバージョン等)を分
離・固定化できる
• 本番環境への副作用が無い状態で、アップデートの検証が行える
• アップデート時のダウンタイムを最小化できる。切り戻しできるこ
とも保障される
到達目標
• Linuxコンテナの基本知識を習得
• Dockerの基本的な使い方を習得
• 既存システムの一部分をDockerコンテナで置き換える方法を習得
概要
• 既存システムを部分的・段階的にコンテナ化する手法を学ぶ
• システム全体を一度にコンテナ化せずとも、コンテナ技術の恩恵を
受けられる
コンテナ技術の恩恵
• アプリケーションごとに実行環境(ライブラリのバージョン等)を分
離・固定化できる
• 本番環境への副作用が無い状態で、アップデートの検証が行える
• アップデート時のダウンタイムを最小化できる。切り戻しできるこ
とも保障される
到達目標
• Linuxコンテナの基本知識を習得
• Dockerの基本的な使い方を習得
• 既存システムの一部分をDockerコンテナで置き換える方法を習得
講義の流れ
コンテナ技術の基礎知識
Dockerの基本的な使い方
ハンズオン環境の確認
休憩
システム更新演習パート1
休憩
システム更新演習パート2
まとめ
座学
コンテナ技術の基礎知識
コンテナとは?
Dockerとは?
コンテナ
chroot
1983
FreeBSD
Jail
2000
LXC
2008
docker
2013
仮想化技術
物理マシン
OS
物理マシン
物理マシン
ハイパーバイザ
仮想
マシン
ゲストOS
OS
コンテナ コンテナ仮想なし環境
ハイパーバイザ型
コンテナ仮想化
OS(の一部)を共有する仮想化
一つの物理マシン上に実行環境を作る技術
Linuxコンテナ仮想化すこし正確に
物理マシン
カーネル空間
ユーザ空間
プ ロ セ ス プ ロ セ ス プ ロ セ ス仮想なし環境
物理マシン
カーネル空間
ユーザ空間
プ ロ セ ス プ ロ セ ス プ ロ セ ス プ ロ セ スコンテナ仮想化
コンテナはLinuxカーネルを共有
独立したリソースを割り当て,プロセス実行環境を分離
コンテナを実現する技術
Linuxカーネルが提供する機能
cgroups:
プロセスグループのリソース(CPU,メモリ,I/Oなど)利用量を制限する機能
capability:
root権限の一部だけをプロセスに与える機能
namespace:
独立した空間内にリソースを隔離する機能
- ファイルシステム
: Mount namespace
- ホストネーム
: UTS namespace
- プロセス間通信
: IPC namespace
- ユーザID(UID/GID)
: User namespace
- プロセスID
: PID namespace
Dockerがやること
アプリ実行環境を
イメージとして保存し,コンテナ上に展開する
例:Ubuntuイメージでやってること
ubuntuの最低限必要なファイルを持ってきて
コンテナでリソースを隔離して
設定を書いて(/etc/apt/sources.listなど)
/bin/bashを実行
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/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
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
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
起動中のコンテナを一覧表示
docker run
コンテナを起動
docker run [オプション] イメージ名 [コマンド]
オプション:
--name="コンテナ名"
コンテナ名を設定
-it
擬似端末を作成
-d
デタッチ状態で起動
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でコマンド実行 コンテナ停止 コンテナ削除
ネームスペースの共有
ネームスペースで各リソースを隔離
...しないこともできる
docker run のオプションで
--ipc=
共有先
IPC空間を共有
--net=
共有先
ネットワークを共有
--pid=
共有先
PIDを共有
-v [host-dir]:[container-dir] ディレクトリを共有
共有先
に“host”を指定すればホストと共有
コンテナIDを指定すればコンテナ間で共有
--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 ホストのインターフェース確認 普通にコンテナ起動 ホストと異なるコンテナ用 のインターフェース
--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でコンテナ起動
ホストのインターフェースが見える! ホスト名も共有
-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ディレクトリに共有 コンテナ条の変更が ホスト側にも反映されていることを確認
ハンズオン環境へのログイン
講師が指示する環境に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:~$