SlideShare una empresa de Scribd logo
1 de 95
Descargar para leer sin conexión
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(ピクスタ)
スライドで扱う内容
• Dockerとコンテナ&イメージ
• イメージとイメージ・レイヤの基本
• コンテナのライフサイクル
• Dockerfileの地雷原 ( CMD vs ENTRYPOINT , ADD vs COPY )
• 複数のコンテナを効率的に操作 ( Swarm & Compose )
勉強会当日の振り返りと共に、
自習ハンズオン用にも活用でき
るように、解説や便利な Tips
を追記しています。
Dockerを思い通りに扱えるよ
うになりたい初心者を想定して
います。
本スライドについて
• 想定読者 – Dockerの基礎をこれから学ぶ方
✔ Docker イメージとコンテナの違いを知りたい
✔ 自分のイメージを作れるようになりたい
✔ ライフサイクルを理解して、自由に使えるようになりたい
• 発表
DevOps 勉強会 #2 Dockerを使ったCI/CD
http://peatix.com/event/157567
当日資料の加筆版です。
登壇の機会をありがとうございました。
Dockerとコンテナ&イメージ
■□□□□
Dockerプロジェクトの概要、コンテナとイメージの簡単なおさらい
C h a p t e r 1
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
ド ッ カ ー
開発者が簡単にアプリケーションを開発・デプロイできる仕組み
プラットフォーム
7
Dockerコンテナ
‣ コンテナとは
ホスト OS の kernel 機能を使い、複数のルート・ファイルシステムを実行
• 各ルート・ファイルシステムをコンテナ (container) と呼ぶ
コンテナは各々のリソースを持つ
• プロセス、メモリ、デバイス、ネットワーク
Linux カーネルの技術を使う
• Namespaces (名前空間によるプロセス間の隔離/分離;isolation)
• Cgroups(CPU・メモリ・Disk I/Oのリソース制限)
‣ コンテナの実行に必要な環境
• Docker Engine(エンジン)
– コンテナを移動・実行するための必要なプログラム(デーモン)
ネームスペース アイソレーション
コントロール・グループ
「Dockerコンテナ」を実行する
とは、Linux ホスト上で個々の
プロセスやファイルシステムを実
行することを指します。
Dockerエンジンはカーネルの
制御を仲介します。そのため、
コンテナを動かす環境では必ず
エンジンが必要になります。
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 ソケットドメイン
コンテナ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の
プロセス・ツリー下にコンテナとし
て起動したプロセスが存在しま
す。コンテナ内は独立している
ので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などを
制御できるのが特長です。
コンテナのファイルシステム プロセスを起動するには、何ら
かのバイナリやスクリプトなどのプ
ログラムが必要になります。コン
テナごとにルート・ファイルシステ
ムの領域を持っています。
このファイルシステムがDocker
イメージの一部です。コンテナの
起動にはイメージを使います。
コンテナAのファイルシステム
… …
コンテナBのファイルシステム
/etc /bin /etc /bin
/ /
コンテナのファイルシステム コンテナごとに個々のファイルシ
ステムは独立していますので、コ
ンテナ内では互いに見えません。
ですが、ホスト上では通常の
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
イメージとイメージ・レイヤの基本
■■□□□
Dockerイメージはファイルシステムとメタデータの集合体
イメージ・レイヤが積み重なりDockerイメージが構成されている
C h a p t e r 2
docker クライアント docker エンジン
$ docker run hello-world
run
次は、「Dockerコンテナ」を動
かすために「Dockerイメージ」と
どのような関係があるのかを見
てきましょう。
コンテナを動かす(run)するため
には「docker run」コマンドを
実行します。これが最もシンプ
ルなコマンドになります。
docker run hello-world
オペレーティング・システムに
対して docker プログラムの
実行を伝える
Docker に対してコンテナに
読み込むイメージの情報を
伝える
Docker コンテナを
作成・実行するため
のサブコマンド
docker クライアント docker エンジン
$ docker run hello-world
run
コンテナを動かそうとするとき
Docker Engine は指定され
たコンテナ名(正確にはリポジ
トリ)がローカルにあるかどうかを
確認します。もしなければ、リ
モート環境から自動的にイメー
ジをダウンロード(pull)します。
Docker Hub
pull
レジストリ
latest
イメージ
タグ
hello-world レポジトリ
• Docker Engine は「docker
run」実行時にローカルにイ
メージがなければレジストリ
(DockerHubが標準)から
イメージをダウンロードする。
そのため初回実行時は時間
かかる場合がある。
docker クライアント docker エンジン
$ docker run hello-world
run
そしてDockerエンジンの環境
にイメージをダウンロードしました。
ですが、このままではコンテナを
実行できません。後ほど詳しく
扱いますが、Dockerイメージは
読み込み専用(ReadOnly)で
あり、変更できません。
Docker Hub
pull
レジストリ
latest
イメージ
タグ
hello-world レポジトリ
• Docker Engine は「docker
run」実行時にローカルにイ
メージがなければレジストリ
(DockerHubが標準)から
イメージをダウンロードする。
そのため初回実行時は時間
かかる場合がある。
latest
イメージ
タグ
docker クライアント docker エンジン
$ docker run hello-world
run
このイメージ上に読み書き可能
なレイヤを追加しています。図
の赤い部分です。これでコンテ
ナを起動する準備が整いました。
Docker Hub
pull
レジストリ
latest
イメージ
タグ
hello-world レポジトリ
• Docker Engine は「docker
run」実行時にローカルにイ
メージがなければレジストリ
(DockerHubが標準)から
イメージをダウンロードする。
そのため初回実行時は時間
かかる場合がある。
latest
イメージ
タグ
“読み書き可”なレイヤ
読み込み専用 latest
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コンテナは画面出力が
終わると、プロセスが終了(コンテ
ナは停止状態)になる。
$ 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)を命令
Docker
イメージ
次は、コンテナを動かす基となる
「Dockerイメージ」をもう少し
詳しくみてきましょう。
22
Docker イメージ
‣ Dockerイメージは
コンテナを実行する時に必要な
ファイルシステム
• イメージ・レイヤ(層)の集合体
– ファイルの実体やメタ情報を含む
• レイヤには親子関係がある
• 差分情報のみを記録する
• Read Only で書き込みできない
共通するレイヤはイメージ間で共有できる
• ディスク容量の削減や高いポータビリティを実現する
$ 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/
レイヤごとに
並列ダウンロード
$ 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
ダウンロード済みのレイヤ
なので再取得しない
ダウンロード中
ダウンロード済み
ダウンロード待ち
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 コマンドが便利
イメージを視覚化する IMAGE LAYERS
https://imagelayers.io/?images=nginx:latest,nginx:stable,nginx:mainline-alpine,nginx:stable-alpine
ベース・イメージ
(公式イメージ等)
イメージ層
Docker コンテナを起動するとは
読み込み専用
(Read Only)
ベース・イメージ
(公式のubuntu等)
イメージ層
Docker コンテナを起動するとは
読み込み専用
(Read Only)
・新しいイメージ・レイヤの
自動的な割り当て
・イメージ内のプログラムを
独立したプロセスで実行
(コンテナ化された状態)
docker run <opts> <image:tag>
docker diff
元のイメージとコンテナ用
レイヤとの差分を表示する
コマンド
コンテナのライフサイクル
■■■□□
Dockerコンテナを起動・実行・終了・削除に至るまでのライフサイクル
処理の内容と docker コマンドの基本を理解
C h a p t e r 3
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
ハンズオンの前に
レジストリ
(Docker Hub)
イメージイメージ
イメージ
R/W layer
Docker
Engine
pullrun
commit
新イメージ 新イメージpush
build
Docker コンテナのライフサイクル概要
通常dockerを使った操作は
「docker」コマンドを使います。
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
• Docker イメージとはイメージ・レイヤ
(rootファイルシステム)とメタデー
タ(何のコマンドを実行するのか、ど
のポートを開くかなどの管理情報)の
集合体であり、読み込み専用
• それぞれのレイヤは ID を持つ
• コンテナの起動とは、Dockerイメージ
上に読み書き可能なレイヤを追加し、
指定されたプロセスを隔離された状態
やシステムリソース上で実行すること
docker pull … イメージの取得
docker run … コンテナの実行
33
練習1. hello-world コンテナの実行
‣ Dockerが正常に使えるかどうか確認します。hello-world という名前の
サンプルプログラムを実行します。
‣ docker run コマンドの書式:
• タグを省略すると、自動的に「latest」(最新)になります。
‣ docker run コマンドを使い、hello-world コンテナを実行します。
‣ もう一度同じコマンドを実行すると、一瞬でコンテナを実行できます。
• 既にローカルに hello-world イメージがダウンロード済みのためです。
$ docker run hello-world
$ docker run コンテナ名:タグ
Dockerコンテナを実行するに
は、ローカルにイメージが必要で
す。イメージがなければ取得
(pull)する必要があります。
docker pull … イメージの取得
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
‣ ダウンロードしたイメージの情報は、Docker Hub 上で確認できます。
https://hub.docker.com/r/docker/whalesay/
37
‣ whalesayイメージを使い、メッセージを表示するコンテナを実行します。
whalesay イメージは Ubuntu 14.04 をベースに、「cowsay」という鯨が
メッセージを表示するプログラムが入っています。
‣ docker で whalesay イメージの cowsay プログラムを実行します。
練習3. イメージの実行
$ docker run docker/whalesay cowsay hello world
任意の文字列実行するイメージ イメージ内
で実行する
コマンド
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
• イメージを作成するには3つの方法
1. Docker Hub から取得する
2. コンテナの内容を手動でコミットし、
新しいイメージを作成する
3. Dockerfileを使ってイメージを自動構
築する(自動コミットの繰り返し)
docker commit … イメージの作成
docker build… イメージの自動構築(自動commit)
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
‣ 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
‣ 作成したイメージ docker-whale を使ってコンテナを実行します。
練習6. 新しいイメージを実行
$ docker run docker-whale
• Dockerfile で指定した CMD 命令を指定した
「fortune」プログラムを実行し、その結果を
cowsay プログラムに渡しています。
• fortune プログラムは、この docker-whale
イメージの中にあるものです。
構築時の内部処理
• コンテクストで指定したディ
レクトリを 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 命令の内容をメタ情報として記録しコミット
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
docker history … イメージの履歴表示
docker diff… 元イメージとコンテナの差分表示
docker inspect… コンテナやイメージの調査
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
(省略)
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
docker push … Dockerイメージの送信
docker login … ログイン
docker tag … イメージをタグ付け
docker search … 検索
46
練習8. Docker Hub に登録・ログイン
‣ 作成したイメージを Docker Hub で公開するため、まずはアカウントを
作成します。既にお持ちであれば、次に進みます。
‣ https://hub.docker.com/ にアクセスし、ユーザ名・パスワード・登録用
のメールアドレス(認証に必要)を入力します。
• 登録は無料ですが、プライベート(非公開)のリポ
ジトリを作る場合は課金が必要です。
• メールの件名は「Please confirm email for your
Docker Hub account」(Docker Hub アカウント用の
メールアドレスをご確認ください)です。本文中のリ
ンクをクリックします。
47
‣ Docker イメージを置く場所をリポジトリ(repository)と呼びます。
‣ ブラウザで Docker Hub を開き、 (作成)ボタンを押します。
• リポジトリ名は「docker-whale」とします。
• 簡単な説明(必須)と詳細説明を追加できます。
• Visibilityは public(公開)か private(非公開)を
選べます。
• 最後に「Create」ボタンを押すと、作成完了です。
練習9. リポジトリの作成
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
‣ 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
‣ 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
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
Dockerコンテナとイメージのライフサイクル
docker ps … コンテナ一覧や状態の表示
docker rmi … コンテナイメージ削除
docker rm … コンテナ削除
docker images … 一覧
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
‣ 不要なイメージは「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)
Copy on Write(コピー・オン・ライト)
読み込み専用
(Read Only)
• Read Only のイメージ層上
のファイルに対する変更は、
必ずコピー作業を行う
• 内部実装はストレージ・ドラ
イバに依存する(パフォーマ
ンスに影響が出る)
• CoWを回避するには
ボリュームを使う
書き込む前に
コピーしてから
コンテナのレイヤ上に
変更を反映
捕 捉
イメージ、コンテナ、ストレージ・ドライバの理解
http://docs.docker.jp/engine/userguide/storagedriver/imagesandcontainers.html
ボリュームはコンテナ用のレイヤとは分離
イメージ
Read Only
コンテナ用
レイヤ
読み書き可
• イメージ・レイヤの仕様(Copy on Write)
を回避できる
• docker commit してもボリューム内容は反
映されない。
• 複数のコンテナでボリュームを共有できる
• ホスト側のファイルやディレクトリをマウン
ト可能
捕 捉
コンテナでデータを管理する
http://docs.docker.jp/engine/userguide/containers/dockervolumes.html
Dockerfileと地雷原
■■■■□
Dockerのベストプラクティスと CMD vs ENTRYPOINT / COPY vs ADD
その他、活用にあたって考慮すべきストレージ・ドライバ等
C h a p t e r 4
57
‣ Dockerfile の役割
どのようなイメージにするか指示
• どのベース・イメージを使うのか?
• 何のプログラムをインストールするのか?
• どのようなコマンドを実行するのか
‣ docker build コマンドで構築
docker build –t <リポジトリ:タグ> <Dockerfileのパス>
Dockerfile
docker build
イメージの自動構築
改めてDockerfileはDocker
イメージ緒自動構築に欠かすこ
とができません。
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
‣ .dockerignore ファイルの活用
‣ 不要なパッケージのインストールを避ける
‣ イメージ・レイヤの数を減らす
• ただし、読みやすさと使い勝手のバランス
• 「&&」「¥」
‣ キャッシュの活用
‣
一般的なガイドライン 考えの基本になっているのは、
Dockerイメージとはイメージ・
レイヤの重なりによって構成され
ているという点です。
Dockerfile を書くベスト・プラクティス
http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html
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
‣ 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
‣ 「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
‣ 次は 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
‣ 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
‣ 何も指定しなくてもコマンドを実行するという意味では、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
‣ 次の 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
‣ イメージ・レイヤの理解
ストレージドライバの選択 ここから先は高度なトピックにな
ります。イメージ・レイヤはこれま
で見てきた通りですが、実際の
Linux サーバ上では、ストレー
ジ・ドライバによって実装が異な
ります。
イメージ、コンテナ、ストレージ・ドライバの理解
http://docs.docker.jp/engine/userguide/storagedriver/imagesandcontainers.html
こちらは 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/device-mapper-driver.html
汎用的に使えるストレージ・ドラ
イバはありません。それぞれのド
ライバの理解や、用途に応じた
使い分けや、パフォーマンス測
定が重要になってきます。
ストレージ・ドライバの選択
http://docs.docker.jp/engine/userguide/storagedriver/selectadriver.html
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
参考情報
複数のコンテナを効率的に管理
■■■■■
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
• docker-compose up –d
• docker-compose ps
• docker-compose logs
• docker-compose stop
• docker-compose restart
どちらも docker クライアントで操作可能
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/
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
‣ 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
• docker-compose up –d
• docker-compose ps
• docker-compose logs
• docker-compose stop
• docker-compose restart
どちらも docker クライアントで操作可能
複数のコンテナも
楽に管理できるね^^
あれ?
複数のサーバでは?^^;
$ 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
コンテナ コンテナ
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”
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
Swarm
‣ Docker Swarmとは
• コンテナの配置(スケジューリング)を行う
‣ dockerクライアントで操作可能
• 環境変数で切り替え
‣ Docker Machineと連携が便利
‣ Swarm 1.6 から書式が変わる
Compose の例
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
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
まとめ
• Dockerとコンテナ&イメージ
• イメージとイメージ・レイヤの基本
• コンテナのライフサイクル
• Dockerfileの地雷原 ( CMD vs ENTRYPOINT , ADD vs COPY )
• 複数のコンテナを効率的に操作 ( Swarm & Compose )
参考情報
• Dockerのドキュメント
• http://docs.docker.jp
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

