そろそろ知っておきたい!!コンテナ技術とdockerのキホン

111
そろそろ知っておきたい!! コンテナ技術と Dockerのキホン NTTアドバンステクノロジ株式会社 アプリケーションソリューション事業本部 長住 直樹

Upload: naoki-nagazumi

Post on 07-Aug-2015

1.939 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

そろそろ知っておきたい!!

コンテナ技術と Dockerのキホン

NTTアドバンステクノロジ株式会社

アプリケーションソリューション事業本部

長住 直樹

Page 2: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

自己紹介 長住 直樹(ながずみ なおき)/ Twitter @nk_ngzm

NTTアドバンステクノロジ株式会社 アプリケーションソリューション事業本部

社内で技術者育成活動(通称:CORETECH)を推進しています。

Page 3: そろそろ知っておきたい!!コンテナ技術とDockerのキホン
Page 4: そろそろ知っておきたい!!コンテナ技術とDockerのキホン
Page 5: そろそろ知っておきたい!!コンテナ技術とDockerのキホン
Page 6: そろそろ知っておきたい!!コンテナ技術とDockerのキホン
Page 7: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Linux Container

Linuxカーネルが持つ機能を使って実現するコンテナ。

略して、LXCと表記することもある。

Page 8: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

ここで、VMのおさらい

VMは、コンピュータの上で動くOSやVMを実現するためのハイパーバイザの上で、実際のハードウェアをエミュレートするVMが動きます。つまり実際の物理的なコンピュータと同じようなものがソフトウェアによって実現されているので、このVMを使うにはOSが必要になります。つまり、物理的なコンピュータ上で動くOSの上でさらにOSが動きます。

引用: http://gihyo.jp/admin/serial/01/linux_containers/0002

Page 9: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

対してコンテナの原理

起動する全てのプロセスはコンピュータ上にインストールされたOS(ホストOS)上で直接起動します。通常のプロセスの動作と異なるのは、そのプロセスの一部をグループ化し、他のグループやグループに属していないプロセスから隔離した空間で動作させる点です。貨物輸送のコンテナのように、隔離された空間にプロセスが入っているので、この空間を『コンテナ』と呼ぶわけです。実際のコンテナのように、あるコンテナの内部から他のコンテナの内部を見ることはできません。

引用: http://gihyo.jp/admin/serial/01/linux_containers/0002

Page 10: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

コンテナを実現するカーネル機能

名前空間とも呼ばれ、マウント、ホスト・ドメイン名、プロセス空間、ソケットやメッセージキューの空間、ユーザ・グループ、ネットワークなどの名前空間ごとに識別・隠蔽できる機能。例えば、マウント名前空間を使うと、名前空間内で行ったマウント操作を他の名前空間には反映させないといったことができる。すなわち,コンテナ内でマウント操作を行った場合、そのマウントはホストOSや他のコンテナからは見ない。

名前空間の名前 隔離されるリソース 実装されたカーネルバージョン

マウント名前空間 マウントの集合,操作 2.4.19

UTS名前空間 ホスト名,ドメイン名 2.6.19

PID名前空間 プロセスID(PID) 2.6.24

IPC名前空間 SysV IPCオブジェクト,POSIXメッセージキュー 2.6.19

ユーザ名前空間 UID,GID 3.8

ネットワーク名前空間 ネットワークデバイス,アドレス,ポート,ルーティングテーブル,フィルタなど

2.6.26

Page 11: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

コンテナを実現するカーネル機能

「Control Group」の略。プロセスをグループ化して,そのグループ内に存在するプロセスに対して、たとえば、CPUやメモリなどのリソースに制限を行うなど、グループ単位のリソース管理が行える機能。

サブシステム 機能

blkio ブロックデバイスの入出力アクセスを制御 (Read <= N bytes/sec)

cpu スケジューラにより CPU のアクセスを制御

cpuset マルチコアの場合に利用する CPU, メモリノードを制御

devices デバイスへのアクセス制御

freezer 処理の一時停止, 再開

memory メモリリソースの制御

hugetlb N byteまでとかの制限

net_cls Linux トラフィックコントローラ (tc) がパケットを識別できるよう, クラス識別子 (classid) によりネットワークパケットにタグをつける

net_prio NIC 別にトラフィックのプライオリティを設定する

Page 12: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

コンテナを実現するカーネル機能

ルートディレクトリを、任意の特定のディレクトリに変更できる機能。

