忙しい人のためのDocker入門
2018年Winterバージョン@zembustu 前佛雅人
2018年12月20日
スクエアfreeセミナー

@zembutsu
前佛 雅人
Blog: https://pocketstudio.net@zembutsu

zembutsu

さくらインターネット株式会社
技術本部ミドルウェアグループ
Technology Evangelist / Developer Advocate
 エバンジェリストチーム
 石狩市の小学校プログラミング教育支援プロジェクト 仮想化基盤チーム

2

Containerization

お持ち帰りNamespace・Cgroup

プロセスを簡単にコンテナ化（isolate）し、「プロセス・ファイルシステム・ネットワーク・等々」に対して

Key Takeaways

Build Ship Run

簡単かつ素早く開発・移動・実行できるプラットフォームが Docker

１

Dockerコンテナは実行に必要な全てをパッケージして、簡単に動かせる

2

Dockerイメージは複数のイメージ・レイ
ヤとメタ情報の積み重なり

3コンテナのプロセスはデフォルトでisolate（隔離・分離）された状態

 アプリケーションを簡単に開発し、  イメージ・レイヤ（image layer）は  namespace（名前空間）でプロセ移動し、実行するためのプログラム
読み込み専用ス空間やファイルシステムやネッとプラットフォームを提供するのが  親子関係がある
トワーク等を分ける技術と、Dockercgroups（コントロール・グループ）
 イメージに対する変更はCopy on
でリソースの利用上限を指定
 クライアント・サーバ型
Write（CoW)処理が走る
 コンテナはポートをデフォルトで開 コンテナ実行にはイメージが必要
かない
で、Docker Hubから得られる
 ネットワークはブリッジ、ホスト、
 コンテナ実行時のみ、読み書きがnoneの3種類
https://docker.com
可能なレイヤを追加
 ボリュームはコンテナ間でファイルシステムを共有できる。名前付き(named)とホスト・ボリューム

3

From “Cloud Computing”,
To “Cloud Native”

クラウド・ネイティヴの時代

4仮想化からクラウド・ネイティブへ
From Virtualization to Cloud Native• クラウド・ネイティブ・コンピューティングはオープンソースのソフト

ウェアを積み重ね、次のために用います：

アプリケーションをマイクロサービス(microservices)に分割し、– 各パーツ自身をコンテナにパッケージし、– リソース利用を最適化するために、動的に統合/オーケスト
レート(orchestrate)する
–

5

非仮想化
ハードウェア

仮想化

IaaS

2000

2001

2006

© 2018 Cloud Native Computing Foundation

PaaS

オープン
ソース
IaaS

オープン
ソース
PaaS

コンテナ

クラウド
ネイティブ

2009

2010

2011

2013

2015

※ https://github.com/cncf/presentations からの引用

物理サーバ時代

見
積
も
り

機
材
発
注

機
材
納
品

設
置

機
器
設
定

O
S
設
定

環
境
構
築

試
験

運
用
開
始

6

仮想化

事
前
設
計

ク
リ
ッ
ク

試
験

利
用
開
始

7

仮想化

事
前
設
計

ク
リ
ッ
ク

試
験

利
用
開
始

クラウド

事
前
設
計

ク
リ
ッ
ク

試
験

利
用
開
始

事
前
設
計

ク
リ
ッ
ク

試
験

利
用
開
始

8

“ペット vs 家畜”

Architectures for open and scalable clouds
http://www.slideshare.net/randybias/architectures-for-open-and-scalable-clouds

9

システム基盤も、サービス側も変わり続ける前提
Pet vs Cattle、価値観の転換点、そして板挟み
STATIC

静的
安定性
信頼性

IPアドレス
覚えていますか？

DYNAMIC

スケーラブルagile

より速く

12 Factor
App
DevOps

柔軟に

動的

現在の課題
かつ、
安定性
信頼性

Microservices

SRE

コストと速さ・柔軟さが釣り合わない
ハードウェアとソフトウェアを所有する時代

物理サーバ

仮想化技術

 メインフレーム
 ワークステーション

 携帯電話 パーソナルコンピュータ

釣り合う

