SlideShare a Scribd company logo
最近のDockerの新機能
須田 瑛大 (Docker Tokyo / NTT)
1
Cloud Native Days Tokyo (2019/7/23)
https://www.slideshare.net/AkihiroSuda
自己紹介
2
● Docker Tokyo Meetupオーガナイザ
○ 次回開催は近日中に https://dockerjp.connpass.com/ にて告知
● 所属: 日本電信電話株式会社 ソフトウェアイノベーションセンタ
● コンテナ関連OSSのメンテナ(いわゆるコミッタ)を務めている
○ Moby (≒Docker)
■ Dockerの元になっているOSSプロジェクト
○ BuildKit
■ 次世代 docker build
○ containerd
■ Kubernetesなどで利用できる次世代コンテナランタイム
最近のDockerの新機能
3
● より高速でセキュアな docker build (BuildKitモード)
● 非rootユーザでのDocker daemonの実行
● GPU対応強化
● Docker Application Packages
● Docker Compose-on-Kubernetes
● CLIプラグイン
○ WASM
○ ngrok
○ ...
最近のDockerの新機能
4
● より高速でセキュアな docker build (BuildKitモード)
● 非rootユーザでのDocker daemonの実行
● GPU対応強化
● Docker Application Packages
● Docker Compose-on-Kubernetes
● CLIプラグイン
○ WASM
○ ngrok
○ ...
本日
Docker 19.03
リリース
BuildKit: 次世代 docker build
(Docker 18.06〜)
5
● マルチステージDockerfileから並行性を抽出
BuildKit: 次世代 docker build
6
FROM golang AS stage0
...
RUN go build –o /foo ...
FROM clang AS stage1
...
RUN clang –o /bar ...
FROM debian AS stage2
COPY --from=stage0 /foo /usr/local/bin/foo
COPY --from=stage1 /bar /usr/local/bin/bar
0

2

1

●DAGはマルチステージDockerfileを用いて記述できる
BuildKit: 次世代 `docker build`
FROM golang AS stage0
...
RUN go build –o /foo ...
FROM clang AS stage1
...
RUN clang –o /bar ...
FROM debian AS stage2
COPY --from=stage0 /foo /usr/local/bin/foo
COPY --from=stage1 /bar /usr/local/bin/bar
0

2

1