chroot 内で起動されるプロセスは、設定された任意の場所をルートディレクトリとして動作するため、その範囲外のディレクトリやファイルへは一切アクセスできなくなる。

/

lib bin usr home etc

bin lib

chroot → /

etc usr

Page 13: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

コンテナを実現するカーネル機能

netns(Linux Network Namespace)は、ホストサーバ内に、仮想的ブリッジ「br0」と、「veth」と呼ばれる直結した仮想NICのペアからなる仮想ネットワークを構築する。コンテナ毎に独立した veth が生成され、その片側をコンテナ内部のイーサネット「eth0」として割り当てる。

引用 : http://www.school.ctc-g.co.jp/columns/nakai/nakai41.html

Page 14: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

デモ(その1)

chroot を使ったルートファイルシステムの隔離

Page 15: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

chroot

/

lib bin usr demo etc

bin lib

chroot → /

etc usr

Page 16: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

chroot

新たな ルートディレクトリの作成

bashの動作に最低限必要な環境を新たな ルートディレクトリ配下にコピー

新たなルートディレクトリでbashを動かす

$ sudo mkdir -p /demo/chroot

$ sudo cp -pr /bin /lib /lib64 /usr /etc /demo/chroot/

$ sudo chroot /demo/chroot /bin/bash

Page 17: そろそろ知っておきたい!!コンテナ技術とDockerのキホン
Page 18: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

LXC

Linuxカーネルの機能のみを用いてコンテナの操作を行うソフトウェアとして、2008年ごろから linuxcontainers.orgで 開発されている。

Linuxカーネルにパッチを当てたりすることなく、カーネルに実装されているコンテナに関する機能を前提にして簡単にコンテナの操作が行える。

Page 19: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Container と LXC

LXCという用語は以下の2つの意味で使われることがある。

I. Linuxカーネルが持つ機能を使って実現するコンテナという一般的な意味で使う場合

II. linuxcontainers.org で開発されているコンテナを扱うためのソフトウェアという狭い意味

本講習会では、前者の意味では「Container/コンテナ」、後者の意味では「LXC」と区別して説明する。

Page 20: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

ちなみに、LXC以外には?

LXC以外の代表的なコンテナ方面のソフトウェア。

Linuxカーネルにコンテナ関連の技術が充分に実装されていない頃から、カーネルにパッチを当ててコンテナを実現してきた本分野のパイオニア的ソフトウェア。現在Linuxカーネルに実装されているコンテナ機能にはOpenVZ由来のものが数多くある。なお、これをベースとした商用ソフト「Virtuozzo」は、現在でも、世界中のホスティングサービスで広く使われている。

Cloud Foundry というPaaSを構築できるソフトウェアで、その心臓部といえるコンテナ機能を提供するコンポーネント。

主に、Linux kvm サーバ仮想化環境を管理するツールであるが、Linuxコンテナにも対応している。

Page 21: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

デモ(その2)

LXCを使用したコンテナの利用

Page 22: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

LXCの利用条件

LXCのインストールには、ubuntu OSがお勧め、出来る限り ubuntu14.04 以降のバージョンを使用すること。

centos など RedHat系OSにもインストールできるようであるが、ubunutに比べて環境設定が激しく面倒くさい。(インストーラでいろいろやってくれない)

LXCは、root ユーザで操作する必要がある。

Page 23: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

デモ環境

ホスト ubuntu 14.0.4 trusty / 64bit Kernel 3.13.0-48-generic

lxc version 1.0.7-0ubuntu0.1

Page 24: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

LXC インストール

ubuntuの場合、以下のコマンド一発でインストールが終わる。

ubuntu01という名前でubuntuベースのコンテナ作成

※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。

$ sudo apt install lxc

$ sudo lxc-create -t ubuntu -n ubuntu01

Page 25: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

LXCでコンテナ作成

LXCコンテナは、仮想マシンのようにDVDなどのISOイメージからインストールすることはできない。

従って、LXCには、コンテナを作成するためのスクリプトとしてテンプレートが付属しており、テンプレートを使って、コンテナイメージを作成する。

また、 lxc-downloadという名前のテンプレートが付属しており、あらかじめ構築されたコンテナイメージをLXCのサイトからダウンロードしてコンテナを作成することも可能である。

Page 26: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

コンテナ起動と停止

ubuntu01 という名前のコンテナを起動

起動したコンテナに接続(その1)