開発者のみならず
エンドユーザもサービスとしての計算資源を利用する時代

クラウド
コンピューティング
 タブレット端末

クラウド
ネイティブ

 スマートフォン

10Cloud Nativeの概念は以前から

クラウド・ネイティブ Service oriented architecture Redundancy
 Statelessness
 NoSQL Eventual consistency
Netflix Development Patterns for Scale,
Performance & Availability (DMG206) | AWS re:Invent 2013https://www.slideshare.net/AmazonWebServices/dmg206

 Availability

マイクロサービス Automation

デプロイ Acceleration

CI/CD Anywhere!

コンテナはどこでも移動

可用性

管理

自動化

OODA

加速

どこでも

これらのパターンであり、ソフトウェアが必要

11【参考】 https://github.com/cncf/presentations/blob/master/2016-software-circus/what-is-cloud-native/what-is-cloud-native.pdf

Cloud Native Computing Foundation (CNCF)
ベンダロックイン無くクラウドを移動できるように
オープンソースのソフトウェアを積み重ねて：

 コンテナ化
2015年設立

プロジェクトを支援

アプリケーションやプロセス等の各パートをコンテナ内にパッケージ化し、再利用性、透明性、、リソースを分離 動的なオーケストレーション
コンテナを活発にスケジュールし、
リソース利用率の最適化を管理
2000年設立。Linuxを中心としたオープンソースのエコシステムを築くため、コンピュータ業界を中心に
自動車業界など、50以上のサブプロジェクトを持つ。
幅広く業界との調整や標準化のために努める非営利団体。
【参考】 CNCF About https://www.cncf.io/about/faq/

 マイクロサービス指向
アプリケーションをマイクロサービスに分割し、全体的な敏捷性(agility)とメンテナンス性を極めて向上

12コンテナやマイクロサービスのようなクラウドネ
イティブ技術は、組織が開発とデプロイをスケー
ラブルに、アジャイル・アプリケーションとサービ
スを動的に、かつ分散環境で行えるようになります。 これらの特長の考慮した設計のシステムであれば、回復力のある（resilient）、弾力的（elastic）で、疎結合（loosely coupled）となり、管理可能な抽象化と宣言型の API を通すので、
つまり、効率的で信頼性のある自動化をもたらすのです。これにより、エンジニアはアプリケーショ
ンを監視できたり、影響の大きな変更も簡単に行
えたりします。そしてプロセスとワークフローは結
果的に、これらの環境を最大限に活かし、苦痛を最小化するのです。

13

1. コンテナ化• Docker コンテナで一般的に行う• あらゆる大きさのアプリケーションと依存関係（エミュレータ上で実行する PDP-11 のコードですら）をコンテナ化できる• 時間がたてば、適切なアプリケーション分割を求めるようになり、次世代の機能をマイクロサービス
として書くでしょう14

2. CI/CD• 継続的インテグレーション/継続的デリバリ(CI/CD)をセットアップすると、ソースコードに対する変更の結果、自動的に新しいコンテナが構
築、テストされ、定期的にテスト環境に展開するだけでなく、本番環境にすら展開する。
• ロールアウト、ロールバック、テストを自動的に行うようセットアップする。

15

3. オーケストレーション• Kubernetes は業界トップのオーケストレーション・
ソリューションです。
• 認証 Kubernetes ディストリビューション、対応（Hosted）プラットフォーム、インストーラーから選択すべきです。

16

インタラクティブなランドスケープは l.cncf.io をご覧ください17© 2018 Cloud Native Computing Foundation

Cloud Native 参照アーキテクチャ
Application Definition / Development

マイクロサービス・パターン

Orchestration & Management

分散オーケストレーションと管理

Runtime
Provisioning

コンテナ化

Networking
ComputeStorage

インフラ※ CNCFプロジェクトが定義する範囲外【参考】 https://github.com/cncf/presentations/blob/master/2016-software-circus/what-is-cloud-native/what-is-cloud-native.pdf

18

19

© 2018 Cloud Native Computing Foundation

Container

Dockerとは何なのか？

20

“ペット vs 家畜”

Architectures for open and scalable clouds
http://www.slideshare.net/randybias/architectures-for-open-and-scalable-clouds

