Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Dockerの基本概念
Dockerの基本操作と、コンテナとイメージの違い、ネットワーク、ボリュームの理解
@zembustu 前佛雅人
2018年8月25日
“Infrastructure Workshop インフラ勉強会” #0825-docker道場 向け資料
2
@zembutsu
前佛 雅人
zembutsu@zembutsuBlog: https://pocketstudio.net
Factorio大好き
https://factorio.com/
お持ち帰り
3
Key Takeaways
1
Dockerコンテナは
実行に必要な全て
をパッケージして、
簡単に動かせる
2
Dockerイメージは
複数のイメージ・レイ
ヤとメタ情報の積み
重なり
3
コンテナのプロセス
はデフォルトで
isolate(隔離・分離)
された状態
 アプリケーションを簡単に開発し、
移動し、実行するためのプログラム
とプラットフォームを提供するのが
Docker
 クライアント・サーバ型
https://docker.com
 イメージ・レイヤ(image layer)は
読み込み専用
 親子関係がある
 イメージに対する変更はCopy on
Write(CoW)処理が走る
 コンテナ実行にはイメージが必要
で、Docker Hubから得られる
 コンテナ実行時のみ、読み書きが
可能なレイヤを追加
 namespace(名前空間)でプロセ
ス空間やファイルシステムやネッ
トワーク等を分ける技術と、
cgroups(コントロール・グループ)
でリソースの利用上限を指定
 コンテナはポートをデフォルトで開
かない
 ネットワークはブリッジ、ホスト、
noneの3種類
 ボリュームはコンテナ間でファイル