起動したコンテナに接続(その2)

起動したコンテナを停止

$ sudo lxc-start -n ubuntu01 -d

$ sudo lxc-attach -n ubuntu01

$ sudo lxc-stop -n ubuntu01

$ sudo lxc-console -n ubuntu01

Page 27: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

その他の基本操作 作成したコンテナの一覧を見る

ubuntu01 という名前のコンテナの情報を見る

$ sudo lxc-ls ubuntu01

$ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART --------------------------------------------- ubuntu01 RUNNING 10.0.3.18 - NO

$ sudo lxc-info -n ubuntu01 Name: ubuntu01 State: RUNNING PID: 26948 ... ...

Page 28: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

その他の基本操作

ubuntu01コンテナをubuntu02という名前でクローン

ubuntu02 という名前のコンテナを削除

その他、メモリやCPU、ディスクなどのコンテナ・リソースを制御するコマンド(lxc-cgroup)などがある。

$ sudo lxc-clone -o ubuntu01 -n ubuntu02

$ sudo lxc-destroy -n ubuntu02

Page 29: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

入門編

Page 30: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker

「Docker」は、米国 Docker社(旧dotCloud)が開発するオープンソースのコンテナ管理ソフトウェアのひとつ。Go言語で実装されている。

軽量な仮想化環境であるコンテナを提供し、アプリケーション実行環境をそのまま Dockerイメージとして保存できる。

Page 31: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker

仮想サーバではなくアプリケーションに最適化されているため、原則的に、ひとつのコンテナに、ひとつのアプリケーションが実行する構成となる。

さらに、Dockerは、ネットワーク、ストレージ、ロギング、ディストリビューションなどマシン特有の設定を抽象化しているため、どんなマシンへも、どんな構成でも実行でき、ポータブルデプロイを実現できる。

Page 32: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

LXCとDocker

もともとDockerは、LXCを経由してLinuxコンテナ機能を利用していた。

Docker Ver0.9 より、libcontainer という独自のライブラリを経由するように改良。

現在でもオプションでLXCを選択することが可能。

引用 : https://blog.docker.com/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/

Page 33: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

AUFS

AUFS(Another Union FS)とは、レイヤ構造のファイルシステムである。

親のファイルシステムをリード・オンリーとし、その上にライタブルなレイヤを重ねていく。

こうして複数のレイヤを積み重ね、レイヤを通じて、ひとつのファイルシステムのように扱う。

親コンテナからの差分管理ができるため、コンテナイメージの容量を軽量化できる。

Page 34: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

AUFS

親コンテナからの差分管理ができるため、コンテナイメージの容量を軽量化できる。

引用 : http://gesellix.github.io/gradle-summit-2014/

Page 35: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

DockerイメージとDockerコンテナ

Dockerイメージとは、Docker コンテナ生成のベースとなるひな形。代表的な例として ubuntu や centos 等のディストリビューションがイメージ化されている。

Dockerコンテナとは、あるDockerイメージをベースにして個別アプリケーションの環境をセットアップして作成するコンテナ実行環境。

Docker コンテナ

Docker イメージ

Docker イメージ

docker run

docker commit

Page 36: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker Hub

Docker社は、Docker Hub というクラウド上のリポジトリを提供しており、様々な団体や個人が作成した Dockerイメージを利用したり、自分で作成したイメージを共有することが可能。

https://hub.docker.com/

Docker コンテナ

Docker イメージ

Docker イメージ

docker run

docker commit

docker pull

docker push

Page 37: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

デモ(その3)

Dockerの基礎的な利用方法

Page 38: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker の利用条件

Docker をインストールできる環境は、 Red Hat系 OS もしくは ubuntu系 OS であること、および 64bitマシン+OS であること。

カーネルが古いとうまく動作しないので、インストール前に 最新バージョンにアップ・トゥ・デートしておくこと

Dockerは、root ユーザ で操作する必要がある。

Page 39: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

デモ環境

ホスト cnetos 6.6 / 64bit Kernel 2.6.32-504.el6.x86_64

docker version 1.4.1, build 5bc2ff8/1.4.1

Page 40: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker インストール

centos 6.6 へインストール

centos 6.6 で自動起動設定(必要に応じて)

※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。

$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 $ sudo yum -y install ¥ http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

$ sudo yum install docker-io

$ sudo chkconfig docker on

Page 41: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker インストール

