Above & Beyond

日々のアウトプット記録

Docker Meetup Tokyo #29 (Docker Bday #6)

03/27(水) は「Docker Meetup Tokyo #29 (Docker Bday #6)」に参加してきました。

dockerjp.connpass.com

f:id:kabukawa:20190324220349p:plain

会場は 日本電信電話株式会社 さんの ソフトウェアイノベーションセンタ 。

f:id:kabukawa:20190329124800j:plain


目次


Docker Meetup Tokyo とは

グループの概要から引用します。

オープンソースの軽量コンテナ Docker のmeetupです.


何故参加したか

なんだかんだ言いつつも、コンテナと言えばDockerだと思いますし、面白いから、ですかね。


タイムテーブル (Time table)

時間 内容 発表者 (敬称略)
18:30 開場 (Door open)
19:00 イベントスタート (Event begins) Akihiro Suda (@AkihiroSuda)
19:05 簡易コンテナを作ってみる Gorilla (@gorilla0513)
19:20 コンテナベースアプリケーションの設計原則と現実 Kazuki Higashiguchi (@hgsgtk)
19:35 Dive into BuildKit LLB Hiromu Nakamura (@po3rin)
19:50 開発・CI・運用における Docker 戦略(クラシコムの場合) takeru0757
20:05 スポンサーセッション1 CREATIONLINE
20:15 スポンサーセッション2 Forkwell (Grooves Inc.)
20:25 ネットワーキング (Networking) 各自
21:50 撤収開始 (Clean-up) 有志
22:00 終了 (Door close)

内容

Akihiro Suda (@AkihiroSuda) さんによるオープニング。

f:id:kabukawa:20190329133338j:plain:w300

今回はDocker 誕生から6周年を祝う Birthday イベントも兼ねて行われました。

f:id:kabukawa:20190329134709j:plain:w500

Docker 社公式Blogでも世界中で Docker 誕生から6周年を祝う Birthday イベント が行われていることが書かれています。(もちろん日本も!)

blog.docker.com

そしてもう一つ。DockerCon 2019のチケットが 20% OFF になる登録コードが発表されました。DockerCon 2019に参加しようと考えている方は是非利用してください!

dockercon19.smarteventscloud.com

DOCKERBDAY20 です!

f:id:kabukawa:20190329134412j:plain:w300


Dockerの周辺OSS

Gorilla (@gorilla0513)

f:id:kabukawa:20190329133051j:plain:w300

f:id:kabukawa:20190329131857p:plain

