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.
Docker ライフサイクルの基礎
地雷を踏み抜けろ!
FUKUOKA DevOps 勉強会 #2 Docker を使った CI/CD
2016年4月7日(木)
@zembutsu
Technology Evangelist; Creation...
スライドで扱う内容
• Dockerとコンテナ&イメージ
• イメージとイメージ・レイヤの基本
• コンテナのライフサイクル
• Dockerfileの地雷原 ( CMD vs ENTRYPOINT , ADD vs COPY )
• 複数のコ...
本スライドについて
• 想定読者 – Dockerの基礎をこれから学ぶ方
✔ Docker イメージとコンテナの違いを知りたい
✔ 自分のイメージを作れるようになりたい
✔ ライフサイクルを理解して、自由に使えるようになりたい
• 発表
Dev...
Dockerとコンテナ&イメージ
■□□□□
Dockerプロジェクトの概要、コンテナとイメージの簡単なおさらい
C h a p t e r 1
5
Docker って何だったっけ?
‣ Docker
アプリケーションを開発・移動・実行するためのプラットフォーム
• 設計思想は、開発者が簡単にアプリケーションを動かす環境を作る
オープンソース・コミュニティ及び支援会社としての Docke...
開発者が簡単にアプリケーションを開発・デプロイできる仕組み
プラットフォーム
7
Dockerコンテナ
‣ コンテナとは
ホスト OS の kernel 機能を使い、複数のルート・ファイルシステムを実行
• 各ルート・ファイルシステムをコンテナ (container) と呼ぶ
コンテナは各々のリソースを持つ
• プロセス...
OS ( Linux )
物理/仮想サーバ
Docker エンジン
( docker デーモン )
Linux kernel
コンテナ コンテナ コンテナ
リモート
APIdocker
クライアント
・docker コマンド
Linux, Ma...
コンテナA コンテナB
Docker
コンテナ
それでは「コンテナ」とは一体何
なのでしょうか。
httpd
PID 1
コンテナA コンテナB
ruby
PID 1
chris.rb
PID 2
コンテナのプロセス 例えば2つのコンテナを実行す
ると、それぞれのコンテナが、独
立したプロセス(PID 1)として
起動します。お互いのプロセ...
httpd
PID 1
コンテナA コンテナB
ruby
PID 1
chris.rb
PID 2
コンテナのプロセス 実際のホスト上ではdockerの
プロセス・ツリー下にコンテナとし
て起動したプロセスが存在しま
す。コンテナ内は独立してい...
コンテナのファイルシステム プロセスを起動するには、何ら
かのバイナリやスクリプトなどのプ
ログラムが必要になります。コン
テナごとにルート・ファイルシステ
ムの領域を持っています。
このファイルシステムがDocker
イメージの一部です。コン...
コンテナのファイルシステム コンテナごとに個々のファイルシ
ステムは独立していますので、コ
ンテナ内では互いに見えません。
ですが、ホスト上では通常の
Linuxディレクトリ階層下に存
在しています。chrootのように、
プロセス(コンテナ)...
イメージとイメージ・レイヤの基本
■■□□□
Dockerイメージはファイルシステムとメタデータの集合体
イメージ・レイヤが積み重なりDockerイメージが構成されている
C h a p t e r 2
docker クライアント docker エンジン
$ docker run hello-world
run
次は、「Dockerコンテナ」を動
かすために「Dockerイメージ」と
どのような関係があるのかを見
てきましょう。
コンテナを動か...
docker クライアント docker エンジン
$ docker run hello-world
run
コンテナを動かそうとするとき
Docker Engine は指定され
たコンテナ名(正確にはリポジ
トリ)がローカルにあるかどうかを
...
docker クライアント docker エンジン
$ docker run hello-world
run
そしてDockerエンジンの環境
にイメージをダウンロードしました。
ですが、このままではコンテナを
実行できません。後ほど詳しく
扱...
docker クライアント docker エンジン
$ docker run hello-world
run
このイメージ上に読み書き可能
なレイヤを追加しています。図
の赤い部分です。これでコンテ
ナを起動する準備が整いました。
Docker...
docker クライアント docker エンジン
$ docker run hello-world
run
あとはアセンブラで書かれたhelloプログ
ラムのバイナリを、コンテナ用の独立した
プロセスとして実行します。
Docker Hub
...
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
03f465...
Docker
イメージ
次は、コンテナを動かす基となる
「Dockerイメージ」をもう少し
詳しくみてきましょう。
22
Docker イメージ
‣ Dockerイメージは
コンテナを実行する時に必要な
ファイルシステム
• イメージ・レイヤ(層)の集合体
– ファイルの実体やメタ情報を含む
• レイヤには親子関係がある
• 差分情報のみを記録する
• Re...
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
203137e8afd5: Pull complete
2ff1bbbe931...
$ docker pull wordpress
Using default tag: latest
latest: Pulling from library/wordpress
fdd5d7827f33: Already exists
a3ed...
Nginx イメージの構造
902b87aaaec9 3 months ago /bin/sh -c #(nop) ADD file:e1dd18493a216ecd0c 125.2 MB
9a61b6b1315e 3 months ago /...
イメージを視覚化する IMAGE LAYERS
https://imagelayers.io/?images=nginx:latest,nginx:stable,nginx:mainline-alpine,nginx:stable-alpine
ベース・イメージ
(公式イメージ等)
イメージ層
Docker コンテナを起動するとは
読み込み専用
(Read Only)
ベース・イメージ
(公式のubuntu等)
イメージ層
Docker コンテナを起動するとは
読み込み専用
(Read Only)
・新しいイメージ・レイヤの
自動的な割り当て
・イメージ内のプログラムを
独立したプロセスで実行
(コンテナ化さ...
コンテナのライフサイクル
■■■□□
Dockerコンテナを起動・実行・終了・削除に至るまでのライフサイクル
処理の内容と docker コマンドの基本を理解
C h a p t e r 3
30
‣ ハンズオン内容
– docker コマンドを操作しながら、Docker コンテナのライフサイクルを理解します。
– この章では docker/whalesay イメージの取得・実行をした後、自分でイメージを作成し、
Docker Hu...
レジストリ
(Docker Hub)
イメージイメージ
イメージ
R/W layer
Docker
Engine
pullrun
commit
新イメージ 新イメージpush
build
Docker コンテナのライフサイクル概要
通常dock...
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
• Docker イメージとはイメージ・レイヤ
(rootファイルシステム)とメタデー
タ(何のコマンドを実行するのか、ど
のポートを開くかなどの管理情報)の
集合体であり、読み込み...
33
練習1. hello-world コンテナの実行
‣ Dockerが正常に使えるかどうか確認します。hello-world という名前の
サンプルプログラムを実行します。
‣ docker run コマンドの書式:
• タグを省略すると、...
Dockerコンテナを実行するに
は、ローカルにイメージが必要で
す。イメージがなければ取得
(pull)する必要があります。
docker pull … イメージの取得
35
練習2. イメージの確認と取得
‣ ローカル環境上のイメージ一覧を確認するには docker images コマンド
を使います。先ほどの「hello-world」イメージがダウンロード済みかど
うかを確認します。
‣ Docker Hu...
36
‣ ダウンロードしたイメージの情報は、Docker Hub 上で確認できます。
https://hub.docker.com/r/docker/whalesay/
37
‣ whalesayイメージを使い、メッセージを表示するコンテナを実行します。
whalesay イメージは Ubuntu 14.04 をベースに、「cowsay」という鯨が
メッセージを表示するプログラムが入っています。
‣ docke...
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
• イメージを作成するには3つの方法
1. Docker Hub から取得する
2. コンテナの内容を手動でコミットし、
新しいイメージを作成する
3. Dockerfileを使って...
39
練習4. Dockerfileの作成
‣ Dockerfileは、自動的にDockerイメージを構築(build)する時に必要に
なるファイルです。イメージを構成する全ての要素を記述します。
‣ 作業用ディレクトリを作成し、移動します。
...
40
‣ docker build コマンドで「docker-whale」イメージを作成します。
• 「-t」は「イメージ名:タグ」を指定するオプションです。
• コマンドの最後に「.」が必要です。現在(.)のディレクトリをコンテキスト(イメー...
41
‣ 作成したイメージ docker-whale を使ってコンテナを実行します。
練習6. 新しいイメージを実行
$ docker run docker-whale
• Dockerfile で指定した CMD 命令を指定した
「fortu...
構築時の内部処理
• コンテクストで指定したディ
レクトリを Docker デーモン
に送信
• Dockerfile の FROM・RUN・
CMD の各命令ごとに構築の
ステップが進行する
• 各ステップごとに作業中の中
間コンテナを自動的...
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
docker history … イメージの履歴表示
docker diff… 元イメージとコンテナの差分表示
docker inspect… コンテナやイメージの調査
44
‣ イメージの詳細を表示する docker inspect コマンドで、構築したイメー
ジの情報を調べます。「Cmd」セクションが、先ほど CMD 命令で指定し
たコマンドになっていることを確認します。
‣ イメージの構築履歴を dock...
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
docker push … Dockerイメージの送信
docker login … ログイン
docker tag … イメージをタグ付け
docker search … 検索
46
練習8. Docker Hub に登録・ログイン
‣ 作成したイメージを Docker Hub で公開するため、まずはアカウントを
作成します。既にお持ちであれば、次に進みます。
‣ https://hub.docker.com/ にアク...
47
‣ Docker イメージを置く場所をリポジトリ(repository)と呼びます。
‣ ブラウザで Docker Hub を開き、 (作成)ボタンを押します。
• リポジトリ名は「docker-whale」とします。
• 簡単な説明(必...
48
‣ 改めて docker images で docker-whale のイメージ ID を確認します。
‣ イメージ(ID)には、複数のイメージ名やタグを付けられます。docker
tag コマンドを使い、docker-whale イメー...
49
‣ docker login コマンドを実行し、コンソール上から Docker Hub にログ
インします。
• 認証情報(アクセス用トークン)は ~/.docker/config.json に保管されます。
練習11. Dockr Hu...
50
‣ Docker Hub 上のリポジトリに送信するには docker push コマンドを使い
ます。先ほど docker tag で「ユーザ名/docker-whale」イメージを送信
します。
‣ ブラウザからも確認します。
練習12...
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
Dockerコンテナとイメージのライフサイクル
docker ps … コンテナ一覧や状態の表示
docker rmi … コンテナイメージ削除
docker rm … コンテナ削除...
52
練習13. イメージの削除と再実行
‣ ローカルのイメージは docker rmi (remove imageの意味)コマンドで削
除できます。先ほど作成したイメージを削除します。イメージIDもしくは
イメージ名やタグを指定して削除します...
53
‣ 不要なイメージは「docker rmi」コマンドで削除できます。
‣ 「docker run」コマンドの処理内容を思い出します。
– コマンドを実行する度に、毎回
イメージレイヤを作成しています。
– 「docker ps -a」コマ...
Copy on Write(コピー・オン・ライト)
読み込み専用
(Read Only)
• Read Only のイメージ層上
のファイルに対する変更は、
必ずコピー作業を行う
• 内部実装はストレージ・ドラ
イバに依存する(パフォーマ
ンス...
ボリュームはコンテナ用のレイヤとは分離
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
• イメージ・レイヤの仕様(Copy on Write)
を回避できる
• docker commit してもボリューム内容は反
映されない。...
Dockerfileと地雷原
■■■■□
Dockerのベストプラクティスと CMD vs ENTRYPOINT / COPY vs ADD
その他、活用にあたって考慮すべきストレージ・ドライバ等
C h a p t e r 4
57
‣ Dockerfile の役割
どのようなイメージにするか指示
• どのベース・イメージを使うのか?
• 何のプログラムをインストールするのか?
• どのようなコマンドを実行するのか
‣ docker build コマンドで構築
doc...
FROM ubuntu:14.04
RUN apt-get install -y wget
CMD /usr/bin/wget
FROM nginx
ADD ./contents /usr/share/nginx/html
FROM cento...
59
‣ .dockerignore ファイルの活用
‣ 不要なパッケージのインストールを避ける
‣ イメージ・レイヤの数を減らす
• ただし、読みやすさと使い勝手のバランス
• 「&&」「¥」
‣ キャッシュの活用
‣
一般的なガイドライン ...
60
‣ CMD vs ENTRYPOINT
• デフォルトで実行するコマンドが ENTRYPOINT
– 多くのイメージは /bin/bash がデフォルト
• ENTRYPOINT があると、CMD は ENTRYPOINT のパラメータに...
61
‣ ping を実行するコンテナを通して、挙動の違いを理解していきます。
‣ まず、ping を実行する myping コンテナを作成つくります。そのため、
ディレクトリを作成し、移動します。
‣ Dockerfile を作成し、中身を以...
62
‣ 「myping」コンテナを実行します。
• 「--rm」オプションは、コンテナ実行後、自動的にイメージレイヤを破棄します。都度、
docker rm を実行する必要がないため、コマンドとして使う場合に便利です。
• Dockerfil...
63
‣ 次は myping コンテナの引数に sh を指定して実行します。
• 「-i」はコンテナの標準入出力を有効にします。
• 「-t」は疑似ターミナルを有効にします。
• exit で終了します。
‣ 「sh」コマンドを指定したため、C...
64
‣ Dockerfile を開き、CMD 命令を ENTRYPOINT に書き換えます。
‣ 再度イメージを構築します。
‣ 今度は myping:1.1 を実行します。
ENTRYPOINT との比較
FROM busybox
ENTR...
65
‣ 何も指定しなくてもコマンドを実行するという意味では、CMD も
ENTRYPOINT も同様の処理です。しかし、docker run でコマンドの
引数を付けると挙動が違います。
– CMD … docker run で引数があれば、...
66
‣ 次の Dockerfile を作成し、 myping イメージを構築します。
‣ 引数を付けた場合と付けない場合で myping を実行します。
– ENTRYPOINT と CMD があれば、CMD は ENTRYPOINT に対す...
67
‣ イメージ・レイヤの理解
ストレージドライバの選択 ここから先は高度なトピックにな
ります。イメージ・レイヤはこれま
で見てきた通りですが、実際の
Linux サーバ上では、ストレー
ジ・ドライバによって実装が異な
ります。
イメージ、...
こちらは Ubuntu で標準の
AUFS ストレージ・ドライバ。
AUFS ストレージ・ドライバを使う
http://docs.docker.jp/engine/userguide/storagedriver/aufs-driver.html
Red Hat系列のディストリ
ビューションはDeviceMapper
Device Mapper ストレージ・ドライバを使う
http://docs.docker.jp/engine/userguide/storagedriver/devic...
汎用的に使えるストレージ・ドラ
イバはありません。それぞれのド
ライバの理解や、用途に応じた
使い分けや、パフォーマンス測
定が重要になってきます。
ストレージ・ドライバの選択
http://docs.docker.jp/engine/user...
71
‣ http://docs.docker.jp/
Dockerドキュメント日本語化プロジェクト
Dockerfile リファレンス
http://docs.docker.jp/engine/reference/builder.html
D...
複数のコンテナを効率的に管理
■■■■■
Docker Compose はコンテナをサービス郡として一括管理
Docker Swarm は複数の Docker Engine を束ねて管理
C h a p t e r 5
さて、
Dockerfileがあれば
楽々構築できるよね^^
でも、WebとDBが別々の
コンテナの場合は?^^;
Engine
$ docker run …
$ docker run …
$ docker run …
$ docker run …
Engine
$ docker-compose up
複数のコンテナをコードで管理
コンテナの同時起動・停止
コンテナのスケール
ネットワーク機能に対応(1.6~)
Engine
• docker run …
• docker run –d
• docker ps
• docker logs …
• docker stop …
• docker restart
• docker-compose up
• d...
wordpress:
image: wordpress
links:
- db:mysql
ports:
- 8080:80
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: exampl...
mongo:
image: mongo
command: mongod --smallfiles --oplogSize 128
rocketchat:
image: rocketchat/rocket.chat:latest
environm...
81
‣ Docker Composeは
複数のサービスを管理
• docker コマンドと互換性
‣ Compose ファイルで設定
• YAML形式
• docker-compose.yml 等
Compose
Engine
• docker run …
• docker run –d
• docker ps
• docker logs …
• docker stop …
• docker restart
• docker-compose up
• d...
複数のコンテナも
楽に管理できるね^^
あれ?
複数のサーバでは?^^;
$ docker run …
$ docker run …
$ docker run …
$ docker run …
$ docker run …
$ docker run …
docker engine
(docker daemon)
machine
docker client
$ docker run
コンテナ コンテナ
docker engine
(docker daemon)
machine
コンテナ コンテナ...
Swarm Manager
machine
docker client
$ docker run
docker engine
(docker daemon)
machine
docker engine
(docker daemon)
machi...
89
Swarm
‣ Docker Swarmとは
• コンテナの配置(スケジューリング)を行う
‣ dockerクライアントで操作可能
• 環境変数で切り替え
‣ Docker Machineと連携が便利
‣ Swarm 1.6 から書式が変...
Compose の例
version: '2'
services:
zabbix-db:
image: zabbix/zabbix-db-mariadb
volumes:
- zabbix-db-storage:/var/lib/mysql
- backups:/b...
まとめ
• Dockerとコンテナ&イメージ
• イメージとイメージ・レイヤの基本
• コンテナのライフサイクル
• Dockerfileの地雷原 ( CMD vs ENTRYPOINT , ADD vs COPY )
• 複数のコンテナを効率...
参考情報
• Dockerのドキュメント
• http://docs.docker.jp
95
私は誰?
‣ @zembutsu a.k.a. 前佛雅人
- Technology Evangelist; Creationline, Inc. – 2 yrs
- Technical Trainer; Docker Authorized...
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Upcoming SlideShare
Loading in …5
×

Dockerライフサイクルの基礎 地雷を踏み抜けろ!

9,423 views

Published on

2016年4月8日(金)
FUKUOKA DevOps勉強会 #2 Dockerを使ったCI/CD 発表資料
http://peatix.com/event/157567

Published in: Software
  • Be the first to comment

Dockerライフサイクルの基礎 地雷を踏み抜けろ!

  1. 1. Docker ライフサイクルの基礎 地雷を踏み抜けろ! FUKUOKA DevOps 勉強会 #2 Docker を使った CI/CD 2016年4月7日(木) @zembutsu Technology Evangelist; Creationline, Inc. What is Docker Images and Containers, and Container's life cycle. 背景画像CREDIT:スフィア / PIXTA(ピクスタ)
  2. 2. スライドで扱う内容 • Dockerとコンテナ&イメージ • イメージとイメージ・レイヤの基本 • コンテナのライフサイクル • Dockerfileの地雷原 ( CMD vs ENTRYPOINT , ADD vs COPY ) • 複数のコンテナを効率的に操作 ( Swarm & Compose ) 勉強会当日の振り返りと共に、 自習ハンズオン用にも活用でき るように、解説や便利な Tips を追記しています。 Dockerを思い通りに扱えるよ うになりたい初心者を想定して います。
  3. 3. 本スライドについて • 想定読者 – Dockerの基礎をこれから学ぶ方 ✔ Docker イメージとコンテナの違いを知りたい ✔ 自分のイメージを作れるようになりたい ✔ ライフサイクルを理解して、自由に使えるようになりたい • 発表 DevOps 勉強会 #2 Dockerを使ったCI/CD http://peatix.com/event/157567 当日資料の加筆版です。 登壇の機会をありがとうございました。
  4. 4. Dockerとコンテナ&イメージ ■□□□□ Dockerプロジェクトの概要、コンテナとイメージの簡単なおさらい C h a p t e r 1
  5. 5. 5 Docker って何だったっけ? ‣ Docker アプリケーションを開発・移動・実行するためのプラットフォーム • 設計思想は、開発者が簡単にアプリケーションを動かす環境を作る オープンソース・コミュニティ及び支援会社としての Docker, Inc. • 2013年3月 Python Conference US のライトニング・トークで発表 – 前身は PaaS 事業者だった dotCloud 社(後に事業売却) – https://github.com/docker/ • Open Container Initiative を通して各社と協調 – https://www.opencontainers.org/ developing, shipping, running ド ッ カ ー
  6. 6. 開発者が簡単にアプリケーションを開発・デプロイできる仕組み プラットフォーム
  7. 7. 7 Dockerコンテナ ‣ コンテナとは ホスト OS の kernel 機能を使い、複数のルート・ファイルシステムを実行 • 各ルート・ファイルシステムをコンテナ (container) と呼ぶ コンテナは各々のリソースを持つ • プロセス、メモリ、デバイス、ネットワーク Linux カーネルの技術を使う • Namespaces (名前空間によるプロセス間の隔離/分離;isolation) • Cgroups(CPU・メモリ・Disk I/Oのリソース制限) ‣ コンテナの実行に必要な環境 • Docker Engine(エンジン) – コンテナを移動・実行するための必要なプログラム(デーモン) ネームスペース アイソレーション コントロール・グループ 「Dockerコンテナ」を実行する とは、Linux ホスト上で個々の プロセスやファイルシステムを実 行することを指します。 Dockerエンジンはカーネルの 制御を仲介します。そのため、 コンテナを動かす環境では必ず エンジンが必要になります。
  8. 8. OS ( Linux ) 物理/仮想サーバ Docker エンジン ( docker デーモン ) Linux kernel コンテナ コンテナ コンテナ リモート APIdocker クライアント ・docker コマンド Linux, Mac OS X, Windows ・Kitematic (GUI) Mac OS X, Windows ・Docker Compose ・Docker Swarm こちらは最もシンプルな構成例です。 DockerエンジンはAPIで制御します。API でアクセスするのは「docker」コマンドや kitematicなどのDockerクライアントです。 このようにサーバ・クライアント型の構成。 TCP あるいは Unix ソケットドメイン
  9. 9. コンテナA コンテナB Docker コンテナ それでは「コンテナ」とは一体何 なのでしょうか。
  10. 10. httpd PID 1 コンテナA コンテナB ruby PID 1 chris.rb PID 2 コンテナのプロセス 例えば2つのコンテナを実行す ると、それぞれのコンテナが、独 立したプロセス(PID 1)として 起動します。お互いのプロセス は知らないため、互いに干渉で きません(設定に依存)。
  11. 11. httpd PID 1 コンテナA コンテナB ruby PID 1 chris.rb PID 2 コンテナのプロセス 実際のホスト上ではdockerの プロセス・ツリー下にコンテナとし て起動したプロセスが存在しま す。コンテナ内は独立している のでPIDが1に見えているだけで すが、ホスト上では通常のプロ セス同様PIDが割り振られます。 /sbin/init PID 1 docker PID 4 httpd PID 5 ruby PID 6 chris.rb PID 7 alice PID 2 bob PID 3 PPID 1 PPID 1 PPID 1 PPID 4 PPID 4 PPID 6 さらに各種リソースの制限を 行ったり、ネットワークI/Fなどを 制御できるのが特長です。
  12. 12. コンテナのファイルシステム プロセスを起動するには、何ら かのバイナリやスクリプトなどのプ ログラムが必要になります。コン テナごとにルート・ファイルシステ ムの領域を持っています。 このファイルシステムがDocker イメージの一部です。コンテナの 起動にはイメージを使います。 コンテナAのファイルシステム … … コンテナBのファイルシステム /etc /bin /etc /bin / /
  13. 13. コンテナのファイルシステム コンテナごとに個々のファイルシ ステムは独立していますので、コ ンテナ内では互いに見えません。 ですが、ホスト上では通常の Linuxディレクトリ階層下に存 在しています。chrootのように、 プロセス(コンテナ)が認識できな いだけなのです。 コンテナAのファイルシステム … … コンテナBのファイルシステム /etc (/data/ubuntu/etc) /bin (/data/ubuntu/bin) /etc (/data/centos/etc) /bin (/data/centos/bin) / / / /etc /data /data/ubuntu /data/centos /bin
  14. 14. イメージとイメージ・レイヤの基本 ■■□□□ Dockerイメージはファイルシステムとメタデータの集合体 イメージ・レイヤが積み重なりDockerイメージが構成されている C h a p t e r 2
  15. 15. docker クライアント docker エンジン $ docker run hello-world run 次は、「Dockerコンテナ」を動 かすために「Dockerイメージ」と どのような関係があるのかを見 てきましょう。 コンテナを動かす(run)するため には「docker run」コマンドを 実行します。これが最もシンプ ルなコマンドになります。 docker run hello-world オペレーティング・システムに 対して docker プログラムの 実行を伝える Docker に対してコンテナに 読み込むイメージの情報を 伝える Docker コンテナを 作成・実行するため のサブコマンド
  16. 16. docker クライアント docker エンジン $ docker run hello-world run コンテナを動かそうとするとき Docker Engine は指定され たコンテナ名(正確にはリポジ トリ)がローカルにあるかどうかを 確認します。もしなければ、リ モート環境から自動的にイメー ジをダウンロード(pull)します。 Docker Hub pull レジストリ latest イメージ タグ hello-world レポジトリ • Docker Engine は「docker run」実行時にローカルにイ メージがなければレジストリ (DockerHubが標準)から イメージをダウンロードする。 そのため初回実行時は時間 かかる場合がある。
  17. 17. docker クライアント docker エンジン $ docker run hello-world run そしてDockerエンジンの環境 にイメージをダウンロードしました。 ですが、このままではコンテナを 実行できません。後ほど詳しく 扱いますが、Dockerイメージは 読み込み専用(ReadOnly)で あり、変更できません。 Docker Hub pull レジストリ latest イメージ タグ hello-world レポジトリ • Docker Engine は「docker run」実行時にローカルにイ メージがなければレジストリ (DockerHubが標準)から イメージをダウンロードする。 そのため初回実行時は時間 かかる場合がある。 latest イメージ タグ
  18. 18. docker クライアント docker エンジン $ docker run hello-world run このイメージ上に読み書き可能 なレイヤを追加しています。図 の赤い部分です。これでコンテ ナを起動する準備が整いました。 Docker Hub pull レジストリ latest イメージ タグ hello-world レポジトリ • Docker Engine は「docker run」実行時にローカルにイ メージがなければレジストリ (DockerHubが標準)から イメージをダウンロードする。 そのため初回実行時は時間 かかる場合がある。 latest イメージ タグ “読み書き可”なレイヤ 読み込み専用 latest
  19. 19. docker クライアント docker エンジン $ docker run hello-world run あとはアセンブラで書かれたhelloプログ ラムのバイナリを、コンテナ用の独立した プロセスとして実行します。 Docker Hub pull レジストリ latest イメージ タグ hello-world レポジトリ • Docker Engine は「docker run」実行時にローカルにイ メージがなければレジストリ (DockerHubが標準)から イメージをダウンロードする。 そのため初回実行時は時間 かかる場合がある。 latest イメージ タグ latest コンテナ化した hello-worldの実行 Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/ hello-worldコンテナは画面出力が 終わると、プロセスが終了(コンテ ナは停止状態)になる。
  20. 20. $ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 03f4658f8b78: Pull complete a3ed95caeb02: Pull complete Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7 Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. (省略) Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/ ローカルにhello-worldイメージがない 公式イメージlibraryにある”hello-world”を取得 最新の”hello-world:latest”イメージを取得完了 hello-worldイメージを使ったコンテナの実行(run)を命令
  21. 21. Docker イメージ 次は、コンテナを動かす基となる 「Dockerイメージ」をもう少し 詳しくみてきましょう。
  22. 22. 22 Docker イメージ ‣ Dockerイメージは コンテナを実行する時に必要な ファイルシステム • イメージ・レイヤ(層)の集合体 – ファイルの実体やメタ情報を含む • レイヤには親子関係がある • 差分情報のみを記録する • Read Only で書き込みできない 共通するレイヤはイメージ間で共有できる • ディスク容量の削減や高いポータビリティを実現する
  23. 23. $ docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 203137e8afd5: Pull complete 2ff1bbbe9310: Pull complete 933ae2486129: Pull complete a3ed95caeb02: Pull complete Digest: sha256:1bea66e185d3464fec1abda32ffaf2a11de69833cfcf81bd2b9a5be147776814 Status: Downloaded newer image for ubuntu:latest/ レイヤごとに 並列ダウンロード
  24. 24. $ docker pull wordpress Using default tag: latest latest: Pulling from library/wordpress fdd5d7827f33: Already exists a3ed95caeb02: Download complete 8c80f2e38113: Download complete 2da85bfb1ac0: Download complete 1da50ec818af: Download complete b2799c7ad5c9: Downloading 1.113 MB/2.844 MB 4893554c0107: Download complete b1d739e1b940: Waiting bd103e3f6195: Waiting aa560ff33ce6: Waiting 1deabfa10759: Waiting 91e6991f7a34: Waiting 7234c82b998e: Waiting 6bf8bdf2e550: Waiting a5c7e6ead07c: Waiting fe011342f195: Waiting c6dd706ba27e: Waiting 35d564cafd69: Waiting 730edfa5d07f: Waiting Digest: sha256:bfd7e102741d73cce4ec58b2d937586c670f31df1c80aeaf4d5c525eb3c6ac06 Status: Downloaded newer image for wordpress:latest ダウンロード済みのレイヤ なので再取得しない ダウンロード中 ダウンロード済み ダウンロード待ち
  25. 25. Nginx イメージの構造 902b87aaaec9 3 months ago /bin/sh -c #(nop) ADD file:e1dd18493a216ecd0c 125.2 MB 9a61b6b1315e 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B aface2a79f55 3 months ago /bin/sh -c #(nop) MAINTAINER NGINX Docker Mai 0 B 5dd2638d10a1 3 months ago /bin/sh -c apt-key adv --keyserver hkp://pgp. 1.997 kB 97df1ddba09e 3 months ago /bin/sh -c echo "deb http://nginx.org/package 221 B e7e7a55e9264 10 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.9.4-1~j 0 B 72b67c8ad0ca 10 weeks ago /bin/sh -c apt-get update && apt-get inst 7.695 MB 9108e25be489 10 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx/ 11 B 6dda3f3a8c05 10 weeks ago /bin/sh -c ln -sf /dev/stderr /var/log/nginx/ 11 B 42d2189f6cbe 10 weeks ago /bin/sh -c #(nop) VOLUME [/var/cache/nginx] 0 B 3cb7f49c6bc4 10 weeks ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0 B a486da044a3f 10 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon o 0 B $ docker history nginx IMAGE CREATED CREATED BY SIZE COMMENT docker history <image id/name> コンテナ作成の履歴を辿るには docker history コマンドが便利
  26. 26. イメージを視覚化する IMAGE LAYERS https://imagelayers.io/?images=nginx:latest,nginx:stable,nginx:mainline-alpine,nginx:stable-alpine
  27. 27. ベース・イメージ (公式イメージ等) イメージ層 Docker コンテナを起動するとは 読み込み専用 (Read Only)
  28. 28. ベース・イメージ (公式のubuntu等) イメージ層 Docker コンテナを起動するとは 読み込み専用 (Read Only) ・新しいイメージ・レイヤの 自動的な割り当て ・イメージ内のプログラムを 独立したプロセスで実行 (コンテナ化された状態) docker run <opts> <image:tag> docker diff 元のイメージとコンテナ用 レイヤとの差分を表示する コマンド
  29. 29. コンテナのライフサイクル ■■■□□ Dockerコンテナを起動・実行・終了・削除に至るまでのライフサイクル 処理の内容と docker コマンドの基本を理解 C h a p t e r 3
  30. 30. 30 ‣ ハンズオン内容 – docker コマンドを操作しながら、Docker コンテナのライフサイクルを理解します。 – この章では docker/whalesay イメージの取得・実行をした後、自分でイメージを作成し、 Docker Hub にアップロードします。内容はドキュメントの Get Started with Docker です。 – Whalesayは鯨にメッセージを表示する(喋らせる)プログラムです。 ‣ 事前準備 – Dockerの実行環境が必要です。 – インストール方法やセットアップ方法については、ドキュメントをご覧ください。 ‣ 導入ガイド – Linux http://docs.docker.jp/engine/installation/index.html – Windows http://docs.docker.jp/engine/installation/windows.html – Mac OS X http://docs.docker.jp/engine/installation/mac.html ハンズオンの前に
  31. 31. レジストリ (Docker Hub) イメージイメージ イメージ R/W layer Docker Engine pullrun commit 新イメージ 新イメージpush build Docker コンテナのライフサイクル概要 通常dockerを使った操作は 「docker」コマンドを使います。
  32. 32. イメージ Read Only コンテナ用 レイヤ 読み書き可 • Docker イメージとはイメージ・レイヤ (rootファイルシステム)とメタデー タ(何のコマンドを実行するのか、ど のポートを開くかなどの管理情報)の 集合体であり、読み込み専用 • それぞれのレイヤは ID を持つ • コンテナの起動とは、Dockerイメージ 上に読み書き可能なレイヤを追加し、 指定されたプロセスを隔離された状態 やシステムリソース上で実行すること docker pull … イメージの取得 docker run … コンテナの実行
  33. 33. 33 練習1. hello-world コンテナの実行 ‣ Dockerが正常に使えるかどうか確認します。hello-world という名前の サンプルプログラムを実行します。 ‣ docker run コマンドの書式: • タグを省略すると、自動的に「latest」(最新)になります。 ‣ docker run コマンドを使い、hello-world コンテナを実行します。 ‣ もう一度同じコマンドを実行すると、一瞬でコンテナを実行できます。 • 既にローカルに hello-world イメージがダウンロード済みのためです。 $ docker run hello-world $ docker run コンテナ名:タグ
  34. 34. Dockerコンテナを実行するに は、ローカルにイメージが必要で す。イメージがなければ取得 (pull)する必要があります。 docker pull … イメージの取得
  35. 35. 35 練習2. イメージの確認と取得 ‣ ローカル環境上のイメージ一覧を確認するには docker images コマンド を使います。先ほどの「hello-world」イメージがダウンロード済みかど うかを確認します。 ‣ Docker Hub から「docker/whalesay」イメージを docker pull コマンド で取得します。 • これは「docker」ユーザの「whalesay」イメージを取得するという意味です。 • 「ユーザ名/」が無い場合や「library/」は公式イメージ(Docker社の精査済み)です。 ‣ 再度 docker images コマンドを実行し、whalesay イメージがローカル にあるかどうか確認します。 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 690ed74de00f 6 months ago 960 B $ docker pull docker/whalesay
  36. 36. 36 ‣ ダウンロードしたイメージの情報は、Docker Hub 上で確認できます。 https://hub.docker.com/r/docker/whalesay/
  37. 37. 37 ‣ whalesayイメージを使い、メッセージを表示するコンテナを実行します。 whalesay イメージは Ubuntu 14.04 をベースに、「cowsay」という鯨が メッセージを表示するプログラムが入っています。 ‣ docker で whalesay イメージの cowsay プログラムを実行します。 練習3. イメージの実行 $ docker run docker/whalesay cowsay hello world 任意の文字列実行するイメージ イメージ内 で実行する コマンド
  38. 38. イメージ Read Only コンテナ用 レイヤ 読み書き可 • イメージを作成するには3つの方法 1. Docker Hub から取得する 2. コンテナの内容を手動でコミットし、 新しいイメージを作成する 3. Dockerfileを使ってイメージを自動構 築する(自動コミットの繰り返し) docker commit … イメージの作成 docker build… イメージの自動構築(自動commit)
  39. 39. 39 練習4. Dockerfileの作成 ‣ Dockerfileは、自動的にDockerイメージを構築(build)する時に必要に なるファイルです。イメージを構成する全ての要素を記述します。 ‣ 作業用ディレクトリを作成し、移動します。 ‣ 任意のエディタで「Dockerfile」ファイルを作成し、次の内容にします。 • 「FROM」は構築時の元になるイメージを指定します。これは先ほどと同じ whalesay です。 • 「RUN」はコンテナの中でコマンドを実行します。fortunes プログラムのセットアップです。 • 「CMD」はコンテナ実行時にデフォルトで実行する命令です。 $ mkdir mywhale $ cd mywhale FROM docker/whalesay:latest RUN apt-get -y update && apt-get install -y fortunes CMD /usr/games/fortune -a | cowsay
  40. 40. 40 ‣ docker build コマンドで「docker-whale」イメージを作成します。 • 「-t」は「イメージ名:タグ」を指定するオプションです。 • コマンドの最後に「.」が必要です。現在(.)のディレクトリをコンテキスト(イメージ内容)と して指定し、そこにある Dockerfile を使ってイメージの自動構築を命令します。 ‣ 再び docker images コマンドを実行し、イメージが作成されているかど うかを確認します。 練習5. イメージの構築 $ docker build -t docker-whale . $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-whale latest 2869f3029cd4 About a minute ago 274.9 MB hello-world latest 690ed74de00f 6 months ago 960 B docker/whalesay latest 6b362a9f73eb 10 months ago 247 MB
  41. 41. 41 ‣ 作成したイメージ docker-whale を使ってコンテナを実行します。 練習6. 新しいイメージを実行 $ docker run docker-whale • Dockerfile で指定した CMD 命令を指定した 「fortune」プログラムを実行し、その結果を cowsay プログラムに渡しています。 • fortune プログラムは、この docker-whale イメージの中にあるものです。
  42. 42. 構築時の内部処理 • コンテクストで指定したディ レクトリを Docker デーモン に送信 • Dockerfile の FROM・RUN・ CMD の各命令ごとに構築の ステップが進行する • 各ステップごとに作業中の中 間コンテナを自動的に作成し、 処理が終わると都度コミット (docker commit)してイメー ジを自動生成する • この作業用コンテナは命令 が終われば自動削除 • 最後の命令が終わったら、 それを build 時に-t オプ ションで指定したタグにする 捕 捉 $ docker build -t docker-whale . Sending build context to Docker daemon 2.048 kB Step 1 : FROM docker/whalesay:latest ---> 6b362a9f73eb Step 2 : RUN apt-get -y update && apt-get install -y fortunes ---> Running in 969e8d0dcda8 Ign http://archive.ubuntu.com trusty InRelease Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB] Get:2 http://archive.ubuntu.com trusty-security InRelease [65.9 kB] (省略) Setting up fortunes (1:1.99.1-7) ... Processing triggers for libc-bin (2.19-0ubuntu6.6) ... ---> dece11a04bd5 Removing intermediate container 969e8d0dcda8 Step 3 : CMD /usr/games/fortune -a | cowsay ---> Running in 9e0341ff4a5f ---> 2869f3029cd4 Removing intermediate container 9e0341ff4a5f Successfully built 2869f3029cd4 構築に成功し、イメージIDを表示 FROM命令でイメージを使う指定 作業用の中間コンテナ起動 コマンド実行結果をイメージとしてコミット 中間コンテナ削除 中間コンテナ削除 中間コンテナ起動 CMD 命令の内容をメタ情報として記録しコミット
  43. 43. イメージ Read Only コンテナ用 レイヤ 読み書き可 docker history … イメージの履歴表示 docker diff… 元イメージとコンテナの差分表示 docker inspect… コンテナやイメージの調査
  44. 44. 44 ‣ イメージの詳細を表示する docker inspect コマンドで、構築したイメー ジの情報を調べます。「Cmd」セクションが、先ほど CMD 命令で指定し たコマンドになっていることを確認します。 ‣ イメージの構築履歴を docker history コマンドで確認します。 練習7. イメージの詳細を確認 $ docker inspect docker-whale (省略) "Cmd": [ "/bin/sh", "-c", "#(nop) CMD [¥"/bin/sh¥" ¥"-c¥" ¥"/usr/games/fortune -a | cowsay¥"]" $ docker history docker-whale IMAGE CREATED CREATED BY SIZE COMMENT 2869f3029cd4 21 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/usr/g 0 B dece11a04bd5 21 minutes ago /bin/sh -c apt-get -y update && apt-get insta 27.82 MB (省略)
  45. 45. イメージ Read Only コンテナ用 レイヤ 読み書き可 docker push … Dockerイメージの送信 docker login … ログイン docker tag … イメージをタグ付け docker search … 検索
  46. 46. 46 練習8. Docker Hub に登録・ログイン ‣ 作成したイメージを Docker Hub で公開するため、まずはアカウントを 作成します。既にお持ちであれば、次に進みます。 ‣ https://hub.docker.com/ にアクセスし、ユーザ名・パスワード・登録用 のメールアドレス(認証に必要)を入力します。 • 登録は無料ですが、プライベート(非公開)のリポ ジトリを作る場合は課金が必要です。 • メールの件名は「Please confirm email for your Docker Hub account」(Docker Hub アカウント用の メールアドレスをご確認ください)です。本文中のリ ンクをクリックします。
  47. 47. 47 ‣ Docker イメージを置く場所をリポジトリ(repository)と呼びます。 ‣ ブラウザで Docker Hub を開き、 (作成)ボタンを押します。 • リポジトリ名は「docker-whale」とします。 • 簡単な説明(必須)と詳細説明を追加できます。 • Visibilityは public(公開)か private(非公開)を 選べます。 • 最後に「Create」ボタンを押すと、作成完了です。 練習9. リポジトリの作成
  48. 48. 48 ‣ 改めて docker images で docker-whale のイメージ ID を確認します。 ‣ イメージ(ID)には、複数のイメージ名やタグを付けられます。docker tag コマンドを使い、docker-whale イメージに Docker Hub 上のユーザ 名を割り当てます。 – 例 練習10. イメージのタグ付け $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-whale latest 2869f3029cd4 About a minute ago 274.9 MB $ docker tag イメージID ユーザ名/docker-whale:latest
  49. 49. 49 ‣ docker login コマンドを実行し、コンソール上から Docker Hub にログ インします。 • 認証情報(アクセス用トークン)は ~/.docker/config.json に保管されます。 練習11. Dockr Hub にログイン $ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: zembutsu Password: Login Succeeded 皆さんのユーザ名を入力します パスワードを入力します
  50. 50. 50 ‣ Docker Hub 上のリポジトリに送信するには docker push コマンドを使い ます。先ほど docker tag で「ユーザ名/docker-whale」イメージを送信 します。 ‣ ブラウザからも確認します。 練習12. Docker Hub に送信 $ docker push zembutsu/docker-whale The push refers to a repository [docker.io/zembutsu/docker-whale] 1f572a10291b: Pushed 5f70bf18a086: Mounted from docker/whalesay d061ee1340ec: Mounted from docker/whalesay d511ed9e12e1: Mounted from docker/whalesay 091abc5148e4: Mounted from docker/whalesay b26122d57afa: Mounted from docker/whalesay 37ee47034d9b: Mounted from docker/whalesay 528c8710fd95: Mounted from docker/whalesay 1154ba695078: Mounted from docker/whalesay latest: digest: sha256:b597a0451116a63e5eaaa3b3214c77042f180a31c303522db998b37e2c2ddd12 size: 8095
  51. 51. イメージ Read Only コンテナ用 レイヤ 読み書き可 Dockerコンテナとイメージのライフサイクル docker ps … コンテナ一覧や状態の表示 docker rmi … コンテナイメージ削除 docker rm … コンテナ削除 docker images … 一覧
  52. 52. 52 練習13. イメージの削除と再実行 ‣ ローカルのイメージは docker rmi (remove imageの意味)コマンドで削 除できます。先ほど作成したイメージを削除します。イメージIDもしくは イメージ名やタグを指定して削除します。 • -f は強制削除のオプションです。 ‣ イメージを Docker Hub から取得・実行します。 • ローカルにイメージはありません。Docker Hub からイメージをダウンロードして実行します。 ‣ 以上が、最も簡単なコンテナのライフサイクルになります。 $ docker rmi –f docker-whale $ docker rmi –f ユーザ名/docker-whale $ docker run ユーザ名/docker-whale
  53. 53. 53 ‣ 不要なイメージは「docker rmi」コマンドで削除できます。 ‣ 「docker run」コマンドの処理内容を思い出します。 – コマンドを実行する度に、毎回 イメージレイヤを作成しています。 – 「docker ps -a」コマンドを実行すると、 全てのイメージレイヤを表示します。 ‣ コンテナ(のイメージ・レイヤ)を 削除するコマンドは「docker rm」。 • removeの意味です。 ‣ 次のコマンドで、停止中のコンテナを一括削除します。 • 「-a」は全て「-q」はイメージIDのみ表示するオプションで、結果を docker rm に送ります。 • 同様に「docker rmi $(docker images -q)」でイメージの全削除も可能です。 後片付け イメージ Read Only コンテナ用 レイヤ 読み書き可 $ docker rm $(docker ps -aq)
  54. 54. Copy on Write(コピー・オン・ライト) 読み込み専用 (Read Only) • Read Only のイメージ層上 のファイルに対する変更は、 必ずコピー作業を行う • 内部実装はストレージ・ドラ イバに依存する(パフォーマ ンスに影響が出る) • CoWを回避するには ボリュームを使う 書き込む前に コピーしてから コンテナのレイヤ上に 変更を反映 捕 捉 イメージ、コンテナ、ストレージ・ドライバの理解 http://docs.docker.jp/engine/userguide/storagedriver/imagesandcontainers.html
  55. 55. ボリュームはコンテナ用のレイヤとは分離 イメージ Read Only コンテナ用 レイヤ 読み書き可 • イメージ・レイヤの仕様(Copy on Write) を回避できる • docker commit してもボリューム内容は反 映されない。 • 複数のコンテナでボリュームを共有できる • ホスト側のファイルやディレクトリをマウン ト可能 捕 捉 コンテナでデータを管理する http://docs.docker.jp/engine/userguide/containers/dockervolumes.html
  56. 56. Dockerfileと地雷原 ■■■■□ Dockerのベストプラクティスと CMD vs ENTRYPOINT / COPY vs ADD その他、活用にあたって考慮すべきストレージ・ドライバ等 C h a p t e r 4
  57. 57. 57 ‣ Dockerfile の役割 どのようなイメージにするか指示 • どのベース・イメージを使うのか? • 何のプログラムをインストールするのか? • どのようなコマンドを実行するのか ‣ docker build コマンドで構築 docker build –t <リポジトリ:タグ> <Dockerfileのパス> Dockerfile docker build イメージの自動構築 改めてDockerfileはDocker イメージ緒自動構築に欠かすこ とができません。
  58. 58. FROM ubuntu:14.04 RUN apt-get install -y wget CMD /usr/bin/wget FROM nginx ADD ./contents /usr/share/nginx/html FROM centos:7 MAINTAINER <自分の名前> RUN yum update -y RUN yum install -y epel-release RUN yum install -y nginx ADD index.html /usr/share/nginx/html/ EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ex1 ex2 ex3 Docker Hub上のDocker イメージは、どのように構築して いるかの過程を Dockerfile から得られます。このファイルを 元に、自分で自分だけのイメー ジを作ることもできます。
  59. 59. 59 ‣ .dockerignore ファイルの活用 ‣ 不要なパッケージのインストールを避ける ‣ イメージ・レイヤの数を減らす • ただし、読みやすさと使い勝手のバランス • 「&&」「¥」 ‣ キャッシュの活用 ‣ 一般的なガイドライン 考えの基本になっているのは、 Dockerイメージとはイメージ・ レイヤの重なりによって構成され ているという点です。 Dockerfile を書くベスト・プラクティス http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html
  60. 60. 60 ‣ CMD vs ENTRYPOINT • デフォルトで実行するコマンドが ENTRYPOINT – 多くのイメージは /bin/bash がデフォルト • ENTRYPOINT があると、CMD は ENTRYPOINT のパラメータになる • 実行形式の違いに注意 – EXEC形式 CMD ["perl", "foo.pl"] – シェル形式 CMD perl foo.pl ← /bin/sh –c 上のパラメータとして実行 ‣ COPY vs ADD • どちらもローカルのファイルをイメージにコピーします。 • Add は tar や URL の展開にも対応しており、高機能です。ただし、不意にファイル が混入してしまうリスクがあります。環境によっては COPY だけに絞る方法も。 注意点
  61. 61. 61 ‣ ping を実行するコンテナを通して、挙動の違いを理解していきます。 ‣ まず、ping を実行する myping コンテナを作成つくります。そのため、 ディレクトリを作成し、移動します。 ‣ Dockerfile を作成し、中身を以下のようにします。 • Busybox という小さな Linux ディストリビューション上の ping コマンドを実行する命令です。 ‣ イメージを構築します。 CMD 命令の理解 $ mkdir myping $ cd myping FROM busybox CMD ["ping","-c","10","127.0.0.1"] $ docker build -t myping .
  62. 62. 62 ‣ 「myping」コンテナを実行します。 • 「--rm」オプションは、コンテナ実行後、自動的にイメージレイヤを破棄します。都度、 docker rm を実行する必要がないため、コマンドとして使う場合に便利です。 • Dockerfile の 「CMD [“ping”,“-c”,“10”,“127.0.0.1”]」は、自分自身に対して ping を 10 回実行するという意味です。 $ docker run --rm myping PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.217 ms 64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.090 ms 64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.193 ms 64 bytes from 127.0.0.1: seq=3 ttl=64 time=0.095 ms 64 bytes from 127.0.0.1: seq=4 ttl=64 time=0.095 ms 64 bytes from 127.0.0.1: seq=5 ttl=64 time=0.173 ms 64 bytes from 127.0.0.1: seq=6 ttl=64 time=0.100 ms 64 bytes from 127.0.0.1: seq=7 ttl=64 time=0.090 ms 64 bytes from 127.0.0.1: seq=8 ttl=64 time=0.092 ms 64 bytes from 127.0.0.1: seq=9 ttl=64 time=0.094 ms --- 127.0.0.1 ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max = 0.090/0.123/0.217 ms
  63. 63. 63 ‣ 次は myping コンテナの引数に sh を指定して実行します。 • 「-i」はコンテナの標準入出力を有効にします。 • 「-t」は疑似ターミナルを有効にします。 • exit で終了します。 ‣ 「sh」コマンドを指定したため、CMD 命令は無視されました。 ‣ ちなみに、busybox イメージや Ubuntu イメージを実行時、オプション を何も指定しなくてもシェルが起動するのは、各 Dockerfile の CMD 命 令でシェルが指定されているからです。 – Ubuntu イメージの Dockerfile CMD [“/bin/bash”] – Busybox イメージの Dockerifle CMD [“sh”] ‣ このように CMD 命令は、コンテナ実行時にコマンドを指定すると無視 されます。 $ docker run –i -t myping sh / #
  64. 64. 64 ‣ Dockerfile を開き、CMD 命令を ENTRYPOINT に書き換えます。 ‣ 再度イメージを構築します。 ‣ 今度は myping:1.1 を実行します。 ENTRYPOINT との比較 FROM busybox ENTRYPOINT ["ping"] $ docker build -t myping:1.1 . $ docker run --rm myping:1.1 BusyBox v1.24.2 (2016-03-18 16:38:06 UTC) multi-call binary. Usage: ping [OPTIONS] HOST (省略) -q Quiet, only display output at start and when finished -p Pattern to use for payload
  65. 65. 65 ‣ 何も指定しなくてもコマンドを実行するという意味では、CMD も ENTRYPOINT も同様の処理です。しかし、docker run でコマンドの 引数を付けると挙動が違います。 – CMD … docker run で引数があれば、CMD は無視する – ENTRYPOINT … 引数があれば、ENTRYPOINT のコマンドの引数として処理する ‣ myping:1.1 に IP アドレスを付けて実行します。 – ENTRYPOINT がある場合、あくまでも ENTYPOINT に記述したコマンドやオプション は固定です。上書きするには docker run 時に --entrypoint オプションを使います。 $ docker run --rm myping:1.1 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.149 ms 64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.160 ms 64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.222 ms --- 127.0.0.1 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.149/0.177/0.222 ms
  66. 66. 66 ‣ 次の Dockerfile を作成し、 myping イメージを構築します。 ‣ 引数を付けた場合と付けない場合で myping を実行します。 – ENTRYPOINT と CMD があれば、CMD は ENTRYPOINT に対するオプションになります。 – コンテナ実行時のオプションがあれば、ENTRYPOINT の引数としてオプションを使います。 – ENTRYPOINT は、あたかもコマンドを実行するようにコンテナを扱えるようにします。 FROM busybox CMD ["127.0.0.1"] ENTRYPOINT ["ping","-c","3"] $ docker run myping PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.130 ms 64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.311 ms 64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.171 ms --- 127.0.0.1 ping statistics --- 3 packets transmitted, 3 packets received, 0% $ docker run myping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=56 time=1.812 ms 64 bytes from 8.8.8.8: seq=1 ttl=56 time=1.802 ms 64 bytes from 8.8.8.8: seq=2 ttl=56 time=1.863 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 1.802/1.825/1.863 ms
  67. 67. 67 ‣ イメージ・レイヤの理解 ストレージドライバの選択 ここから先は高度なトピックにな ります。イメージ・レイヤはこれま で見てきた通りですが、実際の Linux サーバ上では、ストレー ジ・ドライバによって実装が異な ります。 イメージ、コンテナ、ストレージ・ドライバの理解 http://docs.docker.jp/engine/userguide/storagedriver/imagesandcontainers.html
  68. 68. こちらは Ubuntu で標準の AUFS ストレージ・ドライバ。 AUFS ストレージ・ドライバを使う http://docs.docker.jp/engine/userguide/storagedriver/aufs-driver.html
  69. 69. Red Hat系列のディストリ ビューションはDeviceMapper Device Mapper ストレージ・ドライバを使う http://docs.docker.jp/engine/userguide/storagedriver/device-mapper-driver.html
  70. 70. 汎用的に使えるストレージ・ドラ イバはありません。それぞれのド ライバの理解や、用途に応じた 使い分けや、パフォーマンス測 定が重要になってきます。 ストレージ・ドライバの選択 http://docs.docker.jp/engine/userguide/storagedriver/selectadriver.html
  71. 71. 71 ‣ http://docs.docker.jp/ Dockerドキュメント日本語化プロジェクト Dockerfile リファレンス http://docs.docker.jp/engine/reference/builder.html Dockerfile ベストプラクティス http://docs.docker.jp/engine/userguide/eng- image/dockerfile_best-practice.html 参考情報
  72. 72. 複数のコンテナを効率的に管理 ■■■■■ Docker Compose はコンテナをサービス郡として一括管理 Docker Swarm は複数の Docker Engine を束ねて管理 C h a p t e r 5
  73. 73. さて、 Dockerfileがあれば 楽々構築できるよね^^
  74. 74. でも、WebとDBが別々の コンテナの場合は?^^;
  75. 75. Engine $ docker run … $ docker run … $ docker run … $ docker run …
  76. 76. Engine $ docker-compose up
  77. 77. 複数のコンテナをコードで管理 コンテナの同時起動・停止 コンテナのスケール ネットワーク機能に対応(1.6~)
  78. 78. Engine • docker run … • docker run –d • docker ps • docker logs … • docker stop … • docker restart • docker-compose up • docker-compose up –d • docker-compose ps • docker-compose logs • docker-compose stop • docker-compose restart どちらも docker クライアントで操作可能
  79. 79. wordpress: image: wordpress links: - db:mysql ports: - 8080:80 db: image: mariadb environment: MYSQL_ROOT_PASSWORD: example WordPress 用の docker-compose.yml 例 参照:https://hub.docker.com/_/wordpress/
  80. 80. mongo: image: mongo command: mongod --smallfiles --oplogSize 128 rocketchat: image: rocketchat/rocket.chat:latest environment: - PORT=3000 - ROOT_URL=http://localhost:3000 - MONGO_URL=mongodb://mongo:27017/rocketchat links: - mongo:mongo ports: - 3000:3000 Rocket.Chat 用の docker-compose.yml 例 参照:https://github.com/RocketChat/Rocket.Chat/blob/master/docker-compose.yml
  81. 81. 81 ‣ Docker Composeは 複数のサービスを管理 • docker コマンドと互換性 ‣ Compose ファイルで設定 • YAML形式 • docker-compose.yml 等 Compose
  82. 82. Engine • docker run … • docker run –d • docker ps • docker logs … • docker stop … • docker restart • docker-compose up • docker-compose up –d • docker-compose ps • docker-compose logs • docker-compose stop • docker-compose restart どちらも docker クライアントで操作可能
  83. 83. 複数のコンテナも 楽に管理できるね^^
  84. 84. あれ? 複数のサーバでは?^^;
  85. 85. $ docker run … $ docker run … $ docker run …
  86. 86. $ docker run … $ docker run … $ docker run …
  87. 87. docker engine (docker daemon) machine docker client $ docker run コンテナ コンテナ docker engine (docker daemon) machine コンテナ コンテナ docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine コンテナ コンテナ コンテナ $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" TCP:2376 DOCKER_OPTS="-H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem” DOCKER_OPTS=“-H tcp://0.0.0.0:2375 –H unix:///var/run/docker.sock”
  88. 88. Swarm Manager machine docker client $ docker run docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine docker engine (docker daemon) machine コンテナ $ docker-machine env docker01 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://104.131.113.166:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/docker01" export DOCKER_MACHINE_NAME="docker01" $ docker run –d –P swarm manage ¥ token://<token> docker engine (docker daemon) コンテナ コンテナ コンテナ コンテナ Docker互換 API リソース・プール ストラテジ フィルタ • spread • binpack • randam • constraint • affinity • port • dependency • health コンテナの配置を スケジューリング docker machine でデプロイ/プロビジョニング ディスカバリ・バックエンド
  89. 89. 89 Swarm ‣ Docker Swarmとは • コンテナの配置(スケジューリング)を行う ‣ dockerクライアントで操作可能 • 環境変数で切り替え ‣ Docker Machineと連携が便利 ‣ Swarm 1.6 から書式が変わる
  90. 90. Compose の例
  91. 91. version: '2' services: zabbix-db: image: zabbix/zabbix-db-mariadb volumes: - zabbix-db-storage:/var/lib/mysql - backups:/backups - /etc/localtime:/etc/localtime:ro environment: - MARIADB_USER=zabbix - MARIADB_PASS=my_password zabbix-server: image: zabbix/zabbix-3.0:latest depends_on: - zabbix-db ports: - "80:80" - "10051:10051" volumes: - /etc/localtime:/etc/localtime:ro links: - zabbix-db:zabbix.db environment: - ZS_DBHost=zabbix.db - ZS_DBUser=zabbix - ZS_DBPassword=my_password volumes: zabbix-db-storage: driver: local backups: driver: local
  92. 92. まとめ • Dockerとコンテナ&イメージ • イメージとイメージ・レイヤの基本 • コンテナのライフサイクル • Dockerfileの地雷原 ( CMD vs ENTRYPOINT , ADD vs COPY ) • 複数のコンテナを効率的に操作 ( Swarm & Compose )
  93. 93. 参考情報 • Dockerのドキュメント • http://docs.docker.jp
  94. 94. 95 私は誰? ‣ @zembutsu a.k.a. 前佛雅人 - Technology Evangelist; Creationline, Inc. – 2 yrs - Technical Trainer; Docker Authorized Trainer – 0.8 yr - Data Center Operations Engineer – 15+ yrs 興味:運用監視自動化、趣味でOSSやクラウド系の検証・情報発信 - SlideShare http://slideshare.net/zembutsu - Blog http://pocketstudio.jp/log3 Why am I here? +MasahitoZembutsu https://twitter.com/creationline

×