centos 7系 へインストール

centos 7系 で自動起動設定(必要に応じて)

※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。

$ sudo yum install docker

$ sudo systemctl enable docker.service

Page 42: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker インストール

ubuntu 14.04 LTS へインストール

ubuntu 14.04 LTS で自動起動設定(必要に応じて)

※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。

$ sudo apt install docker.io

$ sudo update-rc.d docker.io defaults

Page 43: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker イメージ取得

centos 最新版のDockerイメージをDL

ubuntu 最新版のDockerイメージをDL

ubuntu 12.04 DockerイメージをDL

$ sudo docker pull ubuntu:latest

$ sudo docker pull ubuntu:12.04

$ sudo docker pull centos:latest

※社内ネットワークを経由する場合は、別途 DNSサーバの設定と Proxy設定が必要。

Page 44: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker イメージ管理

Dockerイメージの一覧表示

DLした ubuntu 12.04 イメージを削除

$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos latest 214a4932132a 40 hours ago 229.6 MB ubuntu latest d0955f21bf24 3 weeks ago 192.7 MB ubuntu 12.04 9c5e4be642b7 3 weeks ago 132.1 MB

$ sudo docker rmi ubuntu:12.04

$ sudo docker rmi [IMAGE ID で指定することも可能]

Page 45: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ生成+起動

centos 最新版イメージから centos01という名前でコンテナを作成、そして、アプリケーションに bash を指定して実行する

Dockerコンテナ centos の bash に入る

Dockerコンテナの bash を exit するとコンテナ自体も終了する

$ sudo docker run -i -t --name centos01 centos:latest /bin/bash

[コンテナ内のbashでいろいろ操作] ... ...

# exit (bash を exit)

Page 46: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ生成+起動

ubuntu 最新版イメージから ubuntu01 という名前でコンテナを作成、同じくアプリケーションに bash を指定して実行

Dockerコンテナ ubuntu の bash に入る

コンテナの bash を exit するとコンテナも終了する

$ sudo docker run -it --name ubuntu01 ubuntu /bin/bash

Page 47: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ生成+起動

docker run コマンド書式

# docker run ¥ [オプション] ¥ [--name コンテナ名] ¥ イメージ名 [:タグ名] ¥ [コンテナで実行するコマンドとその引数]

Page 48: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ生成+起動

docker run の主なオプション

option 説 明

-d コンテナをバックグラウンドで実行する。 WebサーバやDBサーバなど、デーモン系のプロセスを常時実行するコンテナの場合に指定する。

-i コンテナの標準入力を開く。 /bin/bashなどでコンテナを対話で操作する場合に指定する。

-t 端末デバイス(tty)を確保する。-iと同時に使用することが多い。 /bin/bashなどでコンテナを対話で操作する場合に指定する。

-p "-p ホスト側ポート:コンテナ側ポート" で、Dockerサーバとホストサーバ間のポートマッピングを構成する

Page 49: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ生成+起動

Docker は、仮想サーバではなくアプリケーションに最適化されているため、原則的に、ひとつのコンテナに、ひとつのアプリケーションが実行する構成となる。

すなわち、Dockerは、docker run で作成したコンテナ内で、同コマンドで指定するひとつの アプリケーションを実行する。

指定したアプリケーションが exit すると同時にそのDockerコンテナも 停止 する。

Page 50: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

デタッチ/アタッチ

centos02コンテナを作成してbashを起動

Dockerコンテナをデタッチ

Dockerコンテナにアタッチ

再び、Dockerコンテナに入る

bash を exit でコンテナを終了

$ sudo docker run -it --name centos02 centos:latest /bin/bash

コンテナ内で [Ctrl] + [p] → [Ctrl] + [q] キーを押下

$ sudo docker attach centos02

Page 51: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ管理

既存コンテナ centos02 を再起動

docker start コマンド書式

$ sudo docker start –i centos02

# docker start [-i] {コンテナ名|コンテナID}

option 説 明

-i コンテナの標準入力を開く。 /bin/bashなどでコンテナを対話で操作する場合に指定する。

Page 52: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ管理

Docker コンテナ一覧(動いているものだけ)表示

止まってるものを含め全部の一覧

$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e9b0b2759ec centos:latest "/bin/bash" 4 minutes ago Up 50 seconds centos02