https://t.co/aUKqQCVmXa より引用
7
● BuildKitでは、Dockerfileの最初の行に
# syntax = docker/dockerfile:1.1-experimental
を指定すると,非標準の命令を利用できる
● 例: RUN –-mount=type=cache
○ コンパイラやパッケージマネージャのキャッシュディレクトリを保持できる
○ 将来的には,# syntax = ...を指定しなくても標準で利用できるようになる
新しいDockerfile構文: RUN –-mount=type=cache
# syntax = docker/dockerfile:1.1-experimental
...
RUN --mount=type=cache,target=/root/.cache go build ...
https://github.com/moby/buildkit/pull/442 https://github.com/moby/buildkit/pull/455
8
Docker 18.03比で30倍以上高速! 9
https://t.co/aUKqQCVmXa より引用
● S3やSSHの鍵を安全にマウントしてRUNできる
● マウントされるだけなので,出力イメージ内には残らない
○ 従来のCOPYだと、後でrmしても残ることに注意
● docker build --secret を用いて鍵ファイルを指定
新しいDockerfile構文: RUN –-mount=type=secret
10
# syntax = docker/dockerfile:1.1-experimental
...
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials 
aws s3 cp s3://... ...
$ docker build --secret id=aws,src=$HOME/.aws/credentials ...
● クライアントのssh-agentソケット(SSH_AUTH_SOCK)にアクセスできる
○ SSHの鍵にパスフレーズを設定している場合に便利
● docker build --ssh を用いてソケットを指定
新しいDockerfile構文: RUN –-mount=type=ssh
11
# syntax = docker/dockerfile:1.1-experimental
...
RUN --mount=type=ssh git clone ssh://github.com/...
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(パスフレーズ入力)
$ docker build –-ssh default=$SSH_AUTH_SOCK ...
● クライアント側で export DOCKER_BUILDKIT=1 して docker build を実
行するとBuildKitが有効になる
○ あるいは, /etc/docker/daemon.json に
{“features”:{“buildkit”:true}} と記述しても有効化できる
● 後述するCLIプラグインdocker buildxを入れると、更に多くの機能が使
えるようになる
○ multi-platform build
○ docker-compose.ymlを用いたビルド ...
● Dockerに依存しない単体のBuildKitもある
● BuildKitが有効になっていると docker build の出力が大きく変わる
(次スライド)
BuildKitの使い方
12
BuildKitの使い方
従来 BuildKitモード
13
非rootユーザでのDocker daemonの実行
(Docker 19.03〜)
14
非rootユーザでのDocker daemonの実行
15
● Dockerはクライアント (docker CLI) と デーモンに別れている
● 従来はデーモンがroot権限で動作していたため、セキュリティ上の懸念が
あった
○ Dockerに脆弱性があれば、ホストのroot権限まで乗っ取られる可能性がある
● Docker 19.03からは、非rootユーザでデーモンを実行可能となった
○ もしDockerに脆弱性があっても、デーモン実行ユーザ以上の権限は乗っ取ら
れない
○ User Namespacesを用いて実装されている
○ apt-getやyumなど、本来root権限を要するコマンドも、大抵実行可能
■ modprobeなど危険なコマンドは実行できない
デモ
16
“rootless”版インストーラ
17
● 今の所、非root権限で動くDockerは、インストーラが別れている
● Webブラウザ上でも試せる
https://www.katacoda.com/courses/docker/rootless
$ curl -fsSL https://get.docker.com/rootless | sh
Docker-in-Docker
18
● 非rootのDockerを、従来のDocker・Kubernetesの中にネストすることも
出来る (dind-rootless)
● CI/CDパイプラインや、FaaS-likeなユースケースに有用
● ただし--privilegedは従来通り必要
○ AppArmor, seccompを無効化するのに加え、procfs, sysfsのマスクを解除す
る必要があるため
○ イメージをビルドするだけなら、Docker抜きの単体のBuildKitを、
--privileged無しで動かす方���良いかも知れない
■ BuildKitでも、AppArmor, seccompを無効化する必要はあるが、Kubernetes環境
ではそもそも無効になっていることが多い
Docker-in-Docker
19
● 参考: Docker-in-UML-in-Docker というのもある
https://github.com/weber-software/diuid
○ User Mode Linuxを間に挟む
○ --privilegedなどのフラグを何もつけずにdocker runで動かせる
○ システムコール呼び出しのオーバヘッドが極めて大きいので、ユースケース
は限られる
GPU対応強化
(Docker 19.03〜)
20
GPU対応強化
21
● 2015-2017: nvidia-docker
○ dockerコマンドの代わりにnvidia-dockerコマンドを利用
○ 通常のdockerコマンド前提のツールとの相性が悪かった
● 2017-2019: docker run --runtime=nvidia
○ OCIランタイムとして、runcの代わりにNVIDIA Container Runtimeを利用
○ 通常のdockerコマンドが使えるようになったものの、Docker自体は未だ
GPU-awareではなかった
● 2019-: docker run --gpus
○ Docker自体が公式にGPUをサポート
○ NVIDIA以外のベンダのGPUにも対応見込
GPU対応強化
22
● 現時点では “nvidia”ドライバのみ実装されている
● nvidiaドライバの利用には、従来通りnvidia-container-cliがインス
トールされている必要がある
$ docker run --gpus all
$ docker run --gpus 2,driver=nvidia,capabilities=compute
Docker Application Packages
(2018年6月〜)
23
Docker Application Packages
24
● Dockerイメージとdocker-compose.ymlを、まとめてレジストリに
push・pullできる
● Cloud Native Application Bundle (CNAB) 仕様準拠
$ cat docker-compose.yml
version: "3.6"
services:
worker:
image: dockersamples/examplevotingapp_worker
...
$ docker-app push . -t example.com/foo.dockerapp
Docker Application Packages
25
● レジストリ上のバンドルから復元したdocker-compose.yml には、もとも
と参照されていたイメージではなく、新たにコピーされたイメージへの参
照が含まれる (もともとのレジストリにアクセスできなくて良い)
$ docker-app render example.com/foo.dockerapp
version: "3.6"
services:
worker:
image: example.com/foo.dockerapp@sha256:55753a7b...
Docker Application Packages
26
● バンドルは、SwarmやKubernetesにもデプロイ可能
● ただしKubernetesへデプロイするには、
Docker Compose-on-Kubernetes (次のスライド) がクラスタ上にインス
トールされている必要がある
$ docker-app install --orchestrator kubernetes 
example.com/foo.dockerapp
Docker Compose-on-Kubernetes
(2017年12月公開、2018年12月OSS化)
27
Docker Compose-on-Kubernetes
28
● docker-compose.yamlを用いて、マルチノードのKubernetesクラスタ上
にアプリケーションをデプロイできる
● ComposeのYAMLはKubernetesのYAMLよりも簡潔
○ Deployment (Kubernetes用語)と Service (Kubernetes用語)を、単一のService
(Compose用語)でまとめて定義できる
○ PVCやSecretも簡潔に扱える
● 2017年12月 プロプラとして公開、2018年12月 OSS化
$ docker stack deploy -c docker-compose.yaml foo
$ kubectl get deployments
$ kubectl get services
CLIプラグイン
(Docker 19.03〜)
29
CLIプラグイン
30
● docker CLIをプラグインとして拡張できるようになった
● ~/.docker/cli-plugins にバイナリ docker-foo を配置すると、
docker foo として実行できる
● 面白いプラグインが色々出てきている
○ docker buildx: BuildKitモード docker build の拡張版
○ docker app: (docker-appと同じ)
○ docker wasm: WebAssemblyアプリケーションをコンテナのように実行
○ docker expose: ngrokを用いて簡単にコンテナをインターネットに公開
○ …
● Docker Enterpriseには、 docker assemble 、 docker template 、
docker cluster 、 docker gmsa 、 docker registry など付属
docker buildx
31
● BuildKitモードのdocker buildとだいたい同じであるが、独自の機能がいく
つか加わっている
● Multi-platform build
○ 複数アーキテクチャ (例: amd64 + arm64) に対応したイメージをビルド
○ リモートのarm64にHTTPSまたはSSHで接続し、ビルドに利用できる
○ 実機のarm64がなくても、QEMU usermode emulationで代用可能
(VM作成不要、binfmt_miscを登録するだけ)
● docker-compose.yamlからのビルド
$ docker buildx build --platform linux/amd64,linux/arm64
$ docker buildx bake -f docker-compose.yaml
docker wasm
32
● WebAssemblyアプリケーションをコンテナのように扱うことが出来る
● ランタイムとしてはwasmerまたはwasmtimeが用いられる
● イメージは、前述のdocker buildxを用いて、linux/amd64・wasi/wasm
両対応のマルチプラットフォームイメージとしてビルドできる
$ docker run tonistiigi/hello
Hello world, I am linux/amd64!
$ docker wasm run tonistiigi/hello
Hello world, I am wasi/wasm!
https://github.com/tonistiigi/wasm-cli-plugin
docker expose
33
● ngrokを用いて簡単にコンテナをインターネットに公開できる
● Dockerホストからngrokにコネクションを張り、reverse forwardするの
で、Dockerホストのポートを開けたりしなくて済む
$ docker run --name nginx -d nginx
$ docker expose nginx 80
...
https://deadbeef.ngrok.io
...
https://github.com/lukaszlach/clip/tree/master/clips/expose
まとめ
34
● より高速でセキュアな docker build (BuildKitモード)
● 非rootユーザでのDocker daemonの実行
● GPU対応強化
● Docker Application Packages
● Docker Compose-on-Kubernetes
● CLIプラグイン
○ WASM
○ ngrok
○ ...
ブログ
35
https://medium.com/nttlabs

More Related Content

[CNDT] 最近のDockerの新機能