Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
最近の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/ にて告知
● 所属: 日本電信電話株式会社 ソフトウェアイノベーションセンタ
● コンテ...
最近のDockerの新機能
3
● より高速でセキュアな docker build (BuildKitモード)
● 非rootユーザでのDocker daemonの実行
● GPU対応強化
● Docker Application Packag...
最近のDockerの新機能
4
● より高速でセキュアな docker build (BuildKitモード)
● 非rootユーザでのDocker daemonの実行
● GPU対応強化
● Docker Application Packag...
BuildKit: 次世代 docker build
(Docker 18.06〜)
5
● マルチステージDockerfileから並行性を抽出
BuildKit: 次世代 docker build
6
FROM golang AS stage0
...
RUN go build –o /foo ...
FROM clang AS ...
●DAGはマルチステージDockerfileを用いて記述できる
BuildKit: 次世代 `docker build`
FROM golang AS stage0
...
RUN go build –o /foo ...
FROM clang...
● BuildKitでは、Dockerfileの最初の行に
# syntax = docker/dockerfile:1.1-experimental
を指定すると,非標準の命令を利用できる
● 例: RUN –-mount=type=cach...
Docker 18.03比で30倍以上高速! 9
https://t.co/aUKqQCVmXa より引用
● S3やSSHの鍵を安全にマウントしてRUNできる
● マウントされるだけなので,出力イメージ内には残らない
○ 従来のCOPYだと、後でrmしても残ることに注意
● docker build --secret を用いて鍵ファイルを指定
新し...
● クライアントのssh-agentソケット(SSH_AUTH_SOCK)にアクセスできる
○ SSHの鍵にパスフレーズを設定している場合に便利
● docker build --ssh を用いてソケットを指定
新しいDockerfile構文:...
● クライアント側で export DOCKER_BUILDKIT=1 して docker build を実
行するとBuildKitが有効になる
○ あるいは, /etc/docker/daemon.json に
{“features”:{“...
BuildKitの使い方
従来 BuildKitモード
13
非rootユーザでのDocker daemonの実行
(Docker 19.03〜)
14
非rootユーザでのDocker daemonの実行
15
● Dockerはクライアント (docker CLI) と デーモンに別れている
● 従来はデーモンがroot権限で動作していたため、セキュリティ上の懸念が
あった
○ Docker...
デモ
16
“rootless”版インストーラ
17
● 今の所、非root権限で動くDockerは、インストーラが別れている
● Webブラウザ上でも試せる
https://www.katacoda.com/courses/docker/rootless...
Docker-in-Docker
18
● 非rootのDockerを、従来のDocker・Kubernetesの中にネストすることも
出来る (dind-rootless)
● CI/CDパイプラインや、FaaS-likeなユースケースに有用...
Docker-in-Docker
19
● 参考: Docker-in-UML-in-Docker というのもある
https://github.com/weber-software/diuid
○ User Mode Linuxを間に挟む
○...
GPU対応強化
(Docker 19.03〜)
20
GPU対応強化
21
● 2015-2017: nvidia-docker
○ dockerコマンドの代わりにnvidia-dockerコマンドを利用
○ 通常のdockerコマンド前提のツールとの相性が悪かった
● 2017-2019: do...
GPU対応強化
22
● 現時点では “nvidia”ドライバのみ実装されている
● nvidiaドライバの利用には、従来通りnvidia-container-cliがインス
トールされている必要がある
$ docker run --gpus ...
Docker Application Packages
(2018年6月〜)
23
Docker Application Packages
24
● Dockerイメージとdocker-compose.ymlを、まとめてレジストリに
push・pullできる
● Cloud Native Application Bundle ...
Docker Application Packages
25
● レジストリ上のバンドルから復元したdocker-compose.yml には、もとも
と参照されていたイメージではなく、新たにコピーされたイメージへの参
照が含まれる (もともと...
Docker Application Packages
26
● バンドルは、SwarmやKubernetesにもデプロイ可能
● ただしKubernetesへデプロイするには、
Docker Compose-on-Kubernetes (次の...
Docker Compose-on-Kubernetes
(2017年12月公開、2018年12月OSS化)
27
Docker Compose-on-Kubernetes
28
● docker-compose.yamlを用いて、マルチノードのKubernetesクラスタ上
にアプリケーションをデプロイできる
● ComposeのYAMLはKubernet...
CLIプラグイン
(Docker 19.03〜)
29
CLIプラグイン
30
● docker CLIをプラグインとして拡張できるようになった
● ~/.docker/cli-plugins にバイナリ docker-foo を配置すると、
docker foo として実行できる
● 面白いプラグ...
docker buildx
31
● BuildKitモードのdocker buildとだいたい同じであるが、独自の機能がいく
つか加わっている
● Multi-platform build
○ 複数アーキテクチャ (例: amd64 + ar...
docker wasm
32
● WebAssemblyアプリケーションをコンテナのように扱うことが出来る
● ランタイムとしてはwasmerまたはwasmtimeが用いられる
● イメージは、前述のdocker buildxを用いて、linu...
docker expose
33
● ngrokを用いて簡単にコンテナをインターネットに公開できる
● Dockerホストからngrokにコネクションを張り、reverse forwardするの
で、Dockerホストのポートを開けたりしなくて...
まとめ
34
● より高速でセキュアな docker build (BuildKitモード)
● 非rootユーザでのDocker daemonの実行
● GPU対応強化
● Docker Application Packages
● Dock...
ブログ
35
https://medium.com/nttlabs
Upcoming SlideShare
Loading in …5
×

[CNDT] 最近のDockerの新機能

5,977 views

Published on

最近1年でDockerに追加された新機能を,わかりやすく紹介します.
・より高速でセキュアな `docker build` (BuildKitモード)
・非rootユーザでのDocker daemonの実行
・Docker Application Packages
・Docker Compose-on-Kubernetes
・CLIプラグイン
...

Published in: Software
  • Be the first to comment

[CNDT] 最近のDockerの新機能

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

  7. 7. ●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
  8. 8. ● 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
  9. 9. Docker 18.03比で30倍以上高速! 9 https://t.co/aUKqQCVmXa より引用
  10. 10. ● 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 ...
  11. 11. ● クライアントの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 ...
  12. 12. ● クライアント側で 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
  13. 13. BuildKitの使い方 従来 BuildKitモード 13
  14. 14. 非rootユーザでのDocker daemonの実行 (Docker 19.03〜) 14
  15. 15. 非rootユーザでのDocker daemonの実行 15 ● Dockerはクライアント (docker CLI) と デーモンに別れている ● 従来はデーモンがroot権限で動作していたため、セキュリティ上の懸念が あった ○ Dockerに脆弱性があれば、ホストのroot権限まで乗っ取られる可能性がある ● Docker 19.03からは、非rootユーザでデーモンを実行可能となった ○ もしDockerに脆弱性があっても、デーモン実行ユーザ以上の権限は乗っ取ら れない ○ User Namespacesを用いて実装されている ○ apt-getやyumなど、本来root権限を要するコマンドも、大抵実行可能 ■ modprobeなど危険なコマンドは実行できない
  16. 16. デモ 16
  17. 17. “rootless”版インストーラ 17 ● 今の所、非root権限で動くDockerは、インストーラが別れている ● Webブラウザ上でも試せる https://www.katacoda.com/courses/docker/rootless $ curl -fsSL https://get.docker.com/rootless | sh
  18. 18. 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環境 ではそもそも無効になっていることが多い
  19. 19. Docker-in-Docker 19 ● 参考: Docker-in-UML-in-Docker というのもある https://github.com/weber-software/diuid ○ User Mode Linuxを間に挟む ○ --privilegedなどのフラグを何もつけずにdocker runで動かせる ○ システムコール呼び出しのオーバヘッドが極めて大きいので、ユースケース は限られる
  20. 20. GPU対応強化 (Docker 19.03〜) 20
  21. 21. 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にも対応見込
  22. 22. GPU対応強化 22 ● 現時点では “nvidia”ドライバのみ実装されている ● nvidiaドライバの利用には、従来通りnvidia-container-cliがインス トールされている必要がある $ docker run --gpus all $ docker run --gpus 2,driver=nvidia,capabilities=compute
  23. 23. Docker Application Packages (2018年6月〜) 23
  24. 24. 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
  25. 25. 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...
  26. 26. Docker Application Packages 26 ● バンドルは、SwarmやKubernetesにもデプロイ可能 ● ただしKubernetesへデプロイするには、 Docker Compose-on-Kubernetes (次のスライド) がクラスタ上にインス トールされている必要がある $ docker-app install --orchestrator kubernetes example.com/foo.dockerapp
  27. 27. Docker Compose-on-Kubernetes (2017年12月公開、2018年12月OSS化) 27
  28. 28. 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
  29. 29. CLIプラグイン (Docker 19.03〜) 29
  30. 30. 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 など付属
  31. 31. 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
  32. 32. 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
  33. 33. 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. 34. まとめ 34 ● より高速でセキュアな docker build (BuildKitモード) ● 非rootユーザでのDocker daemonの実行 ● GPU対応強化 ● Docker Application Packages ● Docker Compose-on-Kubernetes ● CLIプラグイン ○ WASM ○ ngrok ○ ...
  35. 35. ブログ 35 https://medium.com/nttlabs

×