Más contenido relacionado

La actualidad más candente

Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Masahito Zembutsu
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門Masahito Zembutsu
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるKohei Tokunaga
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能Kohei Tokunaga
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方Yoshiyasu SAEKI
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?Takuya Ueda
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoTakayuki Shimizukawa
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 

La actualidad más candente (20)

Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 
Go入門
Go入門Go入門
Go入門
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐる
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 

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

Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Masafumi Noguchi
 
Webアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオンWebアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオン虎の穴 開発室
 
Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519虎の穴 開発室
 
MasterCloud Docker Hands-on 20170725
MasterCloud Docker Hands-on 20170725MasterCloud Docker Hands-on 20170725
MasterCloud Docker Hands-on 20170725Masafumi Noguchi
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎Daisuke Hiraoka
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門hiro nemu
 
Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
DockerクイックツアーEtsuji Nakai
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Yuichi Ito
 
ゆるふわなDockerの使い方
ゆるふわなDockerの使い方ゆるふわなDockerの使い方
ゆるふわなDockerの使い方Kento Aoyama
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念Masahito Zembutsu
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
DockerハンズオンKazuyuki Mori
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入Yu Nobuoka
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門Hori Tasuku
 
いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達softlayerjp
 
Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法Microsoft Corporation
 
Dockerでlamp環境を作って見る
Dockerでlamp環境を作って見るDockerでlamp環境を作って見る
Dockerでlamp環境を作って見るzhengen lin
 
DockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようDockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようmookjp
 

Similar a Dockerライフサイクルの基礎 地雷を踏み抜けろ! (20)

Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]
 
Webアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオンWebアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオン
 
Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519
 
MasterCloud Docker Hands-on 20170725
MasterCloud Docker Hands-on 20170725MasterCloud Docker Hands-on 20170725
MasterCloud Docker Hands-on 20170725
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
Dockerクイックツアー
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
ゆるふわなDockerの使い方
ゆるふわなDockerの使い方ゆるふわなDockerの使い方
ゆるふわなDockerの使い方
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
Docker社内勉強会
Docker社内勉強会Docker社内勉強会
Docker社内勉強会
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門
 
Docker勉強会
Docker勉強会Docker勉強会
Docker勉強会
 
いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達
 
Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法
 
Dockerでlamp環境を作って見る
Dockerでlamp環境を作って見るDockerでlamp環境を作って見る
Dockerでlamp環境を作って見る
 
DockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようDockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみよう
 

Más de Masahito Zembutsu

忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜
忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜
忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜Masahito Zembutsu
 
自由検証環境提供宣言+Docker Compose V2 GA
自由検証環境提供宣言+Docker Compose V2 GA自由検証環境提供宣言+Docker Compose V2 GA
自由検証環境提供宣言+Docker Compose V2 GAMasahito Zembutsu
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討Masahito Zembutsu
 