$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e9b0b2759ec centos:latest "/bin/bash" 6 minutes ago Up 3 minutes centos02 1352f3ef1c8b ubuntu:latest "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago ubuntu01 cc8c0601370d centos:latest "/bin/bash" 13 minutes ago Exited (0) 12 minutes ago centos01

Page 53: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ管理

起動中の centos02コンテナを停止

Docker コンテナの削除

$ sudo docker stop centos02

$ sudo docker stop [container ID で指定することも可能]

$ sudo docker rm centos02

$ sudo docker rm [container ID で指定することも可能]

Page 54: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

カスタム Docker イメージ作成

Docker コンテナ

Docker イメージ

Docker イメージ

docker run docker commit

Docker コンテナ

docker run

httpd install

httpd 起動

with httpd

Page 55: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

カスタム Docker イメージ作成

centos03 コンテナを作成して bashで起動

Dockerコンテナのシェルに入る

centos03コンテナに httpd をインストール

Ctrl+p+q で Dockerコンテナをデタッチ

[コンテナ内のbashで操作] # yum install -y httpd

$ sudo docker run -it --name centos03 centos:latest /bin/bash

※社内ネットワークを経由する場合は、コンテナ内部のサーバに対する Proxy設定が必要。

Page 56: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

カスタム Docker イメージ作成

centos03 コンテナを停止

Apache をインストールした centos03 コンテナから「hoge/httpd」という名前の新たな Dockerイメージを作成

$ sudo docker stop centos03

$ sudo docker commit centos03 hoge/httpd

Page 57: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

カスタム Docker イメージ作成

docker commit コマンド書式

# docker commit ¥ {コンテナ名|コンテナID} ¥ [ユーザ名/]イメージ名

Page 58: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

カスタム Docker イメージ作成

docker imagesで、作成したイメージを確認

$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hoge/httpd latest 140390d72115 13 seconds ago 311.2 MB centos latest 0114405f9ff1 6 hours ago 229.6 MB ubuntu latest d0955f21bf24 3 weeks ago 192.7 MB

Page 59: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

カスタム Docker イメージ作成

作成した hoge/httpd イメージを元に、web01というコンテナを作成、バックグラウンドモードで起動する

docker ps で起動確認

ホストの8080ポートにアクセスしてテスト!

$ curl localhost:8080

$ sudo docker run -d -p 8080:80 --name web01 ¥ hoge/httpd /usr/sbin/httpd -D FOREGROUND

Page 60: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker コンテナ管理

バックグラウンドで起動中の web01コンテナに接続

バックグラウンドで起動中の web01コンテナを停止

$ sudo docker exec -it web01 /bin/bash

$ sudo docker stop web01

$ sudo docker stop [container ID で指定することも可能]

Page 61: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker Hub でイメージ共有

Docker Hub のアカウントを作成

Docker Hubにログイン

Docker Hub に先ほど作成した「hoge/httpd」イメージをPUSH

$ sudo docker login

$ sudo docker push hoge/httpd

https://www.docker.com/

Page 62: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

実践編

Page 63: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Dockerfile

Dockerには、Dockerコンテナの構成情報をテキスト形式で記述できる「Dockerfile」という仕様がある。

そして、Dockerfile を解釈し Dockerイメージを作成する「docker build」コマンドが用意されている。

Dockerfile

docker build

Docker イメージ

Page 64: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Dockerfile

FROM ubuntu MAINTAINER hoge<[email protected]> RUN apt-get install -y httpd EXPOSE 80 CMD ["httpd", "-D" "FOREGROUND"]

① ubuntu(latest)をベースとする

② 管理者はhoge <[email protected]>

③ httpdをインストール

④ ポート80番をオープン

⑤ httpdサーバをフォアグランドに起動(上書き可能)

以上の手順が実行された Docker イメージを作成

Page 65: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Dockerfile

コマンド 意味

FROM 元となるDockerイメージの指定

MAINTAINER 作成者の情報

RUN コマンドの実行

ADD ファイル/ディレクトリの追加

CMD コンテナーの実行コマンド 1

ENTRYPOINT コンテナーの実行コマンド 2

WORKDIR 作業ディレクトリの指定

ENV 環境変数の指定

USER 実行ユーザーの指定

EXPOSE ポートのエクスポート

VOLUME ボリュームのマウント

Page 66: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Dockerイメージのビルド

Dockerfile をビルドし hoge/ubu:1.0 という Dockerイメージを生成

$ cd [Dockerfileがあるディレクトリ]

