Download - Docker基礎+docker0.9, 0.10概要
Docker基礎0.9/0.10概要@mainyaa
Image by docker blog
Who
● @mainyaa
● Kazuyuki Mori
● フロントエンドからバックエンドまでやる系エンジニア
● AngualrJSとDocker大好き
● Topgate, Inc. - http://www.topgate.co.jp/
● Happy New World - http://d.hatena.ne.jp/mainyaa
● 日経ソフトウエア 2014年06月号 でDockerの記事書いてます
○ WindowsでDockerやりたい人向け(ステマ)
Docker?
Image by docker blog
デプロイの問題
● デプロイしてみたら動きませんでした><
● サーバーごとに違う環境変数、pythonのバー
ジョン、ライブラリのバージョン
● 手元では上手くいくが、プロダクションでは転ぶ
場合にどうするか
● ロックインを避けつつスケールしたい
Dockerとは
● オープンソースの次世代仮想化技術
● アプリケーションを「コンテナ」にパッ
ケージング&デプロイ&実行
● 1回ビルドすればどこでも動く
● Dockerfileさえあればいつでも再現で
きる
● Go言語で書かれている
何を解決するの?
● デプロイ作業をもっと手軽に!
○ Dockerfileを元に必要なライブラリや環境変数もまとめ
てパッケージング
○ パッケージングしたコンテナ仮想環境を実行&テスト&
デプロイ
Dockerfileでインフラをコードとして扱える
何を解決するの?
● コンテナ仮想化
○ ビルドもデプロイも高速
○ オーバーヘッドが少ない
○ プラットフォームやハードウェアからの隔離環境
○ ラップトップで動いているものをそのままサーバーに持っ
ていける
問題が起きても、本番と同一のコンテナを手元で動かせ、shellで
入れるため再現性が高い
何を解決するの?
● ロールバック
○ すべてのコンテナには固有IDがある
○ Dockerfileの行ごとにコンテナIDが作られる
○ 全てのコンテナは親からの差分保存
○ gitのように失敗した時点に戻ってやりなおせる
○ アプリケーション、DB、ネイティブツールをコンテナ単位
に疎結合に
依存関係ごとバージョン切り替え&ロールバック
何を解決するの?
● VMと何が違うのか
○ Dockerfileでインフラをコードにできる
○ ゲストOSがなく、カーネルを共有しているためオーバー
ヘッドが少ない
○ 過去の成功分は再実行しないため、テストやCIも高速
○ Dockerコンテナ != Linuxコンテナ
VM vs コンテナ
Image by docker document
ハイレベルから見たコンテナ
● 軽量VM
○ プロセス隔離空間
○ ネットワーク隔離空間
○ リソース分離:CPU, メモリのcgroupsによる制御
○ ルートとして実行できる
○ コピーオンライト
○ ログはすべてstdout/stderr/stdin
ローレベルから見たコンテナ
● chrootの強化版
○ 1コンテナ=1プロセス
○ カーネルをホストと共有している
○ エミュレーションがない
■ VMでもないし準仮想化でもない
○ cgroupsによるリソース制限
Devにとってのコンテナ
● コンテナ内だけを気にすればよい
○ アプリケーションのコード
○ アプリケーションの依存ライブラ
リ
○ パッケージマネージャー
○ ネイティブアプリ
○ データ
Image by hisashi_0802
Opsにとってのコンテナ
● コンテナ外だけを気にすればよい
○ ログ
○ リモートアクセス
○ ネットワーク設定
○ リソースモニタリング
Image by グッ写/GATAGS
Dockerfile?
● OSのスクラッチイメージからアプリケーションが動作するまでを
書いたコード
● Dockerは、ビルド時にDockerfileの1行ごとにコンテナを作り、
sha1ハッシュのコンテナIDを割り当てる
● コンテナは常に親コンテナからの差分の積み上げ
● Dockerfileの一部を変えても、成功部分は実行しないため、テ
ストやCIが非常に高速になる
FROM ubuntu:12.04 # Pull base image.
RUN apt-get update
RUN apt-get apt-get install -y redis-server --
no-install-recommends # Install redis.
RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*EXPOSE 80 # Expose ports.
ENTRYPOINT ["/usr/bin/redis-server"] # Define default command.
AUFS?
● コピーオンライト
○ 変更が発生したら初めて保存
● レイヤー構造のファイルシステム
● 親コンテナからの差分のみを保存していく
● 差分こそDockerのキモ
コピーオンライト+AUFS?
● ルートファイルシステムはコピーオンライトで作られる
● もし、1GBのゲストOSを10個動かそうとした場合に使用する
ディスクスペースは・・・?
○ VM: 10GB
○ Docker: 1GB
● 高速デプロイ、省メモリ、省ディスクスペース
AUFS?
Image by docker document
AUFS?
Image by docker document
AUFS?
Image by docker document
AUFS?
Image by docker document
制約
● Linuxでしか動かない
● Linux カーネル3.8以降
● 64bitマシンのみ
● 運用面, securityの課題
Image by Docker blog
まとめ
● Dockerならディスクスペースを抑えつつ仮想化できるよ
○ 固めて、積み上げて、配信して、切り替える
○ コピーオンライトによる差分
○ どのコンテナにもshellで入って再現できる
● アプリケーションのお試しや配布が手軽にできる
● プライベートなPaaS● 自動テストやCI● 1日に数十回のデプロイ
● 中央集権型から分散型へ
○ CoreOS, etcd, Serf, HAProxy, SkyDNS
Image by Docker blog
Docker 0.9概要
● execution driversにより、足回りが
抽象化された
● 多数の隔離ツールがトレードオフとと
もに利用できるようになった。ドライ
バは絶賛開発中
● OpenVZ, systemd-nspawn, libvirt-
lxc, libvirt-sandbox, qemu/kvm,
BSD Jails, Solaris Zones, chroot
Image by docker blog
Docker 0.9概要
● バグ修正多数
● docker build 時に--rmがデフォルトになった
● libcontainerがデフォルトのドライバとなった
○ Pure Go-langで書かれたユーザーランドパッケージに
依存しない隔離ライブラリ
○ = lxcは必須じゃなくなった
Docker 0.9概要
Image by Docker blog
Docker 0.10概要
● バグ修正多数
● 品質向上とシステム管理者向けのアップデート
○ シグナルハンドリング修正
○ TLS認証サポート
○ sytemdプラグインサポート
Docker 1.0の目標
● プロダクション品質
● すべての主要なOSでのファーストクラスのサポート
● 小さなコアと安定したプラグインというアーキテクチャ
● 十分なドキュメント
● Dockerとパートナーによって、商用サポートができること
● Dockerの長期的なサポートを提供
Image by Docker blog
補足
● Facebookグループを作ったので良かったら入ってください
● https://www.facebook.com/groups/237393613114175/
Image by Docker blog