さくらインターネットのコミュニティ with COVID-19
さくらインターネットのコミュニティ with COVID-19さくらインターネットのコミュニティ with COVID-19
さくらインターネットのコミュニティ with COVID-19Masahito Zembutsu
 
ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」
ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」
ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」Masahito Zembutsu
 
インターネットでウェブサイトを表示している裏側の話
インターネットでウェブサイトを表示している裏側の話インターネットでウェブサイトを表示している裏側の話
インターネットでウェブサイトを表示している裏側の話Masahito Zembutsu
 
3分で分かる「プログラミング教育・情報教育」
3分で分かる「プログラミング教育・情報教育」3分で分かる「プログラミング教育・情報教育」
3分で分かる「プログラミング教育・情報教育」Masahito Zembutsu
 
ようこそオンラインの展示会場へ
ようこそオンラインの展示会場へようこそオンラインの展示会場へ
ようこそオンラインの展示会場へMasahito Zembutsu
 
小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020
小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020
小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020Masahito Zembutsu
 
オンライン発表で気を付けているポイント~姿勢編
オンライン発表で気を付けているポイント~姿勢編オンライン発表で気を付けているポイント~姿勢編
オンライン発表で気を付けているポイント~姿勢編Masahito Zembutsu
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Masahito Zembutsu
 