$ sudo docker build –t hoge/app:1.0 ./

Dockerfile docker build

Docker イメージ

hoge/app:1.0

Page 67: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Dockerイメージのビルド

docker build 書式

# docker build ¥ [-t ユーザ名/イメージ名[:タグ名]] ¥ Dockerfile格納ディレクトリ

Page 68: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker

Dockerイメージのビルド

Page 69: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Data Volume

複数のコンテナ間で永続的なデータや共有データを扱うための特別なヴォリューム (ディレクトリ)。

Data Volume に対する変更は直接反映され、イメージの変更に含まれない。

Data Volume は参照するコンテナがなくなっても存続する。

Page 70: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Data Volume

ホストとのヴォリューム共有

引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker

Page 71: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Data Volume

ホストの /opt/test-app/ をコンテナの /app としてマウントさせる

$ sudo docker run -it -v /opt/test-app:/app ubuntu /bin/bash

ホスト側 マウントされるディレクトリ

コンテナ側 マウントディレクトリ

Page 72: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Data Volume Container

コンテナ間のヴォリューム共有

引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker

-v /var/volume1

-v /var/volume2

Data Volume Container

Page 73: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Data Volume Container /var/volume を共有するデータボリュームコン

テナを生成+起動する

上記コンテナの /var/volume を共有するコンテナを生成+起動する

$ sudo docker run -it -v /var/volume --name vol1 ubuntu /bin/bash

$ sudo docker run -it --volumes-from vol1 ubuntu /bin/bash

FROM ubuntu ... ... VOLUME ["/var/volume"] CMD ["/bin/bash"]

Page 74: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Data Volume Container

ユーザデータなど、壊せない情報の格納場所として Data Volume Container を利用する。

Webサーバ コンテナ

APサーバ コンテナ

DBサーバ コンテナ

Data Volume コンテナ

ログ保存先 Volume

DB データ格納 Volume

Page 75: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

ネットワークポートマッピング

コンテナを起動するときに、コンテナ内部で使用するポートを、任意のホスト側ポート番号 (49152以降推奨)に割り当てることができる。

ホスト側のポート番号は、49000 ~ 49900 の範囲で自動的にランダムな番号を割り当てたり、ユーザが任意の番号を指定したりすることが可能。

ホスト コンテナ

IP :X PORT:X

IP :Y PORT:Y

ポート マッピング

Page 76: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

ネットワークポートマッピング

コンテナ内でオープンしているポートをホスト側ランダムなポート番号にマッピング

コンテナのポート22がホストのどのポートにマッピングされたか知る方法

$ sudo docker run -d -P ubuntu:latest /usr/sbin/sshd -D

$ sudo docker port [コンテナID] 22

$ sudo docker run -d -p 22 ubuntu:latest /usr/sbin/sshd -D

Page 77: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

ネットワークポートマッピング

コンテナのポート22をユーザが指定するホスト側ポート番号2222にマッピング

$ sudo docker run -d -p 2222:22 ubuntu:latest /usr/sbin/sshd -D

ホスト

コンテナ

IP :X

PORT:2222 IP :Y

PORT:22 ポート

マッピング

ホスト側ポート コンテナ側ポート

Page 78: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

コンテナ・リンク

複数のコンテナ間で、専用のネットワークを構築することができる。

コンテナA (コンテナBに接続)

コンテナB (リンク元)

Page 79: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

コンテナ・リンク

リンク元のコンテナA

コンテナAに接続するコンテナB

$ sudo docker run –d --name pg ubuntu:latest postmaster -D /usr/local/pgsql/data

$ sudo docker run -d --link pg:db ubuntu:latest /someService

コンテナB

環境変数

DB_PORT_5432_TCP_ADDR=172.17.0.2 DB_PORT=tcp://172.17.0.2:5432 DB_5432_TCP=tcp://172.17.0.2:5432 DB_PORT_5432_TCP_PORT=5432

/etc/hosts

172.17.0.2 db

Page 80: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

デモ(その4)

Dockerを使用した

書籍管理アプリケーション実行環境構築

Page 81: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

デモ環境

ホスト cnetos 6.6 / 64bit Kernel 2.6.32-504.el6.x86_64

docker version 1.4.1, build 5bc2ff8/1.4.1

基本編と 同じ環境

Page 82: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

ホストサーバ

Data Volume

完成イメージ

APサーバ コンテナ

Tomcat