21Docker≠コンテナ
22

DockerDockerイメージとして全ての依存関係をパッケージ化して、コンテナとして動かすLinuxファイルシステムを“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com 23

Dockerイメージはイメージ・レイヤの積み重ね
利用者からは１つに見える

利用者からは１つに見える

親
子
関
係
派生も
共有
プログラムやライブラリとメタ情報（実行するプログラムやポートなど）

だから高速に移動できる・開発を高速化できるリソースを有効に使える “lightweight” な性質24alpine利用者からは１つに見える

docker image build -t <IMAGE:TAG> .
(docker build)25

FROM alpine
ENTRYPOINT ["/bin/echo"]
CMD ["こんにちは！こんにちは！"]hello:v1
利用者からは１つに見える

docker image build -t hello:v1 .
(docker build)

26

FROM alpine
ENTRYPOINT ["/bin/echo"]
CMD [“おはよう！おはよう！"]hello:v1

docker image build -t hello:v2 .
(docker build)

hello:v2

27

Alpine Linuxhttps://www.alpinelinux.org

28

gliderlabs / docker-alpine

イメージ・レイヤ

29

docker image pull (docker pull)

Docker Hub$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

30DockerDockerイメージとして全ての依存関係をパッケージ化して、コンテナとして動かすLinuxファイルシステムを“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com 31

32

DockerコンテナはDockerイメージを実行
利用者からは１つに見える

元のレイヤに対する変更情報を記録
Copy on Write の性質

利用者からは１つに見えるだから高速に移動できる・開発を高速化できるリソースを有効に使える “lightweight” な性質

33

コンテナ

Technology

DockerSpecification

技術と仕様

34

アプリケーションを
isolate(分離)する
insulatus→isolated→isolate
isle island
35

36

namespace isolate

プロセス等を名前空間で分離

control group

cgroupでリソースを割り当て

38

PID名前空間/sbin/init
PID 1

alice
PID 2
PPID 1

bob
PID 3

dockerdPID 4
PPID 1PPID 1

containerd
PID 5

ホスト上には存在

PPID 4

httpd
PID 6
httpd
PID 1

PPID 5プロセスhttpd
名前空間

ruby
PID 7
ruby
PID 1

PPID 5chris.rb
PID 8chris.rb
PID 2

プロセスruby
名前空間

PPID 739

ファイルシステムを分ける (chroot)
/

/etc

/bin

/data

ホスト上には存在/data/ubuntu/data/centos

/

/

/etc

/bin

…

ubuntuのファイルシステム

/etc

/bin

centosのファイルシステム…

40コンテナはプロセスの状態
コンテナA

名前空間の isolate

コンテナB
ruby
PID 1

httpd
PID 1

chris.rb
PID 2

プロセスB

プロセスA

/etc

cgroupでリソース制限
・CPU
・メモリ
・I/O
・ディスク・クォータ、等//(/data/ubuntu/etc)

・プロセス
・ファイルシステム・ネットワーク
・ホスト名
・UID・GID・プロセス間通信、等/bin(/data/ubuntu/bin)

コンテナAのファイルシステム…

/etc(/data/centos/etc)/bin(/data/centos/bin)

コンテナBのファイルシステム…

41

namespace isolate

プロセス等を名前空間で分離

control group

cgroupでリソースを割り当て

42

Docker
全ての依存関係をパッケージ化して、コンテナとして動かす“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com 43

Dockerはサーバ・クライアント型モデル
コンテナ

dockerクライアント・docker コマンド

Linux, Mac OS X, Windows

・Kitematic (GUI)Mac OS X, Windows

・Docker Compose・Docker Swarm

リモート
API
TCP あるいはUnix ソケットドメイン

コンテナ

コンテナ

Docker エンジン

( dockerd デーモン )containerd

Runtime: runC (OCI規格準拠)

Linux kernel
OS ( Linux )物理/仮想サーバ44

Docker Engineのアーキテクチャ
ユーザ(docker CLI等)

Docker Container Engine
dockerd

JSON/REST API

containerd

ｇRPC エンドポイント

shim

shim

(docker-containerd)

shim(docker-containerd-shim)(docker-containerd-shim)(docker-containerd-shim)

runC

runC

runC

(runtime-runc)(runtime-runc)(runtime-runc)

コンテナ
Docker Image

コンテナ
Docker Image

コンテナ
Docker Image

CNCF/OCI業界標準規格に準拠※ Docker Engine v1.11 以降

Docker Engine トップレベルのデーモン（Moby プロジェクトの成果物）
コンテナやイメージをはじめとし、ネットワーク、ストレージを管理する
必要最小限のデーモン
ランタイムが実行したコンテナを管理
コンテナを実際に作成・起動するランタイムのバイナリ・プログラム
Docker イメージに含むファイルを、
パラメータに従い、コンテナとして実行

45

docker クライアント

docker エンジン

$ docker container run hello-worldrun

OSに対してdocker プログラムの実行を伝える

dockerDocker に対してコンテナに読み込む
イメージの情報を伝える

container run

hello-worldDocker コンテナを作成・実行するためのサブコマンド46

docker クライアント

レジストリ

docker エンジン

Docker Hub
hello-world レポジトリ$ docker container run hello-world
run

pull
latestタグ
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs
theexecutable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sentit
to your terminal.

コンテナ化した
hello-worldの実行

To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bash

latestShare images, automate workflows, and more with a free Docker Hub
account:
https://hub.docker.com
For more examples and ideas, visit:https://docs.docker.com/userguide/

イメージ

タグ
イメージ

47

hello-worldイメージを使ったコンテナの実行(run)を命令$ docker container run hello-world
Unable to find image 'hello-world:latest' locally
ローカルにhello-worldイメージがない
latest: Pulling from library/hello-world
公式イメージlibraryにある”hello-world”を取得
03f4658f8b78: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest
最新の”hello-world:latest”イメージを取得完了

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
(省略)
Share images, automate workflows, and more with a free Docker Hub account:https://hub.docker.com
For more examples and ideas, visit:https://docs.docker.com/userguide/48

コンテナやイメージの操作はコンテナIDやコンテナ・イメージIDを
中心に操作

49

だがちょっとまって欲しい
Docker≠コンテナ型仮想化
仮想化とは違うの？

• アプリケーション・コンテナ• システム・コンテナ（コンテナ型仮想化）

https://www.docker.com/resources/what-container

50network / volume

Dockerネットワークとボリューム51

Dockerのネットワークも基本的にisolate(分離・孤立)
コンテナは、プロセス空間等
だけでなく、ネットワークも分離可能
docker network create –subnet 192.168.0.0/24

コンテナ（状態のプロセス）はデフォルトではポートを開かないため、利用時は起動前に明示する必要docker run -p [host:container]
docker run -P52

３つのネットワーク・モデル(null)(host)(bridge)eth0

NAT(iptables)+
docker-proxy

none

host

bridgeホストとネットワーク
共通

veth

疎通しない

ブリッジ(bridge0 …)
コンテナはパブリックなIPアドレスを持ない
ethX

ホスト側のポート番号を重複して、コンテナのポート利用（マッピング）はできない
動的なネットワークの追加・変更・削除

53

コンテナは複数のネットワーク(ブリッジ)に接続できる
172.18.0.3 172.19.0.2

172.18.0.2

eth0

192.168.0.1

eth0

veth

eth1

172.19.0.3

eth0

veth

ブリッジ1(bridge)
172.19.0.0/16

172.19.0.1

ブリッジ2(bridge)
172.19.0.0/16

ethX

各ネットワーク内部では、動的なコンテナ名（サービス）の名前解決機能（サービス・ディスカバリ）を標準提供
サービス・ディスカバリ連携の負荷分散

54

コンテナとファイルシステムのisolate(隔離)HOST Root
File System/var/lib/docker/overlay/

UFS ( Union File System )ABhello.txt

コンテナA専用
ファイル階層File System

/

/bin
/etc

×

File System

/

/bin
/etc
…

…

/var

hello.txt

コンテナB専用
ファイル階層/var

55

ディレクトリはストレージドライバによって異なる

コンテナ
ファイル階層File System

/

/data

UFS ( Union File System)/var/lib/docker/image//var/lib/docker/containers/

Docker
イメージ

コンテナ用
イメージ層

Docker Image

/

/bin
…

ReadOnly/varContainer’s
Image Layer//var/lib/docker/volumes/
volumeVolume/56

ボリュームはコンテナ間で共有可能コンテナからはUFSを通してデータ領域が見える
ストレージ・ドライバのオーバヘッドを受けない
複数のコンテナでボリュームを共有できるコンテナA専用
ファイル階層File System

/

/bin
/etc

HOST Root File
System/var/lib/docker/volumes/

ボリューム

volume Volume

…

/var
/data

/

57

ボリュームは3種類
ホストをマウント

/data

名前付き

/data

/data
/docker/data
ホスト上のディレクトリ

名前無し

volume/etc

volume

ボリュームはコンテナ間でデータを共有できる
ボリュームの実体は、ホスト上のディレクトリ
/var/lib/docker/volumes

58docker container run

ping のコンテナを作ってみよう・使ってみよう59

“ping” を実行するコンテナ$ docker container run -it alpine/ # cat /etc/issue
Welcome to Alpine Linux 3.8
Kernel ¥r on an ¥m (¥l)/ # ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=120 time=1.124 ms
64 bytes from 8.8.8.8: seq=1 ttl=120 time=1.045 ms
64 bytes from 8.8.8.8: seq=2 ttl=120 time=0.979 ms

docker run alpine ¥= ping -c 3 8.8.8.8※1行で--- 8.8.8.8 ping statistics --3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.979/1.049/1.124 ms/ # exit

60

foregroundbackgroundattach と detach$ docker run alpine ping -c 100 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes

64 bytes from 8.8.8.8: seq=0 ttl=120 time=7.260 ms
64 bytes from 8.8.8.8: seq=1 ttl=120 time=1.037 ms(snip)
64 bytes from 8.8.8.8: seq=96 ttl=120 time=0.972 ms
64 bytes from 8.8.8.8: seq=97 ttl=120 time=1.032 ms
64 bytes from 8.8.8.8: seq=98 ttl=120 time=1.019 ms
64 bytes from 8.8.8.8: seq=99 ttl=120 time=1.052 ms--- 8.8.8.8 ping statistics --100 packets transmitted, 100 packets received, 0% packet loss
round-trip min/avg/max = 0.911/1.116/6.986 ms$ docker run -d alpine ping -c 100 8.8.8.8
de1dd8c69adebbe9df269bc38b57e3fe3549eb85140acb2c1d2a4eb51bc74160

61

docker container ps$ docker ps
CONTAINER ID

IMAGE

COMMAND

CREATEDSTATUSde1dd8c69ade

alpine"ping -c 100 8.8.8.8" 43 seconds ago

PORTS

Up 42 seconds

NAMES
romantic_hawking$ docker logs de
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=120 time=6.986 ms
64 bytes from 8.8.8.8: seq=1 ttl=120 time=0.956 ms(snip)
64 bytes from 8.8.8.8: seq=98 ttl=120 time=1.075 ms
64 bytes from 8.8.8.8: seq=99 ttl=120 time=1.056 ms--- 8.8.8.8 ping statistics --100 packets transmitted, 100 packets received, 0% packet loss
round-trip min/avg/max = 0.866/1.106/7.671 ms

62docker container ps$ docker ps
CONTAINER ID

IMAGE$ docker ps –al
CONTAINER ID
NAMES

IMAGE

de1dd8c69ade
alpineromantic_hawking

COMMAND

CREATEDSTATUSCOMMAND

CREATEDSTATUS"ping -c 100 8.8.8.8" 4 minutes ago

PORTS

Exited (0) 2 minutes ago$ docker rm ${docker ps -alq}

63docker container exec
$docker run -d alpine ping -c 100 8.8.8.8$docker exec -it $(docker ps -alq) /bin/sh/ # ps ax
PID USER TIME COMMAND
1 root 0:00 ping -c 100 8.8.8.8
6 root 0:00 /bin/sh
11 root 0:00 ps ax/ # pstreeping/ # exit

64

Dockerfile
FROM alpine:latest
ENTRYPOINT ["ping","-c","3"]65

docker image build# docker image build -t myping:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM alpine:latest---> 11cd0b38bc3c
Step 2/2 : ENTRYPOINT ["ping","-c","3"]---> Running in bd71f7c0d243
Removing intermediate container bd71f7c0d243---> b8c3422e54d1
Successfully built b8c3422e54d1
Successfully tagged myping:1.0$ docker image ls
REPOSITORY
myping

TAG
1.0

IMAGE ID
485a295c402e

CREATED
28 seconds ago

SIZE
4.41MB66

docker container run$ docker run -it myping:1.0 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=120 time=8.663 ms
64 bytes from 8.8.8.8: seq=1 ttl=120 time=1.004 ms
64 bytes from 8.8.8.8: seq=2 ttl=120 time=0.960 ms--- 8.8.8.8 ping statistics --3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.960/3.542/8.663 ms$ docker run -it myping:1.0
BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.
Usage: ping [OPTIONS] HOST
Send ICMP ECHO_REQUEST packets to network hosts(snip)

Dockerfile
FROM alpine:latest
ENTRYPOINT ["ping","-c","3"]67Dockerfile
FROM alpine:latest
ENTRYPOINT ["ping","-c","3"]
CMD ["8.8.8.8"]$ docker image build -t myping:1.1 .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM alpine:latest---> 11cd0b38bc3c
Step 2/3 : ENTRYPOINT ["ping","-c","3"]---> Using cache---> 2e704637972a
Step 3/3 : CMD ["8.8.8.8"]---> Running in 61c8e7b682a4
Removing intermediate container 61c8e7b682a4---> 0acf32d5be78
Successfully built 0acf32d5be78
Successfully tagged myping:1.1

68

docker container run$ docker run -it myping:1.1
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=120 time=7.684 ms
64 bytes from 8.8.8.8: seq=1 ttl=120 time=1.153 ms
64 bytes from 8.8.8.8: seq=2 ttl=120 time=0.994 ms--- 8.8.8.8 ping statistics --3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.994/3.277/7.684 ms$ docker run -it myping:1.1 8.8.4.4
PING 8.8.4.4 (8.8.4.4): 56 data bytes
64 bytes from 8.8.4.4: seq=0 ttl=120 time=1.277 ms
64 bytes from 8.8.4.4: seq=1 ttl=120 time=1.252 ms
64 bytes from 8.8.4.4: seq=2 ttl=120 time=1.270 ms--- 8.8.4.4 ping statistics --3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 1.252/1.266/1.277 ms

Dockerfile
FROM alpine:latest
ENTRYPOINT ["ping","-c","3"]
CMD ["8.8.8.8"]

69

docker network$ docker network create --subnet 192.168.0.1/24 mynet
44dd2cdd6120c5265ecacfece5bd66077de1e6ab67f453601b8058eb0f65757f$ docker network ls
NETWORK ID

NAME

DRIVER

SCOPE

df54d986479d

bridgebridgelocal

11dc9b54f1cc

host

44dd2cdd6120

mynet

bridgea786e4ae4841

none

null

host

local
local
local

70

$ docker run -it --net=mynet alpine/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state
UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
53: eth0@if54: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu
1500 qdisc noqueue state UP
link/ether 02:42:c0:a8:00:02 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever71

Port mapping• 「docker run -d -P nginx」は自動的にマッピング
ホスト側 コンテナ側• 「docker run -d -p 8080:80 nginx」は手動＄ docker ps
CONTAINER ID

IMAGE

COMMAND

CREATEDSTATUS

PORTS

NAMES

d11fc51679e2

nginx"nginx -g 'daemon of…" 18 seconds ago

Up 16 seconds

0.0.0.0:32773->80/tcp focused_heisenberg

33ce5561ec1a

nginx"nginx -g 'daemon of…" 19 seconds ago

Up 17 seconds

0.0.0.0:32772->80/tcp gallant_ramanujan

a00d140e2500

nginx"nginx -g 'daemon of…" 19 seconds ago

Up 18 seconds

0.0.0.0:32771->80/tcp adoring_euclid

5e0f1c10b6f7

nginx"nginx -g 'daemon of…" 20 seconds ago

Up 19 seconds

0.0.0.0:32770->80/tcp flamboyant_meitnercde6f341cacf

nginx"nginx -g 'daemon of…" 26 seconds ago

Up 25 seconds

0.0.0.0:32769->80/tcp cranky_rosalind

nmap -sT -O 127.0.0.1

72

volume$ docker run -it alpine/ # date
Sat Aug 25 02:36:47 UTC 2018
ホスト側

コンテナ側

$ docker run -it -v /etc/localtime:/etc/localtime alpine/ # date
Sat Aug 25 11:37:38 JST 201873

お掃除系の便利コマンド• docker rm $(docker ps -aq)
• docker rmi $(docker images -aq)
• docker container prune• docker image prune• docker network prune• docker volume prune• docker system prune• docker system df

74コンテナやイメージの操作はコンテナIDやコンテナ・イメージIDを
中心に操作

75

だがちょっとまって欲しい
Docker≠コンテナ型仮想化
仮想化とは違うの？

• アプリケーション・コンテナ• システム・コンテナ（コンテナ型仮想化）

https://www.docker.com/resources/what-container

76Orchestration

オーケストレーションとKubernetes

77

Cloud Native 参照アーキテクチャ
Application Definition / Development

マイクロサービス・パターン

Orchestration & Management

分散オーケストレーションと管理

Runtime
Provisioning

コンテナ化

Networking
ComputeStorage

インフラ※ CNCFプロジェクトが定義する範囲外【参考】 https://github.com/cncf/presentations/blob/master/2016-software-circus/what-is-cloud-native/what-is-cloud-native.pdf

78アプリケーションやサービスのオーケストレーション
Orchestration

設定ファイルをベースにサービスを定義・維持(主に(コンテナ)やジョブのスケジューリング
Scheduling

•
•
•
•

Marathon, chronos
Docker swarm
Deis
fleet

• Kubernetes• Docker Engine(swarm mode)+ Docker Compose• Rancher• Nomad

複数のホスト・システム上を横断するアプリケーションをス
ケール（拡大・縮小）できる機能※コンテナに依存しない計算資源の抽象化

ホスト計算資源のクラスタ管理Cluster Management• Apache Mesos• DCOS (Mesosphere)

79

80

81

82

83

84

アプリケーションやサービスのオーケストレーション
Orchestration

設定ファイルをベースにサービスを定義・維持(主に(コンテナ)やジョブのスケジューリング
Scheduling

•
•
•
•

Marathon, chronos
Docker swarm
Deis
fleet

• Kubernetes• Docker Engine(swarm mode)+ Docker Compose• Rancher• Nomad

複数のホスト・システム上を横断するアプリケーションをス
ケール（拡大・縮小）できる機能※コンテナに依存しない計算資源の抽象化

ホスト計算資源のクラスタ管理Cluster Management• Apache Mesos• DCOS (Mesosphere)85従来のオーケストレーション

クラスタ
一方通行

【参考】 https://www.slideshare.net/Docker/container-orchestration-from-theory-to-practice/7

86

宣言型サービス・モデルのオーケストレーション
Declarative service model

D = 期待状態
O = オーケストレータ
並列
遅延

D

O

Δ

S = 状態Δ = 状態から期待状態への収束

Sクラスタ

 レプリカ作成
 グローバル・サービス
変更可能

フィードバック【参考】 https://www.slideshare.net/Docker/container-orchestration-from-theory-to-practice/7

87

サービスとタスクの概念「コンテナ」の起動ではない

Master
kubectl apply

サービス
3 つの nginx
レプリカ

Pod

1. API命令を受け付けサービス・オブジェクト作成
2. サービスに一致するようタスクの調整
3. タスクに IP アドレス割り当て
4. タスクをノードに割り当て
5. タスクの実行を命令

Pod

Pod

nginx.1
node 期待状態に一致するよう
タスク数を常に自動調整

nginx.3

nginx.2

nginx.latest
コンテナ

node

nginx.latest
コンテナ

node

【参考】 https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/#services-tasks-and-containers

nginx.latest
コンテナ

88

κυβερνήτης

/ky.ber.nɛ̌ː.tɛːs/ → /ky.βerˈni.tis/ → /ci.verˈni.tis/

a captain, a steersman,a pilot, a navigator89

https://en.wiktionary.org/wiki/%CE%BA%CF%85%CE%B2%CE%B5%CF%81%CE%BD%CE%AE%CF%84%CE%B7%CF%82

90

Kubernetes - A Comprehensive Overview by Bob Killen (December 11, 2017)91

Rancher92

Rancher• kubernetes 構成要素やクラスタを統合管理• 複数のクラスタをまとめて管理（監視・ログの集約）• クラウドへのデプロイや、既存のクラスタの取り込み• CI/CD パイプライン• ユーザ認証・管理• GUI• https://rancher.com• オープンソース• Rancher Labs 社、2014年設立• サポート体制あり

93

インターネット(パブリック・ネットワーク）

さくらの
クラウド
API

❷
API要求

Web UI

DockerEngine❶スタートアップ
スクリプト

サービス

DockerEngineCentOS 7.5❸ Kubernetes の
デプロイ

まとめ

95

情報通信機器の世帯保有率の推移
固定電話
パソコン
スマートフォン

平成30年版情報通信白書 by 総務省 is licensed under a Creative Commons 表示 2.1日本 License.
https://creativecommons.org/licenses/by/2.1/jp/

96

ソフトウェアやサービス開発の前提が変わる• パッケージ販売モデルの終焉と、終わりなき開発・改善• オーバーシューティング（出典）ソフトウェアビジネスの未来、前川徹、2011年

キーワードサービス・アプリケーション層
Robotic Process Automation

ロボティック・プロセス・
オートメーション

コーディングが不要 ロボティック・プロセス・オートメーション（Robotic
Process Automation, RPA）とは、認知技術（ルールエ
ンジン・機械学習・人工知能等）を活用した、主にホワイト
カラー業務の効率化・自動化の取組みである。
 人間の補完として業務を遂行できることから、仮想知的労働者（Digital Labor）とも言われている。また、デスクトップ作業のみに絞ったものをロボティック・デスクトップ・
オートメーションと呼び、RPAと区別することもある。

サーバの管理が不要
計算資源の基盤・プラットフォーム層

Serverless

FaaS (Function as a Service) サーバレス・コンピューティングはアプリケーションを構築・実行するための概念を言及するもので、サーバ管理は扱わない。
→アプリケーションの洗練されたデプロイ・モデル（方式） サーバレス・コンピューティングとは、コードを実行するためにサーバを持たないのを意味するのではないし、運用エンジニアが不要になるのも意味しない。
→開発者はビジネスロジックに応じたアプリケーションを書くのに集中でき、運用担当者はビジネスにクリティカルなタスクに集中できる。

98お持ち帰りKey Takeaways

１

コンテナはサーバ
仮想化技術の延長
線上ではない2

コンテナはプロセスをisolate（分離）して動かす複数の技術

 従来のハードウェア仮想化による計算資源の効率的な利用が目的ではなく「クラウド・ネイティブ」による更なる活用のため

 アプリケーションの移植性を高める実装として広く普及した Docker

https://cncf.io

https://docker.com

3

オーケストレーション
は複数のコンテナ等の計算資源を束ねる クラスタを構成するためのノード
管理と、スケジューリング（処理を実行するために必要なノードを選
び出し、計画した後に実行）をする

 namespace（名前空間）でプロセ
ス空間やファイルシステムやネッ スマートフォンの普及は常時利用・
トワーク等を分ける技術と、
 期待状態(Desired State)を常に継続開発が必要なシステムに自動的に維持する仕組みを内蔵
cgroups（コントロール・グループ）
でリソースの利用上限を指定
 労働生産性向上は、開発や運用
 継続してサービスを実行するためスタイルの変化も促す
 コンテナ実行にはイメージが必要に様々な機能を実装

https://kubernetes.io

99

Q&A
• 何か気になるところはありますか？
• https://slideshare.net/zembutsu• Dockerドキュメント日本語訳
http://docs.docker.jp• 公式ドキュメント
https://docs.docker.com

100