Docker 9 tips~意外と知られていない日常で役立つ便利技
Docker 9 tips~意外と知られていない日常で役立つ便利技Docker 9 tips~意外と知られていない日常で役立つ便利技
Docker 9 tips~意外と知られていない日常で役立つ便利技Masahito Zembutsu
 
クリスマスに工場(Factorio)を作るゲームをしよう
クリスマスに工場(Factorio)を作るゲームをしようクリスマスに工場(Factorio)を作るゲームをしよう
クリスマスに工場(Factorio)を作るゲームをしようMasahito Zembutsu
 
2020年から始まる小学校プログラミング教育の話 #osc19os
2020年から始まる小学校プログラミング教育の話 #osc19os2020年から始まる小学校プログラミング教育の話 #osc19os
2020年から始まる小学校プログラミング教育の話 #osc19osMasahito Zembutsu
 
CNCF Updates 2019 Winter version and Knative
CNCF Updates 2019  Winter version and KnativeCNCF Updates 2019  Winter version and Knative
CNCF Updates 2019 Winter version and KnativeMasahito Zembutsu
 
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)Masahito Zembutsu
 
CNCFアップデート情報~2018年のCNCFを振り返る
CNCFアップデート情報~2018年のCNCFを振り返るCNCFアップデート情報~2018年のCNCFを振り返る
CNCFアップデート情報~2018年のCNCFを振り返るMasahito Zembutsu
 
コンテナ導入概要資料2018
コンテナ導入概要資料2018コンテナ導入概要資料2018
コンテナ導入概要資料2018Masahito Zembutsu
 

Más de Masahito Zembutsu (20)

忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜
忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜
忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜
 
自由検証環境提供宣言+Docker Compose V2 GA
自由検証環境提供宣言+Docker Compose V2 GA自由検証環境提供宣言+Docker Compose V2 GA
自由検証環境提供宣言+Docker Compose V2 GA
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討
 
さくらインターネットのコミュニティ with COVID-19
さくらインターネットのコミュニティ with COVID-19さくらインターネットのコミュニティ with COVID-19
さくらインターネットのコミュニティ with COVID-19
 
Docker Chronicle 2021.09
Docker Chronicle  2021.09Docker Chronicle  2021.09
Docker Chronicle 2021.09
 
ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」
ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」
ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」
 
インターネットでウェブサイトを表示している裏側の話
インターネットでウェブサイトを表示している裏側の話インターネットでウェブサイトを表示している裏側の話
インターネットでウェブサイトを表示している裏側の話
 
3分で分かる「プログラミング教育・情報教育」
3分で分かる「プログラミング教育・情報教育」3分で分かる「プログラミング教育・情報教育」
3分で分かる「プログラミング教育・情報教育」
 
ようこそオンラインの展示会場へ
ようこそオンラインの展示会場へようこそオンラインの展示会場へ
ようこそオンラインの展示会場へ
 
小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020
小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020
小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020
 
オンライン発表で気を付けているポイント~姿勢編
オンライン発表で気を付けているポイント~姿勢編オンライン発表で気を付けているポイント~姿勢編
オンライン発表で気を付けているポイント~姿勢編
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
Jitsi Meetとは?
Jitsi Meetとは?Jitsi Meetとは?
Jitsi Meetとは?
 
Docker 9 tips~意外と知られていない日常で役立つ便利技
Docker 9 tips~意外と知られていない日常で役立つ便利技Docker 9 tips~意外と知られていない日常で役立つ便利技
Docker 9 tips~意外と知られていない日常で役立つ便利技
 
クリスマスに工場(Factorio)を作るゲームをしよう
クリスマスに工場(Factorio)を作るゲームをしようクリスマスに工場(Factorio)を作るゲームをしよう
クリスマスに工場(Factorio)を作るゲームをしよう
 
2020年から始まる小学校プログラミング教育の話 #osc19os
2020年から始まる小学校プログラミング教育の話 #osc19os2020年から始まる小学校プログラミング教育の話 #osc19os
2020年から始まる小学校プログラミング教育の話 #osc19os
 