DBサーバ コンテナ

postgresql

データベース ファイル

ログ ファイル

ポート フォワード

8080:8080

コンテナ リンク

DB接続

利用者

簡易版書籍管理 アプリケーション

Page 83: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Data Volume

DBサーバ構築

postgreSQL 構築用

Dockerfile

docker build

PostgreSQL Dockerイメージ

hoge/postgres:1.0

DB初期化用 コンテナ

データベースファイル

PostgreSQL 実行コンテナ

DBファイル

初期化

Page 84: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

DBサーバのDockerfile

DBサーバ構築

FROM centos:latest MAINTAINER hoge <[email protected]> # postgerSQL セットアップ RUN yum -y install postgresql-server # PORT 開放 EXPOSE 5432 # コンテナ実行コマンド CMD su - postgres -c "postgres -D /var/lib/pgsql/data"

Page 85: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

DBサーバイメージ(hoge/postgres)ビルド

Data Volume を格納するディレクトリをホストに作成

DBサーバ構築

$ sudo docker build -t hoge/postgres:1.0 [dockerfile格納DIR]

$ sudo mkdir -p /docker_mnt/pgsql/data

Page 86: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

DBサーバ構築

Postgresql初期セットアップ用コンテナ起動

Postgresqlの初期セットアップ

$ sudo docker run -it --rm ¥ -v /docker_mnt/pgsql/data:/var/lib/pgsql/data ¥ hoge/postgres:1.0 /bin/bash

[コンテナ内のbashで操作] # chown -R postgres:postgres /var/lib/pgsql/data # su - postgres $ initdb --encoding=UTF8 --no-locale $ pg_ctl -D /var/lib/pgsql/data start $ psql・・ 必要に応じてDBオブジェクトを構築し当該コンテナを終了

PostgreSQL初期セットアップは、Data Volumeに格納されるデータベースファイルを作成するものである。このため、本作業は最初に一度だけ行えば良い。

Page 87: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

DBサーバ構築

DBサーバコンテナ生成してPostgrrSQLを起動

$ sudo docker run -d ¥ -v /docker_mnt/pgsql/data:/var/lib/pgsql/data ¥ -p 5432:5432 --name db01 hoge/postgres:1.0

実行コマンドの指定がない場合Dockerfile の CMD で定義したコマンドが起動する

Page 88: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Data Volume

APサーバ構築

Tomcat 構築用

Dockerfile

docker build

Tomcat Dockerイメージ

hoge/tomcat:1.0

ログファイル

Tomat 実行コンテナ

Page 89: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

APサーバ構築 APサーバのDockerfile

FROM centos:latest MAINTAINER hoge # Tomcat セットアップ RUN yum -y install tomcat RUN echo 'export CATALINA_BASE="/usr/share/tomcat"' >> /root/.bashrc # Tomcat 起動スクリプトをコピー ADD tomcat_start.sh /usr/bin/ RUN chmod a+x /usr/bin/tomcat_start.sh # 書籍管理アプリをデプロイ ADD bookmgr.war /usr/share/tomcat/webapps/ # PORT 開放 EXPOSE 8080 # コンテナ実行コマンド ENTRYPOINT ["/usr/bin/tomcat_start.sh"]

Page 90: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

APサーバ構築

(参考)tomcat_start.sh

#! /bin/bash export CATALINA_BASE="/usr/share/tomcat" /usr/sbin/tomcat start trap '/usr/sbin/tomcat stop; sleep 2; exit 0' TERM while : do sleep 1 done

Page 91: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

APサーバ構築

APサーバイメージ(hoge/tomcat)ビルド

Data Volume を格納するディレクトリをホストに作成

$ sudo docker build -t hoge/tomcat:1.0 [dockerfile格納DIR]

$ sudo mkdir -p /docker_mnt/tomcat/logs $ sudo chmod a+w /docker_mnt/tomcat/logs

Page 92: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

APサーバ構築

APサーバコンテナを生成、Tomcat を起動

$ sudo docker run -d ¥ -v /docker_mnt/tomcat/logs:/usr/share/tomcat/logs ¥ -p 8080:8080 --link db01:db ¥ --name ap01 hoge/tomcat:1.0

Dockerfile の ENTRYPOINTで定義した 起動コマンドは docker run で別のコマンドに変更することができない。

Page 93: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

活用のススメ

Page 94: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker の利点

コンテナなのでオーバヘッドが少なく、動作が軽い

