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.

[CNDT] 最近のDockerの新機能

10,797 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

×