CNCF Updates 2019 Winter version and Knative
CNCF Updates 2019  Winter version and KnativeCNCF Updates 2019  Winter version and Knative
CNCF Updates 2019 Winter version and Knative
 
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
 
CNCFアップデート情報~2018年のCNCFを振り返る
CNCFアップデート情報~2018年のCNCFを振り返るCNCFアップデート情報~2018年のCNCFを振り返る
CNCFアップデート情報~2018年のCNCFを振り返る
 
コンテナ導入概要資料2018
コンテナ導入概要資料2018コンテナ導入概要資料2018
コンテナ導入概要資料2018
 

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

  • 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. スライドで扱う内容 • Dockerとコンテナ&イメージ • イメージとイメージ・レイヤの基本 • コンテナのライフサイクル • Dockerfileの地雷原 ( CMD vs ENTRYPOINT , ADD vs COPY ) • 複数のコンテナを効率的に操作 ( Swarm & Compose ) 勉強会当日の振り返りと共に、 自習ハンズオン用にも活用でき るように、解説や便利な Tips を追記しています。 Dockerを思い通りに扱えるよ うになりたい初心者を想定して います。
  • 3. 本スライドについて • 想定読者 – Dockerの基礎をこれから学ぶ方 ✔ Docker イメージとコンテナの違いを知りたい ✔ 自分のイメージを作れるようになりたい ✔ ライフサイクルを理解して、自由に使えるようになりたい • 発表 DevOps 勉強会 #2 Dockerを使ったCI/CD http://peatix.com/event/157567 当日資料の加筆版です。 登壇の機会をありがとうございました。
  • 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 ド ッ カ ー
  • 7. 7 Dockerコンテナ ‣ コンテナとは ホスト OS の kernel 機能を使い、複数のルート・ファイルシステムを実行 • 各ルート・ファイルシステムをコンテナ (container) と呼ぶ コンテナは各々のリソースを持つ • プロセス、メモリ、デバイス、ネットワーク Linux カーネルの技術を使う • Namespaces (名前空間によるプロセス間の隔離/分離;isolation) • Cgroups(CPU・メモリ・Disk I/Oのリソース制限) ‣ コンテナの実行に必要な環境 • Docker Engine(エンジン) – コンテナを移動・実行するための必要なプログラム(デーモン) ネームスペース アイソレーション コントロール・グループ 「Dockerコンテナ」を実行する とは、Linux ホスト上で個々の プロセスやファイルシステムを実 行することを指します。 Dockerエンジンはカーネルの 制御を仲介します。そのため、 コンテナを動かす環境では必ず エンジンが必要になります。
  • 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 ソケットドメイン
  • 10. httpd PID 1 コンテナA コンテナB ruby PID 1 chris.rb PID 2 コンテナのプロセス 例えば2つのコンテナを実行す ると、それぞれのコンテナが、独 立したプロセス(PID 1)として 起動します。お互いのプロセス は知らないため、互いに干渉で きません(設定に依存)。
  • 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などを 制御できるのが特長です。
  • 15. docker クライアント docker エンジン $ docker run hello-world run 次は、「Dockerコンテナ」を動 かすために「Dockerイメージ」と どのような関係があるのかを見 てきましょう。 コンテナを動かす(run)するため には「docker run」コマンドを 実行します。これが最もシンプ ルなコマンドになります。 docker run hello-world オペレーティング・システムに 対して docker プログラムの 実行を伝える Docker に対してコンテナに 読み込むイメージの情報を 伝える Docker コンテナを 作成・実行するため のサブコマンド
  • 16. docker クライアント docker エンジン $ docker run hello-world run コンテナを動かそうとするとき Docker Engine は指定され たコンテナ名(正確にはリポジ トリ)がローカルにあるかどうかを 確認します。もしなければ、リ モート環境から自動的にイメー ジをダウンロード(pull)します。 Docker Hub pull レジストリ latest イメージ タグ hello-world レポジトリ • Docker Engine は「docker run」実行時にローカルにイ メージがなければレジストリ (DockerHubが標準)から イメージをダウンロードする。 そのため初回実行時は時間 かかる場合がある。
  • 17. docker クライアント docker エンジン $ docker run hello-world run そしてDockerエンジンの環境 にイメージをダウンロードしました。 ですが、このままではコンテナを 実行できません。後ほど詳しく 扱いますが、Dockerイメージは 読み込み専用(ReadOnly)で あり、変更できません。 Docker Hub pull レジストリ latest イメージ タグ hello-world レポジトリ • Docker Engine は「docker run」実行時にローカルにイ メージがなければレジストリ (DockerHubが標準)から イメージをダウンロードする。 そのため初回実行時は時間 かかる場合がある。 latest イメージ タグ
  • 18. docker クライアント docker エンジン $ docker run hello-world run このイメージ上に読み書き可能 なレイヤを追加しています。図 の赤い部分です。これでコンテ ナを起動する準備が整いました。 Docker Hub pull レジストリ latest イメージ タグ hello-world レポジトリ • Docker Engine は「docker run」実行時にローカルにイ メージがなければレジストリ (DockerHubが標準)から イメージをダウンロードする。 そのため初回実行時は時間 かかる場合がある。 latest イメージ タグ “読み書き可”なレイヤ 読み込み専用 latest
  • 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. $ 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)を命令
  • 22. 22 Docker イメージ ‣ Dockerイメージは コンテナを実行する時に必要な ファイルシステム • イメージ・レイヤ(層)の集合体 – ファイルの実体やメタ情報を含む • レイヤには親子関係がある • 差分情報のみを記録する • Read Only で書き込みできない 共通するレイヤはイメージ間で共有できる • ディスク容量の削減や高いポータビリティを実現する
  • 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. $ 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. 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 コマンドが便利
  • 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. レジストリ (Docker Hub) イメージイメージ イメージ R/W layer Docker Engine pullrun commit 新イメージ 新イメージpush build Docker コンテナのライフサイクル概要 通常dockerを使った操作は 「docker」コマンドを使います。
  • 32. イメージ Read Only コンテナ用 レイヤ 読み書き可 • Docker イメージとはイメージ・レイヤ (rootファイルシステム)とメタデー タ(何のコマンドを実行するのか、ど のポートを開くかなどの管理情報)の 集合体であり、読み込み専用 • それぞれのレイヤは ID を持つ • コンテナの起動とは、Dockerイメージ 上に読み書き可能なレイヤを追加し、 指定されたプロセスを隔離された状態 やシステムリソース上で実行すること docker pull … イメージの取得 docker run … コンテナの実行
  • 33. 33 練習1. hello-world コンテナの実行 ‣ Dockerが正常に使えるかどうか確認します。hello-world という名前の サンプルプログラムを実行します。 ‣ docker run コマンドの書式: • タグを省略すると、自動的に「latest」(最新)になります。 ‣ docker run コマンドを使い、hello-world コンテナを実行します。 ‣ もう一度同じコマンドを実行すると、一瞬でコンテナを実行できます。 • 既にローカルに hello-world イメージがダウンロード済みのためです。 $ docker run hello-world $ docker run コンテナ名:タグ
  • 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 ‣ ダウンロードしたイメージの情報は、Docker Hub 上で確認できます。 https://hub.docker.com/r/docker/whalesay/
  • 37. 37 ‣ whalesayイメージを使い、メッセージを表示するコンテナを実行します。 whalesay イメージは Ubuntu 14.04 をベースに、「cowsay」という鯨が メッセージを表示するプログラムが入っています。 ‣ docker で whalesay イメージの cowsay プログラムを実行します。 練習3. イメージの実行 $ docker run docker/whalesay cowsay hello world 任意の文字列実行するイメージ イメージ内 で実行する コマンド
  • 38. イメージ Read Only コンテナ用 レイヤ 読み書き可 • イメージを作成するには3つの方法 1. Docker Hub から取得する 2. コンテナの内容を手動でコミットし、 新しいイメージを作成する 3. Dockerfileを使ってイメージを自動構 築する(自動コミットの繰り返し) docker commit … イメージの作成 docker build… イメージの自動構築(自動commit)
  • 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 ‣ 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 ‣ 作成したイメージ docker-whale を使ってコンテナを実行します。 練習6. 新しいイメージを実行 $ docker run docker-whale • Dockerfile で指定した CMD 命令を指定した 「fortune」プログラムを実行し、その結果を cowsay プログラムに渡しています。 • fortune プログラムは、この docker-whale イメージの中にあるものです。
  • 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. イメージ Read Only コンテナ用 レイヤ 読み書き可 docker history … イメージの履歴表示 docker diff… 元イメージとコンテナの差分表示 docker inspect… コンテナやイメージの調査
  • 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. イメージ Read Only コンテナ用 レイヤ 読み書き可 docker push … Dockerイメージの送信 docker login … ログイン docker tag … イメージをタグ付け docker search … 検索
  • 46. 46 練習8. Docker Hub に登録・ログイン ‣ 作成したイメージを Docker Hub で公開するため、まずはアカウントを 作成します。既にお持ちであれば、次に進みます。 ‣ https://hub.docker.com/ にアクセスし、ユーザ名・パスワード・登録用 のメールアドレス(認証に必要)を入力します。 • 登録は無料ですが、プライベート(非公開)のリポ ジトリを作る場合は課金が必要です。 • メールの件名は「Please confirm email for your Docker Hub account」(Docker Hub アカウント用の メールアドレスをご確認ください)です。本文中のリ ンクをクリックします。
  • 47. 47 ‣ Docker イメージを置く場所をリポジトリ(repository)と呼びます。 ‣ ブラウザで Docker Hub を開き、 (作成)ボタンを押します。 • リポジトリ名は「docker-whale」とします。 • 簡単な説明(必須)と詳細説明を追加できます。 • Visibilityは public(公開)か private(非公開)を 選べます。 • 最後に「Create」ボタンを押すと、作成完了です。 練習9. リポジトリの作成
  • 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 ‣ 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 ‣ 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. イメージ Read Only コンテナ用 レイヤ 読み書き可 Dockerコンテナとイメージのライフサイクル docker ps … コンテナ一覧や状態の表示 docker rmi … コンテナイメージ削除 docker rm … コンテナ削除 docker images … 一覧
  • 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 ‣ 不要なイメージは「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. Copy on Write(コピー・オン・ライト) 読み込み専用 (Read Only) • Read Only のイメージ層上 のファイルに対する変更は、 必ずコピー作業を行う • 内部実装はストレージ・ドラ イバに依存する(パフォーマ ンスに影響が出る) • CoWを回避するには ボリュームを使う 書き込む前に コピーしてから コンテナのレイヤ上に 変更を反映 捕 捉 イメージ、コンテナ、ストレージ・ドライバの理解 http://docs.docker.jp/engine/userguide/storagedriver/imagesandcontainers.html
  • 55. ボリュームはコンテナ用のレイヤとは分離 イメージ Read Only コンテナ用 レイヤ 読み書き可 • イメージ・レイヤの仕様(Copy on Write) を回避できる • docker commit してもボリューム内容は反 映されない。 • 複数のコンテナでボリュームを共有できる • ホスト側のファイルやディレクトリをマウン ト可能 捕 捉 コンテナでデータを管理する http://docs.docker.jp/engine/userguide/containers/dockervolumes.html
  • 56. Dockerfileと地雷原 ■■■■□ Dockerのベストプラクティスと CMD vs ENTRYPOINT / COPY vs ADD その他、活用にあたって考慮すべきストレージ・ドライバ等 C h a p t e r 4
  • 57. 57 ‣ Dockerfile の役割 どのようなイメージにするか指示 • どのベース・イメージを使うのか? • 何のプログラムをインストールするのか? • どのようなコマンドを実行するのか ‣ docker build コマンドで構築 docker build –t <リポジトリ:タグ> <Dockerfileのパス> Dockerfile docker build イメージの自動構築 改めてDockerfileはDocker イメージ緒自動構築に欠かすこ とができません。
  • 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 ‣ .dockerignore ファイルの活用 ‣ 不要なパッケージのインストールを避ける ‣ イメージ・レイヤの数を減らす • ただし、読みやすさと使い勝手のバランス • 「&&」「¥」 ‣ キャッシュの活用 ‣ 一般的なガイドライン 考えの基本になっているのは、 Dockerイメージとはイメージ・ レイヤの重なりによって構成され ているという点です。 Dockerfile を書くベスト・プラクティス http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html
  • 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 ‣ 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 ‣ 「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 ‣ 次は 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 ‣ 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 ‣ 何も指定しなくてもコマンドを実行するという意味では、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 ‣ 次の 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 ‣ イメージ・レイヤの理解 ストレージドライバの選択 ここから先は高度なトピックにな ります。イメージ・レイヤはこれま で見てきた通りですが、実際の Linux サーバ上では、ストレー ジ・ドライバによって実装が異な ります。 イメージ、コンテナ、ストレージ・ドライバの理解 http://docs.docker.jp/engine/userguide/storagedriver/imagesandcontainers.html
  • 68. こちらは Ubuntu で標準の AUFS ストレージ・ドライバ。 AUFS ストレージ・ドライバを使う http://docs.docker.jp/engine/userguide/storagedriver/aufs-driver.html
  • 69. Red Hat系列のディストリ ビューションはDeviceMapper Device Mapper ストレージ・ドライバを使う http://docs.docker.jp/engine/userguide/storagedriver/device-mapper-driver.html
  • 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 参考情報
  • 75. Engine $ docker run … $ docker run … $ docker run … $ docker run …
  • 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. 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. 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 ‣ Docker Composeは 複数のサービスを管理 • docker コマンドと互換性 ‣ Compose ファイルで設定 • YAML形式 • docker-compose.yml 等 Compose
  • 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 クライアントで操作可能
  • 85. $ docker run … $ docker run … $ docker run …
  • 86. $ docker run … $ docker run … $ docker run …
  • 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. 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 Swarm ‣ Docker Swarmとは • コンテナの配置(スケジューリング)を行う ‣ dockerクライアントで操作可能 • 環境変数で切り替え ‣ Docker Machineと連携が便利 ‣ Swarm 1.6 から書式が変わる
  • 92. 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
  • 93. まとめ • Dockerとコンテナ&イメージ • イメージとイメージ・レイヤの基本 • コンテナのライフサイクル • Dockerfileの地雷原 ( CMD vs ENTRYPOINT , ADD vs COPY ) • 複数のコンテナを効率的に操作 ( Swarm & Compose )
  • 95. 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