コンテナイメージを手軽にやり取りできる

コンテナは様々な環境で等しく動く

各コンテナは、いろいろなディストリビューションやバージョンで構成できる

コンテナ(インフラ)をコードで表現できる

Page 95: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

利点を生かすためには

コンテナ内で動くアプリケーションは、できるだけシンプルなものであること。

複数のコンテナで動く、アプリケーションはできるだけ疎結合に連携すること。

各アプリケーションは、ステートレスな作りであること。

ユーザデータなどの保存先は分離できること。

Page 96: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

マイクロ・サービス

ひとつのアプリケーションを、大きな一枚岩の塊ではなく、複数の軽量なサービスを連携させたアーキテクチャで実現する。

各サービスはそれぞれのプロセスで動き、サービス間のメッセージは、HTTP経由でAPI呼び出しされるか、RabbitMQやZeroMQといった軽量メッセージングシステムによる通信で交換される。

サービスごとに言語やデータベースなどは統一されず、個別に適切なものが選択される。また、サービスごとにデータを持ち、統合されていない。

Page 97: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

どんなシステムに使えるか

すでにWeb関連サービス では主流になりつつある。

2014年5月の段階で『自社のサービスは全てDocker のようなコンテナで動いており、旧来の仮想マシンは使用していない』と発表。

近い将来、科学技術計算、情報通信、製造、流通など様々な分野での活用が予想されるが、うまく活用するためには、シンプルで小さなアプリケーションであることが重要。 複雑で大きなモジュールの塊から、疎結合で自律的な小さなアプリケーション群を連携させるマイクロサービスへ転換できるかどうかが鍵!!

Page 98: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

商用として利用できますか?

Yes! 既にWeb系のサービスはコンテナの活用が進んでいる。

しかし、他のオープンソース同様、何か問題があった場合は、自分たちで解決する必要がある。

製品に詳しい技術者の育成が重要。

Page 99: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

なにから始めるか

Page 100: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

社内 Docker リポジトリ

結合試験環境1系

結合試験環境2系

Docker活用のススメ

開発環境 (開発PC)

アプリケーション コンテナイメージ

ステージング環境

アプリケーション コンテナイメージ

アプリケーション コンテナイメージ

アプリケーション コンテナイメージ

アプリケーション コンテナイメージ

Page 101: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

社内 git/svn リポジトリ

結合試験環境1系

Docker活用のススメ

開発環境 (開発PC)

アプリケーション コンテナイメージ

Dockerfile

Dockerfile 結合試験環境N系

アプリケーション コンテナイメージ

Page 102: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

自動テスト環境

社内 git/svn リポジトリ

結合試験環境1系

Docker活用のススメ

開発環境 (開発PC)

アプリケーション コンテナイメージ

アプリケーション コンテナイメージ

Dockerfile

Dockerfile

CIサーバ

Jenkins

社内 Docker リポジトリ

アプリケーション コンテナイメージ

結合試験環境N系

アプリケーション コンテナイメージ

Page 103: そろそろ知っておきたい!!コンテナ技術とDockerのキホン
Page 104: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

コンテナとは、 CPUやメモリ、プロセス空間、ディスク、ネットワークなどを隠蔽するOS(Linuxカーネル)が持つ機能を使って実現している。

コンテナを簡単に使えるようにしたツールのひとつにLXCがある。

Page 105: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker は、LXCを拡張してコンテナを更に簡単に扱えるようにしたツール。

Docker Hubというリポジトリを経由すると、インターネットを介して、コンテナをポータブルにできる。

Dockerfile という形式で、サーバインフラをコード化することができる。

Page 106: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker をうまく活用するには、それなりのアーキテクチャを検討する必要がある。

つまり、疎結合で自律的な小さなアプリケーション群を連携させるマイクロサービス型アーキテクチャであることが重要。

Page 107: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

Docker は、主要なベンダを巻き込みながら、非常に影響力の大きなエコシステムを構築しており、今後ますます発展することが見込まれる。

まずは、開発業務や検証業務での活用をお勧め。

Page 108: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

ぜひ自分でも Docker をインストールしてさわって見て下さい!!

Page 109: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

これを機会に、複数の Docker使い が誕生することを期待しています

Page 110: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

期待しています

Page 111: そろそろ知っておきたい!!コンテナ技術とDockerのキホン

おしまい

ご静聴ありがとうございました