Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Docker 18.09 新機能

4.071 visualizaciones

Publicado el

Docker Meetup Tokyo #26 https://dockerjp.connpass.com/event/106358/

Publicado en: Software
  • Sé el primero en comentar

Docker 18.09 新機能

  1. 1. Copyright©2018 NTT Corp. All Rights Reserved. NTT ソフトウェアイノベーションセンタ 須田 瑛大 Docker 18.09 新機能 Docker Meetup Tokyo #26 (2018/11/21) https://medium.com/nttlabs https://slideshare.net/AkihiroSuda
  2. 2. 2 Copyright©2018 NTT Corp. All Rights Reserved. • コンテナ関連OSSのメンテナ(いわゆるコミッタ)を務めている • Docker Moby メンテナ (2016年11月~) • 2017年4月,OSSプロジェクトとしてのDockerはMobyに名前が変わった • 商用製品としてのDockerはMobyをベースとして開発されている • Moby BuildKitメンテナ (2017年夏 プロジェクト発足時~) • 次世代 `docker build` • CNCF containerdメンテナ (2017年9月~) • Kubernetesなどで利用できる次世代コンテナランタイム : ≒ : RHEL Fedora 自己紹介
  3. 3. 3 Copyright©2018 NTT Corp. All Rights Reserved. •BuildKitの正式採用 • 並列ビルド • コンテキストの差分転送 • キャッシュマウント • Secretマウント • SSHマウント •リモートDockerホストへのSSH接続 Docker 18.09の新機能 11月8日リリース 前回のリリース: 18.06 (7月) 次回のリリース: 19.03 18.09のサポート期間: 7ヶ月
  4. 4. 4 Copyright©2018 NTT Corp. All Rights Reserved. • DAG構造を備える中間言語であるLLBを用いる • Protocol Buffers形式 • 依存性を正確に表現できるので,キャッシュがよく効く • 命令を並列実行できる • LLBは主にDockerfileからコンパイルされる • Dockerfile以外の言語からのコンパイルも可能 (Heroku, CFのBuildpacksなど) • 他にも,コンテキストの差分転送などの最適化有り BuildKit: 次世代 docker build コンパイル Dockerfile LLB DAG Buildpacksなど docker-image://alpine Image git://foo/bar docker-image://gcc Run("apk add ..")Run("make") 3命令を同時に実行できる 2
  5. 5. 5 Copyright©2018 NTT Corp. All Rights Reserved. • 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
  6. 6. 6 Copyright©2018 NTT Corp. All Rights Reserved. • 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. 7. 7 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  8. 8. 8 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  9. 9. 9 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  10. 10. 10 Copyright©2018 NTT Corp. All Rights Reserved. • Dockerfileの最初の行に # syntax = docker/dockerfile:1.0- experimental を指定すると,非標準の命令を利用できる • 例: RUN –-mount=type=cache • コンパイラやパッケージマネージャのキャッシュディレクトリを保持できる • 将来的には,# syntax = ... を指定しなくても標準で利用できるようになる 新しいDockerfile構文: RUN –-mount=type=cache # syntax = docker/dockerfile:1.0-experimental ... RUN --mount=type=cache,target=/root/.cache go build ... https://github.com/moby/buildkit/pull/442 https://github.com/moby/buildkit/pull/455
  11. 11. 11 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用 Docker v18.03比で30倍以上高速!
  12. 12. 12 Copyright©2018 NTT Corp. All Rights Reserved. • S3やSSHの鍵を,RUNコンテナ内に安全にマウントできる • マウントされるだけなので,出力イメージ内には残らない • SSHの鍵にパスフレーズを設定している場合は,後述する RUN –-mount=type=ssh を 用いる • docker build –-secret を用いて鍵ファイルを指定 新しいDockerfile構文: RUN –-mount=type=secret # syntax = docker/dockerfile:1.0-experimental ... RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws s3 cp s3://... ... $ docker build –-secret id=aws,src=~/.aws/credentials ... https://github.com/moby/buildkit/pull/567
  13. 13. 13 Copyright©2018 NTT Corp. All Rights Reserved. • クライアントのssh-agentソケット(SSH_AUTH_SOCK)に,RUNコンテナから アクセスできる • docker build –-ssh を用いてソケットを指定 新しいDockerfile構文: RUN –-mount=type=ssh # syntax = docker/dockerfile:1.0-experimental ... RUN --mount=type=ssh git clone ssh://gitlab.com/... $ eval $(ssh-agent) $ ssh-add ~/.ssh/id_rsa (パスフレーズ入力) $ docker build –-ssh default=$SSH_AUTH_SOCK ... https://github.com/moby/buildkit/pull/608 https://github.com/moby/buildkit/pull/655
  14. 14. 14 Copyright©2018 NTT Corp. All Rights Reserved. • Heroku・Cloud FoundryのBuildpacksも,`docker build`から直接ビ ルドできる • やはりLLBに変換されて実行される Dockerfile以外の言語 # syntax = tonistiigi/pack --- applications: - name: myapp memory: 128MB disk_quota: 256MB random-route: true buildpack: python_buildpack command: python hello.py $ docker build –f manifest.yml ... https://github.com/tonistiigi/buildkit-pack
  15. 15. 15 Copyright©2018 NTT Corp. All Rights Reserved. • # syntax = … で指定する文字列は,ファイルを読んでLLBを出力するプ ログラム(フロントエンド)のコンテナイメージのreference文字列 • DockerfileでもBuildpacksでもない,独自のイメージ記述言語のフロン トエンドをユーザが実装し,利用することも可能 • Dockerfileは今後「方言」に分かれていくかも知れない • docker/dockerfile:1.0 が「標準語」 1行目に書く # syntax = …
  16. 16. 16 Copyright©2018 NTT Corp. All Rights Reserved. • クライアント側で export DOCKER_BUILDKIT=1 して docker build を実 行するとBuildKitが有効になる • あるいは, /etc/docker/daemon.json に {“features”:{“buildkit”:true}} と記 述しても有効化できる • Docker 18.06でも,デーモンをexperimentalモードで実行していれば BuildKitを有効化できる (Secretマウント,SSHマウントは利用不可) • BuildKitが有効になっていると docker build の出力が大きく変わる (次スライド) BuildKitの使い方
  17. 17. 17 Copyright©2018 NTT Corp. All Rights Reserved. BuildKitの使い方 従来 BuildKitモード
  18. 18. 18 Copyright©2018 NTT Corp. All Rights Reserved. • Dockerソケットへのアクセスを許すことは,ホストのroot権限を与える ことと同じ • インターネットへ向けてTCPでlistenするなら,TLSの設定が必須 • でもTLSの設定は面倒・間違いやすい Dockerソケットの設定
  19. 19. 19 Copyright©2018 NTT Corp. All Rights Reserved. Dockerソケットの設定 https://docs.docker.com/engine/security/https/ より引用 $ openssl genrsa -aes256 -out ca-key.pem 4096 Generating RSA private key, 4096 bit long modulus ................................................................................ ................................................................................ ............................++ ........++ e is 65537 (0x10001) Enter pass phrase for ca-key.pem: Verifying - Enter pass phrase for ca-key.pem: $ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 out ca.pem Enter pass phrase for ca-key.pem: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]:Queensland Locality Name (eg, city) []:Brisbane Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc Organizational Unit Name (eg, section) []:Sales Common Name (e.g. server FQDN or YOUR name) []:$HOST Email Address []:Sven@home.org.au $ openssl genrsa -out server-key.pem 4096 Generating RSA private key, 4096 bit long modulus ............................. ........................................++ .................................... .............................................................++ e is 65537 (0x10001) $ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr $ echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf $ echo extendedKeyUsage = serverAuth >> extfile.cnf $ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca- key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf Signature ok subject=/CN=your.host.com Getting CA Private Key Enter pass phrase for ca-key.pem: $ openssl genrsa -out key.pem 4096 Generating RSA private key, 4096 bit long modulus .........................................................++ ................++ e is 65537 (0x10001) $ openssl req -subj '/CN=client' -new -key key.pem -out client.csr $ echo extendedKeyUsage = clientAuth >> extfile.cnf $ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca- key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf Signature ok subject=/CN=client Getting CA Private Key Enter pass phrase for ca-key.pem: $ rm -v client.csr server.csr $ chmod -v 0400 ca-key.pem key.pem server-key.pem $ chmod -v 0444 ca.pem server-cert.pem cert.pem $ dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem -- tlskey=server-key.pem -H=0.0.0.0:2376 $ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem - H=$HOST:2376 version
  20. 20. 20 Copyright©2018 NTT Corp. All Rights Reserved. Dockerソケットの設定 https://docs.docker.com/engine/security/https/ より引用 $ openssl genrsa -aes256 -out ca-key.pem 4096 Generating RSA private key, 4096 bit long modulus ................................................................................ ................................................................................ ............................++ ........++ e is 65537 (0x10001) Enter pass phrase for ca-key.pem: Verifying - Enter pass phrase for ca-key.pem: $ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 out ca.pem Enter pass phrase for ca-key.pem: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]:Queensland Locality Name (eg, city) []:Brisbane Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc Organizational Unit Name (eg, section) []:Sales Common Name (e.g. server FQDN or YOUR name) []:$HOST Email Address []:Sven@home.org.au $ openssl genrsa -out server-key.pem 4096 Generating RSA private key, 4096 bit long modulus ............................. ........................................++ .................................... .............................................................++ e is 65537 (0x10001) $ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr $ echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf $ echo extendedKeyUsage = serverAuth >> extfile.cnf $ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca- key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf Signature ok subject=/CN=your.host.com Getting CA Private Key Enter pass phrase for ca-key.pem: $ openssl genrsa -out key.pem 4096 Generating RSA private key, 4096 bit long modulus .........................................................++ ................++ e is 65537 (0x10001) $ openssl req -subj '/CN=client' -new -key key.pem -out client.csr $ echo extendedKeyUsage = clientAuth >> extfile.cnf $ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca- key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf Signature ok subject=/CN=client Getting CA Private Key Enter pass phrase for ca-key.pem: $ rm -v client.csr server.csr $ chmod -v 0400 ca-key.pem key.pem server-key.pem $ chmod -v 0444 ca.pem server-cert.pem cert.pem $ dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem -- tlskey=server-key.pem -H=0.0.0.0:2376 $ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem - H=$HOST:2376 version
  21. 21. 21 Copyright©2018 NTT Corp. All Rights Reserved. Dockerソケットの設定 https://blog.trendmicro.co.jp/archives/19773 より引用
  22. 22. 22 Copyright©2018 NTT Corp. All Rights Reserved. • Docker 18.09では,`export DOCKER_HOST=ssh://ユーザ@ホスト`す るとTLSの代わりにSSHを用いてリモートDockerホストに接続できる • SSHはホストにDockerをインストールする前に何れにせよ設定するだろ うから,TLSと違って追加の手間が発生しない • 単に `ssh -l ユーザ ホスト – docker` コマンドを実行する場合と異な り,クライアントの ~/.docker/config.json に保存されているレジスト リ認証情報や,ビルドコンテキストにアクセスすることが可能 リモートDockerホストへのSSH接続
  23. 23. 23 Copyright©2018 NTT Corp. All Rights Reserved. • devicemapper 及び overlay ストレージドライバが非推奨になった • aufs も19.03から非推奨 • overlay2 が推奨 • json-file に代わるログドライバとしてlocalが導入された • Protocol Buffersを使うのでオーバヘッドが小さい • RPM・DEBパッケージ構成が変わった • docker-ce から docker-ce-cli と containerd.io が分離した • クライアントだけ欲しい場合は docker-ce-cli だけインストールすれば良い • Windows Subsystem for Linux ユーザなどに有用かも知れない • Ubuntu 14.04, Debian 8がサポート外となった その他の変更点
  24. 24. 24 Copyright©2018 NTT Corp. All Rights Reserved. • RUN –-mount=type=(cache|secret|ssh) の正式採用 • 非rootユーザでのDockerデーモンの実行 (#38050) • User Namespaceを用いる • --userns-remap と異なり,コンテナだけではなくDockerデーモンも非rootで実行 • Docker, containerd, runcが抱えうる脆弱性を軽減 • 今すぐ試したいなら https://github.com/rootless-containers/usernetes からバ イナリを入手できる (DockerだけでなくKubernetesも) • containerdとの重複コードの除去,軽量化 (#38043) • Dockerのストレージドライバをcontainerdの実装で置き換える Docker 19.03・19.09 予想
  25. 25. 25 Copyright©2018 NTT Corp. All Rights Reserved. •BuildKitの正式採用 • 並列ビルド • コンテキストの差分転送 • キャッシュマウント • Secretマウント • SSHマウント •リモートDockerホストへのSSH接続 Docker 18.09の新機能 まとめ

×