Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Docker 18.09 新機能

4.079 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Software
  • Als Erste(r) kommentieren

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の新機能 まとめ

×