Try make a simple container(Docker Meetup Docker #29) - Google スライド

コンテナと仮想化の違いについて

f:id:kabukawa:20190329143114p:plain:w300 f:id:kabukawa:20190329143128p:plain:w300

  • 仮想化はコンピューター自身をソフトウェアで仮想化した環境を作る
  • コンテナは Linuxカーネルの機能を利用してリソースを分離・制限する

リソースを分離・制限している仕組み、namespace と control groups(cgroup)について

f:id:kabukawa:20190329143606p:plain:w300 f:id:kabukawa:20190329143623p:plain:w300

どのように namespaces を使っているか?

system call 機能
unshare system call 現在のプロセスを新しいnamespaceに関連付け
clone system call 新しいプロセスを新しいnamespaceに関連付け
setns system call 現在のプロセスを既存のnamespaceに関連付け

どのように control groups を使っているか?

  • cgroup-tools(libcgroup) を使用
    • cgcreate: 新しい group を作成
    • cgdelete: 既存の group を削除
    • cgexec: 既存の group 上でコマンドを実行
  • cgroupfs によるファイル操作
mkdir /sys/fs/cgroup/cpu/$UUID
sudo echo 50000 | sudo tee /sys/fs/cgroup/cpu/$UUID/cpu.cfs_quota_us
echo $$ | sudo tee /sys/fs/cgroup/cpu/$UUID/cgroup.procs

コンテナツールとして紹介されていた3つのツール。3つとも日本の方が作成。

MINCS github.com

aqr(AQuaRium) github.com

Haconiwa github.com

まとめ

f:id:kabukawa:20190329150635p:plain:w500

Gorilla (@gorilla0513) さん作成のツールについてはこちらで。

qiita.com


個人メモ:

  • コンテナは Linux カーネルの持つ namespace と control group という仕組みの組み合わせで実現されている。
  • System Call とか cgroup とか カーネルランド/ユーザーランド はLinux使いとしては知っていたけど、改めて復習した感じ。
  • 仕組みがわかれば bash とgo でコンテナを作成できるというのが面白い。そういう風に使うのか、という驚き。

コンテナベースアプリケーションの設計原則と現実

Kazuki Higashiguchi (@hgsgtk)

f:id:kabukawa:20190329133112j:plain:w300

speakerdeck.com


トークの概要

1.構成

構成の機能

  • "実行時"データ(起動時に必要)
  • 環境ごとに異なる
  • 多くの値

構成に対する要求

  • 階層的に管理する
  • 構成をわかりやすくする
  • 設定を外部化する
  • アプリケーションから設定を取り除く
  • 最小限のアクセシビリティ
  • 設定にクレデンシャルが含まれている

関連する原則

構成:実例

devblog.thebase.in

設定:実際の問題

  • クラウドベンダが提供する機能に依存
  • うまく統合された機能なら、「シンプル」に
  • そうでない場合は「複雑」になる場合がある

例:Fargate&Parameter Store

  • パラメータストアを外部設定ストアとして使用する例
  • プラットフォームバージョン1.3より前と後で異なる

2.ロギング

ロギングに対する要求

  • リアルタイム
    • 「今起こっていること」を知る
  • 可用性 *ログが無い、ということが無い
  • 検索中
    • 問題の原因の特定を「簡単」にする

関連する原則

“06. LOGS”

  • ログをイベントストリームとして扱う
  • ファイルシステムに依存しない
  • STDOUT / STDERRの「ログ」
  • ツールを使用する(例:ElasticSearch、Logstash、Kibana)
    • 集約の要件を満たすため
    • ログの処理、保管

ロギング:実例

qiita.com


3.アプリケーションの構築

アプリケーションの構築に対する要求

  • 依存関係管理      * アプリケーションの依存関係を管理する
  • 異なる環境で稼働      * ローカルでの稼働、品質保証、状態、本番稼働

アプリケーションコンポーネント

  • ランタイムエンジン
  • コード
  • 依存関係
  • 構成(設定)

コンテナアプリケーション

  • コンテナには以下のものを含む
    • ランタイムエンジン
    • コード
    • 依存関係
  • 構成(設定)は起動時に注入

関連する原則

アプリケーションを構築する:本当の問題

  • ベストプラクティス:同じコンテナがすべての環境を提供
  • しかし、ローカル環境では、開発効率も重要

自分たちに合ったバランスを見つける

  • Docker for local
    • メリットを弱める
    • 開発者を強化する
  • 適切なバランスを見つける必要性

4.モニタリング

モニタリングに対する要求

  • 健康状態をチェックする      * モニタリングするアプリの健康
  • メトリクスを見続ける      * メトリクスを見続ける

関連する原則

HIGH OBSERVABILITY PRINCIPLE (HOP)

  • コンテナを「ブラックボックス」のように扱う
  • さまざまなステータスチェック用のAPIを提供する
    • 活動状況
    • 準備状況
  • STDOUT / STDERRに重要なイベントを記録する

Health endpoint パターン

Mackerel Container Agen

mackerel.io


個人メモ:

  • 最後のモニタリングの部分、Health endpoint パターンとか聞き覚えがあると思ったら先週参加した Rancher Meetupで @songmu さんが話していた内容だった。

kabukawa.hatenablog.jp

*「Practical Monitoring」は 日本語版は「入門監視」ですね。

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

  • これだけの内容を話すにはもっと時間が必要ですね、と内容を読み直してこれを書きながら思いました。

Dive into BuildKit LLB

Hiromu Nakamura (@po3rin)

f:id:kabukawa:20190329133130j:plain:w300

speakerdeck.com

Buildkitの内部の仕組みなどについての内容。


Moby とは

BuildKit とは

  • Moby Engineの現在のビルド機能の内部を置き換えることを目的とした新しいコードベース
  • Docker v18.0.6以降では 環境変数で BuildKit を有効にできる

LLB(Low-Level intermediate build format)

  • BuildKitはローレベル中間ビルドフォーマット(LLB:Low-Level intermediate build format)を採用し、ビルドの実行パスを依存グラフ構造で表現できるようにした。
  • BuildKitがビルド高速化を可能にした立役者。
  • 命令間の依存関係をDAG(Directed Acyclic Graph)として表現することで、命令の並列実行と正確なキャッシュ判定を実現

llb2dot

  • DockerfileをLLBとして解析しDOT言語に変換するツール

github.com

llb2dotについての発表資料も見つけたので貼っておきます。

speakerdeck.com

DAG(directed acyclic graph) in LLB

f:id:kabukawa:20190330122621p:plain:w500

LLBは任意の入力を変換して生成。最終的に build deamon がビルド成果物を指定されたexporterの形式で出力

f:id:kabukawa:20190330122657p:plain:w500

LLBの構造の仕様

github.com

Function to convert Dockerfile to LLB

github.com

Dockerfile2LLB は内部でDockerfileをASTに変換しているので、DockerfileのLinterも作成可能

github.com

ビルドフローを見ると、LLBさえ生成できれば、Frontendは何を使っても良いことになる

オリジナルの BuildKit LLB frontendの例

github.com

カスタムフロントエンドを作成する簡単な方法

  1. 任意のフォーマットからLLBに変換する処理を作る
  2. buildkitが提供するGateway APIを使う
  3. 一連の処理をバイナリ化してDockerイメージで実行できるようにしておく

[f:id:kabukawa:20190330125043p:plainw500]


個人メモ:

  • LLBというのを初めて知った。
  • llb2dotを使うとDockerfileのビルドを可視化できる。これは面白い。
  • 面白そうなので引き続きLLBについてはウォッチしていきたい。

開発・CI・運用における Docker 戦略(クラシコムの場合)

takeru0757

f:id:kabukawa:20190329133144j:plain:w300

speakerdeck.com

クラシコムの ”北欧、暮らしの道具店” のコンテナ化を紹介。


hokuohkurashi.com

技術スタック

課題

  • アプリケーションが細分化されている
    • 連携する複数アプリケーション・ミドルウェア(※マイクロサービスではない)
  • Opsworksでデプロイ
    • Chefのコードが肥大化していて秘伝のタレみたいな状態に。

コンテナ(Docker)化で達成したいこと

f:id:kabukawa:20190403142811p:plain

The Twelve-Factor App (日本語訳)

  1. エンジニア間における開発環境の統一
    • 自分用につくった docker-compose.yml + Dockerfile を独立したリポジトリとして社内で共有。
    • → エンジニア間での開発環境は統一できつつある ☺
  2. 開発とCIにおける環境の統一(進行中)
    • 環境を統一したいのに、必要となるものが微妙に違う
      • 開発環境:PHP + Xdebug + node + nginx
      • CI:PHP + Xdebug + node + git (for CircleCI)
    • 異なるものを1つのものでカバーするのは違和感がある。
    • ベースとなるDockerfileから派生版を作るスクリプトを書いてみたりしているが、使い方のノウハウが必要になってしまうのが課題。
    • Dockerfileで条件分岐が欲しい
    • docker build でターゲット指定すると条件分岐的なことができる docker build --target
  3. プロダクションと開発・CIにおける環境の統一(進行中)
    • 本番環境のコンテナ化。
    • 昨年、アプリケーションの1つを全面的に書き換えを行い、それに併せてKubernetesを導入しようとしたが挫折
    • 現在はAWS ECSを導入する方向で進んでいる。(将来的にはKubernetesに再チャレンジしたい)

docs.docker.com

クラシコムさんのコンテナ化についてはこちらも参照してください。

speakerdeck.com


個人メモ:

  • 条件分岐をできるようにすると結局複雑化して秘伝のタレ、みたいになる気がしなくもない。
  • どうしても参加したいから登壇した、というところが凄い。
  • 会場の反応を見る限り、コンテナ化をする時に悩むポイントはあまり変わらないのかな、と思った。

スポンサーセッション1

CREATIONLINE

f:id:kabukawa:20190329133158j:plain:w300

クリエーションラインさんの提供するDocker, Chef, などなど。k8s のサービスとトレーニン

www.creationline.com

DockerやKubernetesに対応するコンテナイメージ共有ソフトウェア「Beiran」

beiran.io


スポンサーセッション2

Forkwell (Grooves Inc.)


懇親会

ケーキがあると盛り上がりますね!しかも今回はお寿司もあって豪華!

f:id:kabukawa:20190329133219j:plain

ケーキもお寿司もとても美味しかったです! 去年に引き続き、Tシャツもいただきました!ありがとうございます!


まとめ

最近抽選から外れたり、他の勉強会と日程が重なって参加できなかったりしたので、今回はだいぶ久しぶりでの参加でした。 でも、去年に引き続きBirthdayイベントに参加できたのは本当に幸運だったと思います。

話されている内容も、どれも内容が濃くて勉強になることがたくさんありました。 1年経って、勢いは未だ衰えず。スピーカーや参加者、そしてスタッフの方々の熱気が本当に凄いなと感じました。 (その感じがこの記事を通して読んでいる人に伝わるといいなと思います)

スピーカー、スタッフ、参加者の皆様、ありがとうございました!