システムを共有できる。名前付き
(named)とホスト・ボリューム
プロセスを簡単にコンテナ化(isolate)し、
簡単かつ素早く開発・移動・実行できるプラットフォームが Docker
Containerization
「プロセス・ファイルシステム・ネットワーク・等々」に対して
Namespace・Cgroup
Build Ship Run
Dockerとは何なのか?
Container
4
“ペット vs 家畜”
5Architectures for open and scalable clouds
http://www.slideshare.net/randybias/architectures-for-open-and-scalable-clouds
6
Docker≠コンテナ
コンテナは怖くないよ
コンテナは友達さ!!
7
アプリケーションを
isolate(分離)する
insulatus→isolated→isolate
isle island
8
9
プロセス等を名前空間で分離
cgroupでリソースを割り当て
namespace isolate
control group
PID名前空間
10
httpd
PID 1
プロセスhttpd
名前空間
プロセスruby
名前空間
ruby
PID 1
chris.rb
PID 2
/sbin/init
PID 1
containerd
PID 5
httpd
PID 6
ruby
PID 7
chris.rb
PID 8
alice
PID 2
bob
PID 3
PPID 1 PPID 1
PPID 4
PPID 5 PPID 5
PPID 7
PPID 1
dockerd
PID 4
ホスト上には存在
ファイルシステムを分ける (chroot)
11
ubuntuの
ファイルシステム
… …
centosの
ファイルシステム
/etc /bin /etc /bin
/ /
/data/ubuntu /data/centos
/
/etc /data/bin ホスト上には存在
コンテナはプロセスの状態
12
コンテナAの
ファイルシステム
… …
コンテナBの
ファイルシステム
/etc
(/data/ubuntu/etc)
/bin
(/data/ubuntu/bin)
/etc
(/data/centos/etc)
/bin
(/data/centos/bin)
/ /
httpd
PID 1
プロセスA プロセスB
ruby
PID 1
chris.rb
PID 2
コンテナA コンテナB
名前空間の isolate
・プロセス
・ファイルシステム
・ネットワーク
・ホスト名
・UID・GID
・プロセス間通信、等
cgroupでリソース制限
・CPU
・メモリ
・I/O
・ディスク・クォータ、等
13
プロセス等を名前空間で分離
cgroupでリソースを割り当て
namespace isolate
control group
Docker
14
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
全ての依存関係をパッケージ化して、コンテナとして動かす
Dockerはサーバ・クライアント型モデル
15
OS ( Linux )
物理/仮想サーバ
Docker エンジン
( dockerd デーモン )
Linux kernel
コンテナ コンテナ コンテナ
リモート
API
docker
クライアント TCP あるいは
Unix ソケットドメイン
containerd
Runtime: runC (OCI規格準拠)
・docker コマンド
Linux, Mac OS X, Windows
・Kitematic (GUI)
Mac OS X, Windows
・Docker Compose
・Docker Swarm
Docker Engineのアーキテクチャ
16※ Docker Engine v1.11 以降
ユーザ
(docker CLI等)
Docker Container Engine
dockerd
containerd
(docker-containerd)
shim
(docker-containerd-shim)
shim
(docker-containerd-shim)
shim
(docker-containerd-shim)
runC
(runtime-runc)
コンテナ
Docker Image
コンテナ
Docker Image
コンテナ
Docker Image
JSON/REST API
CNCF/OCI業界標準規格に準拠
runC
(runtime-runc)
runC
(runtime-runc)
gRPC エンドポイント
Docker Engine トップレベルのデーモン
(Moby プロジェクトの成果物)
Docker イメージに含むファイルを、
パラメータに従い、コンテナとして実行
コンテナを実際に作成・起動する
ランタイムのバイナリ・プログラム
コンテナやイメージをはじめとし、
ネットワーク、ストレージを管理する
必要最小限のデーモン
ランタイムが実行したコンテナを管理
Dockerイメージはイメージ・レイヤの積み重ね
17
利用者からは
1つに見える
親
子
関
係
派生も
共有
利用者からは
1つに見える
プログラムやライブラリと
メタ情報(実行するプログラムやポートなど)
だから高速に移動できる・開発を高速化できる
リソースを有効に使える “lightweight” な性質
DockerコンテナはDockerイメージを実行
18
元のレイヤに対する変更情報を記録
Copy on Write の性質
利用者からは
1つに見える
利用者からは
1つに見える
だから高速に移動できる・開発を高速化できる
リソースを有効に使える “lightweight” な性質
docker クライアント docker エンジン
docker container run hello-world
OSに対してdocker プログラムの
実行を伝える
Docker に対してコンテナに読み込む
イメージの情報を伝える
Docker コンテナを作成・実行
するためのサブコマンド
$ docker container run hello-world
run
19
docker クライアント docker エンジン
$ docker container run hello-world
run
Docker Hub
pull
レジストリ
latest
イメージ
タグ
hello-world レポジトリ
latest
イメージ
タグ
latest
コンテナ化した
hello-worldの実行
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
the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent
it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
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/
20
$ docker container run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
03f4658f8b78: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for 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/
ローカルにhello-worldイメージがない
公式イメージlibraryにある”hello-world”を取得
最新の”hello-world:latest”イメージを取得完了
hello-worldイメージを使ったコンテナの実行(run)を命令
21
22
コンテナやイメージの操作は
コンテナIDやコンテナ・イメージIDを
中心に操作
だがちょっとまって欲しい
仮想化とは違うの?
23
Docker≠コンテナ型仮想化
• アプリケーション・コンテナ
• システム・コンテナ(コンテナ型仮想化)
https://www.docker.com/resources/what-container
Dockerネットワークとボリューム
network / volume
24
Dockerのネットワークも基本的にisolate(分離・孤立)
25
コンテナは、プロセス空間等
だけでなく、ネットワークも
分離可能
docker network create –subnet 192.168.0.0/24
コンテナ(状態のプロセス)は
デフォルトではポートを開か
ないため、利用時は起動前に
明示する必要
docker run -p [host:container]
docker run -P
3つのネットワーク・モデル
26
bridge
(bridge)
host
(host)
none
(null)
ブリッジ(bridge0 …)
veth
eth0
ethX
NAT
(iptables)
+
docker-proxy
ホストと
ネットワーク
共通
疎通しない
コンテナはパブリックなIPアドレスを持ない
ホスト側のポート番号を重複して、コンテナ
のポート利用(マッピング)はできない
動的なネットワークの追加・変更・削除
コンテナは複数のネットワーク(ブリッジ)に接続できる
27
ブリッジ1(bridge)
veth
eth0
ethX
各ネットワーク内部では、動的なコンテナ名
(サービス)の名前解決機能(サービス・ディス
カバリ)を標準提供
eth0 eth1 eth0
ブリッジ2(bridge)
veth192.168.0.1
172.18.0.2 172.18.0.3 172.19.0.2 172.19.0.3
172.19.0.1
172.19.0.0/16172.19.0.0/16
サービス・ディスカバリ連携の負荷分散
コンテナとファイルシステムのisolate(隔離)
28
コンテナA専用
ファイル階層
File System
…
/
/bin
/etc
/var
コンテナB専用
ファイル階層
File System
…
/
/bin
/etc
/var
hello.txt
×
HOST Root
File System
/var/lib/docker/overlay/
hello.txt
ディレクトリはストレージドライバによって異なる
A
BUFS( Union File System )
29
コンテナ
ファイル階層
File System
/
UFS ( Union File System)…
/
/bin
/var
Docker
イメージ
Docker Image
/var/lib/docker/image/
volume
/
Volume
/data
コンテナ用
イメージ層
Container’s
Image Layer
/
/var/lib/docker/volumes//var/lib/docker/containers/
ReadOnly
ボリュームはコンテナ間で共有可能
30
コンテナA専用
ファイル階層
File System
…
/
/bin
/etc
/var
コンテナからはUFSを通してデータ領域が見える
ストレージ・ドライバのオーバヘッドを受けない
複数のコンテナでボリュームを共有できる
volume
/data
/
ボリューム
Volume
/var/lib/docker/volumes/HOST Root
File System
ボリュームは3種類
31
ホストをマウント 名前付き
ホスト上のディレクトリ
/docker/data
/data
名前無し
volume
ボリュームの実体は、ホスト上のディレクトリ
/var/lib/docker/volumes
ボリュームはコンテナ間でデータを共有できる
volume
/data /data /etc
ping のコンテナを
作ってみよう・使ってみよう
docker container run
32
“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
--- 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
33
=
docker run alpine ¥
ping -c 3 8.8.8.8
※1行で
attach と 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
34
foreground background
$ docker run -d alpine ping -c 100 8.8.8.8
de1dd8c69adebbe9df269bc38b57e3fe3549eb85140acb2c1d2a4eb51bc74160
docker container ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de1dd8c69ade alpine "ping -c 100 8.8.8.8" 43 seconds ago Up 42 seconds romantic_hawking
35
$ 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
docker container ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
$ docker ps –al
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
de1dd8c69ade alpine "ping -c 100 8.8.8.8" 4 minutes ago Exited (0) 2 minutes ago
romantic_hawking
$ docker rm ${docker ps -alq}
36
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
/ # pstree
ping
/ # exit
37
Dockerfile
FROM alpine:latest
ENTRYPOINT ["ping","-c","3"]
38
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 TAG IMAGE ID CREATED SIZE
myping 1.0 485a295c402e 28 seconds ago 4.41MB 39
docker container run
FROM alpine:latest
ENTRYPOINT ["ping","-c","3"]
40
$ 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
Dockerfile
FROM alpine:latest
ENTRYPOINT ["ping","-c","3"]
CMD ["8.8.8.8"]
41
$ 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
docker container run
FROM alpine:latest
ENTRYPOINT ["ping","-c","3"]
CMD ["8.8.8.8"]
42
$ 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
docker network
$ docker network create --subnet 192.168.0.1/24 mynet
44dd2cdd6120c5265ecacfece5bd66077de1e6ab67f453601b8058eb0f65757f
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
df54d986479d bridge bridge local
11dc9b54f1cc host host local
44dd2cdd6120 mynet bridge local
a786e4ae4841 none null local
43
$ 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 forever
44
Port mapping
• 「docker run -d -P nginx」は自動的にマッピング
• 「docker run -d -p 8080:80 nginx」は手動
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS 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_meitner
cde6f341cacf nginx "nginx -g 'daemon of…" 26 seconds ago Up 25 seconds 0.0.0.0:32769->80/tcp cranky_rosalind
45
nmap -sT -O 127.0.0.1
ホスト側 コンテナ側
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 2018
46
ホスト側 コンテナ側
お掃除系の便利コマンド
• 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
47
48
コンテナやイメージの操作は
コンテナIDやコンテナ・イメージIDを
中心に操作
Q&A
• 何か気になるところはありますか?
• https://slideshare.net/zembutsu
• Dockerドキュメント日本語訳
http://docs.docker.jp
• 公式ドキュメント
https://docs.docker.com
49
お持ち帰り
50
Key Takeaways
1
Dockerコンテナは
実行に必要な全て
をパッケージして、
簡単に動かせる
2
Dockerイメージは
複数のイメージ・レイ
ヤとメタ情報の積み
重なり
3
コンテナのプロセス
はデフォルトで
isolate(隔離・分離)
された状態
 アプリケーションを簡単に開発し、
移動し、実行するためのプログラム
とプラットフォームを提供するのが
Docker
 クライアント・サーバ型
https://docker.com
 イメージ・レイヤ(image layer)は
読み込み専用
 親子関係がある
 イメージに対する変更はCopy on
Write(CoW)処理が走る
 コンテナ実行にはイメージが必要
で、Docker Hubから得られる
 コンテナ実行時のみ、読み書きが
可能なレイヤを追加
 namespace(名前空間)でプロセ
ス空間やファイルシステムやネッ
トワーク等を分ける技術と、
cgroups(コントロール・グループ)
でリソースの利用上限を指定
 コンテナはポートをデフォルトで開
かない
 ネットワークはブリッジ、ホスト、
noneの3種類
 ボリュームはコンテナ間でファイル
システムを共有できる。名前付き
(named)とホスト・ボリューム
プロセスを簡単にコンテナ化(isolate)し、
簡単かつ素早く開発・移動・実行できるプラットフォームが Docker
Containerization
「プロセス・ファイルシステム・ネットワーク・等々」に対して
Namespace・Cgroup
Build Ship Run

More Related Content

Docker道場「Dockerの基本概念」0825インフラ勉強会資料