SlideShare a Scribd company logo
1 of 123
Docker Compose 徹底解説
俺たちは雰囲気でコンテナを動かしている
Sakura Internet, Inc.
Masahito Zembutsu @zembutsu
OSC 2019 Tokyo Spring #osc19tk
Feb 22, 2019
このスライドは何?
2
Docker Composeの「入門」をコンセプトとして、
⚫ 基本となる Docker コンテナとイメージの違い
⚫ Docker Compose の基本概念と操作
⚫ 便利なコマンド
を紹介しています。
ゴール:
「DockerコンテナとDockerイメージとの違いを理解した上で、
Composeで複数のコンテナを操作できるようにする」
※スライドそのままでは分かりづらい部分があるため、
一部で公開時と異なる表現・補足説明を用いている場合があります。
3
@zembutsu
前佛 雅人
zembutsu@zembutsuBlog: https://pocketstudio.net
Factorio大好き!
2,500時間溶けた
https://factorio.com/
さくらインターネット株式会社
技術本部ミドルウェアグループ
Technology Evangelist / Developer Advocate
最近は「石狩市への小学校プログラミング教育支援プロジェクト」にも所属しています。
https://prog-edu.sakura.ad.jp/
4
http://docs.docker.jp/
Dockerのドキュメント日本語化や、黄色いコンテナ本でDocker部分の章を担当させていただきました。
お品書き
• Docker の本質的な存在意義とは
• Docker Compose とは何か?
• なぜ Docker Compose なのか?
• Docker Compose のセットアップと基本操作
• WordPress を Docker Compose で管理する例
• Docker Compose 活用のヒント(Tips)
5今日ここで共有させていただく内容は、こちらです。皆さまのご想像通りでしょうか?
6
Docker の本質的な存在意義
Why Docker?
7
Dockerとは?
8
What is the Docker?
1
Dockerコンテナは
実行に必要な全て
をパッケージして、
簡単に動かせる
2
Dockerイメージは
複数のイメージ・
レイヤとメタ情報の
積み重なり
3
コンテナのプロセス
はデフォルトで
isolate(隔離・分離)
された状態
⚫ イメージ・レイヤ(image layer)は
読み込み専用
⚫ 親子関係がある
⚫ イメージに対する変更はCopy on
Write(CoW)処理が走る
⚫ コンテナ実行にはイメージが必要
で、Docker Hubから得られる
⚫ コンテナ実行時のみ、読み書きが
可能なレイヤを追加
⚫ namespace(名前空間)でプロセ
ス空間やファイルシステムやネッ
トワーク等を分ける技術と、
cgroups(コントロール・グループ)
でリソースの利用上限を指定
⚫ コンテナはポートをデフォルトで開
かない
⚫ ネットワークはブリッジ、ホスト、
noneの3種類
⚫ ボリュームはコンテナ間でファイル
システムを共有できる。名前付き
(named)とホスト・ボリューム
⚫ アプリケーションを簡単に開発し、
移動し、実行するためのプログラム
とプラットフォームを提供するのが
Docker
⚫ クライアント・サーバ型
https://docker.com
プロセスを簡単にコンテナ化(isolate)し、
簡単かつ素早く開発・移動・実行できる「プラットフォーム」が Docker
Containerization
「プロセス・ファイルシステム・ネットワーク・等々」に対して
Namespace・Cgroup
Build Ship Run
9新しい概念が少しあるものの、Dockerやコンテナそのものは、実はシンプルです。
Docker
10
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
全ての依存関係をパッケージ化して、コンテナとして動かす
まず、「Docker」そのものには、このような定義があります。
Docker
11
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
全ての依存関係をパッケージ化して、コンテナとして動かす
Dockerイメージとして
Linuxファイルシステムを
ポイントはファイルシステム、「/」以下の「/bin/」や「/var」等を「Dockerイメージ」にパッケージ化。
Docker
12
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
全ての依存関係をパッケージ化して、コンテナとして動かす
Dockerイメージとして
Linuxファイルシステムを
その「Dockerイメージ」を「Dockerコンテナ」として動かす(run、走らせる)ことができます。
コンテナを実行? コンテナを走らせる?
13ここで出てくる新しい概念が「コンテナ」として「動かす」です。コンテナとは一体何者なのだ・・・?
(((
15
(物理または仮想)
コンピュータ
CPU
メモリ
記憶装置
コンテナの前に、「プロセスの実行」をお復習い。コンピュータないしサーバの基本要素はこちら。
16
(物理または仮想)
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
「プロセスの実行」とは、記憶装置にあるOSファイル
システム上のファイル(プログラム)に、CPUとメモリ
を使えるようにします。
17
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プロセス
プログラム 設定ファイル ソースコード データ
一般的な
プロセス実行
一般的なプロセス実行は、この図のような概念です。
プログラムでプロセスを動かし、プロセスはOS上の
ファイルにアクセスできます。
18
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プロセス
プログラム 設定ファイル ソースコード データ
プロセス
一般的な
プロセス実行
サーバ用とのLinux上では、1つのマシン上で、
同時に沢山のプロセスが稼働できます。プロセス
間で通信する場合もあります。
19
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プログラム 設定ファイル ソースコード データ
コンテナは
特別な状態の
プロセスのこと
isolate(隔離)
プロセス
isolate(隔離)
プロセス
そして「コンテナ状態」のプロセスは、isolate(隔離)
された特別な状態のプロセスです。名前空間機能で
プロセス空間、ファイルシステム等を分けて実行。
20
(物理または仮想)
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
コンピュータ
CPU
メモリ
記憶装置
オペレーティングシステム (OS)の領域
プログラム 設定ファイル ソースコード データ
コンテナは
特別な状態の
プロセスのこと
isolate(隔離)
プロセス
isolate(隔離)
プロセス
名前空間(namespace)はLinuxカーネルの機能。
これを、簡単に管理できるようにするツールかつ
プラットフォームが、Docker(エンジン)なのです。
21
isolate(分離)する
insulatus→isolated→isolate
isle island
ア イ ソ レ ー ト
“名前空間”技術を使って
namespace
Dockerはisolate状態のプロセスを管理するもの。islateの語源はラテン語で、islandとも関連
22つまり、断崖絶壁の孤島に自分だけ一人しかいない。そのような状況のプロセスがコンテナなのです。
PID名前空間
23
httpd
PID 1
プロセスhttpd
名前空間
プロセスruby
名前空間
ruby
PID 1
chris.rb
PID 2
名前空間は複数ありますが、分かりやすいのはPID。 ここでは httpd,rubyどちらもPIDが「1」
namespaces
自らのPID名
前空間内では
PID名前空間
24
httpd
PID 1
プロセスhttpd
名前空間
プロセスruby
名前空間
ruby
PID 1
chris.rb
PID 2
/sbin/init
PID 1
containerd
PID 5
httpd
PID 6
ruby
PID 7
chris.rb
PID 8
alice
PID 2
bob
PID 3
PPID 1 PPID 1
PPID 4
PPID 5 PPID 5
PPID 7
PPID 1
dockerd
PID 4
ですが、ホスト上では別の(本来の)PIDを持ち、通常のプロセス・ツリーの下で動作。
PID名前空間
25
httpd
PID 1
プロセスhttpd
名前空間
プロセスruby
名前空間
ruby
PID 1
chris.rb
PID 2
/sbin/init
PID 1
containerd
PID 5
httpd
PID 6
ruby
PID 7
chris.rb
PID 8
alice
PID 2
bob
PID 3
PPID 1 PPID 1
PPID 4
PPID 5 PPID 5
PPID 7
PPID 1
dockerd
PID 4
ホスト上には存在
つまり、ホスト上では普通にプロセスが走っていますが、名前空間内では自分達しか見えない状態。
外の世界が見えない
井の中の蛙
のような存在…
ファイルシステムを分ける (chroot)
26
ubuntuの
ファイルシステム
… …
centosの
ファイルシステム
/etc /bin /etc /bin
/ /
次に分かりやすいのがファイルシステム。chrootの概念と同じ、特定のディレクトリをルートにします。
そのプロセス
を実行時に
ファイルシステムを分ける (chroot)
27
ubuntuの
ファイルシステム
… …
centosの
ファイルシステム
/etc /bin /etc /bin
/ /
/data/ubuntu /data/centos
/
/etc /data/bin
あくまでも、OS上にファイルシステムがあり、そこをプロセスがchroot状態でマウントします。
ファイルシステムを分ける (chroot)
28
ubuntuの
ファイルシステム
… …
centosの
ファイルシステム
/etc /bin /etc /bin
/ /
/data/ubuntu /data/centos
/
/etc /data/bin ホスト上には存在
そうすると、お互いのファイルシステム、つまりディレクトリやファイルを干渉できなくなるのです。
コンテナは特別なプロセスの状態
29
コンテナAの
ファイルシステム
… …
コンテナBの
ファイルシステム
/etc
(/data/ubuntu/etc)
/bin
(/data/ubuntu/bin)
/etc
(/data/centos/etc)
/bin
(/data/centos/bin)
/ /
それでは、改めて、「コンテナの実行」とは名か。まず何らかのファイルシステムが存在していて、
コンテナは特別なプロセスの状態
30
コンテナAの
ファイルシステム
… …
コンテナBの
ファイルシステム
/etc
(/data/ubuntu/etc)
/bin
(/data/ubuntu/bin)
/etc
(/data/centos/etc)
/bin
(/data/centos/bin)
/ /
httpd
PID 1
プロセスA プロセスB
ruby
PID 1
chris.rb
PID 2
コンテナB
そこから「特別な状態」として複数の名前空間を分離し、chrootされた場所をマウント&プロセス起動
コンテナは特別なプロセスの状態
31
コンテナAの
ファイルシステム
… …
コンテナBの
ファイルシステム
/etc
(/data/ubuntu/etc)
/bin
(/data/ubuntu/bin)
/etc
(/data/centos/etc)
/bin
(/data/centos/bin)
/ /
httpd
PID 1
プロセスA プロセスB
ruby
PID 1
chris.rb
PID 2
コンテナA コンテナB
名前空間の isolate
・プロセス
・ファイルシステム
・ネットワーク
・ホスト名
・UID・GID
・プロセス間通信、等
cgroupでリソース制限
・CPU
・メモリ
・I/O
・ディスク・クォータ、等
これがコンテナ状態として起動
するプロセスであり、名前空間
がisolate(隔離)された状態。
ネットワークやUID、GIDやホス
ト名も分離さらにcgroup技術
で、CPUやメモリといったリソー
スの制限もできる状態。
32これが「コンテナ」です。コンテナを作るには、Docker以外にもLXCやOpenVZ等の実装があります。
33
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Docker イメージ
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
Dockerはコンテナ管理プラットフォーム。
設定ファイル、ソースコードなどを「Docker
イメージ」にまとめて、実行します。このイメー
ジを送受信する機能を持っています。
34
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Docker イメージ
ビルド
pull
Dockerイメージ Dockerイメージ
※異なるシステム、バージョン、ソースコード
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
「docker pull」や「docker build」といった、
簡単なコマンドを実行するだけで、Docker
Hub (公式イメージ・レジストリ)から、自動で
Docker イメージをダウンロードします。
35
ユーザ空間
システム空間
Linux カーネル + システム・ライブラリ(libc)等
オペレーティングシステム (OS)の領域
プログラム 設定ファイル
ソースコード データ
Dockerコンテナ
プロセス
Dockerコンテナ
プロセス
Docker イメージ
ビルド
pull
Dockerイメージ Dockerイメージ
※異なるシステム、バージョン、ソースコード
Dockerイメージを使って
Dockerコンテナ(隔離状態)のプロセスを起動
あとは、Dockerイメージ内のファイルを使い
プロセスを名前空間を分離した特別な状態で
起動できるようにする。これがDockerの役割
なのです。
Dockerはサーバ・クライアント型モデル
36
OS ( Linux )
物理/仮想サーバ
Docker エンジン
( dockerd デーモン )
Linux kernel
コンテナ コンテナ コンテナ
リモート
API
docker
クライアント TCP あるいは
Unix ソケットドメイン
containerd
Runtime: runC (OCI規格準拠)
・docker コマンド
Linux, Mac OS X, Windows
・Kitematic (GUI)
Mac OS X, Windows
・Docker Compose
・Docker Swarm
ちなみに、DockerそのものはDockerエンジンと呼ぶサーバ側プログラムと、CLIで構成。
参考:Docker Engineのアーキテクチャ
37※ Docker Engine v1.11 以降
ユーザ
(docker CLI等)
Docker Container Engine
dockerd
containerd
(docker-containerd)
shim
(docker-containerd-shim)
shim
(docker-containerd-shim)
shim
(docker-containerd-shim)
runC
(runtime-runc)
コンテナ
Docker Image
コンテナ
Docker Image
コンテナ
Docker Image
JSON/REST API
CNCF/OCI業界標準規格に準拠
runC
(runtime-runc)
runC
(runtime-runc)
gRPC エンドポイント
Docker Engine トップレベルのデーモン
(Moby プロジェクトの成果物)
Docker イメージに含むファイルを、
パラメータに従い、コンテナとして実行
コンテナを実際に作成・起動する
ランタイムのバイナリ・プログラム
コンテナやイメージをはじめとし、
ネットワーク、ストレージを管理する
必要最小限のデーモン
ランタイムが実行したコンテナを管理
細かく見ますと、
このようなプログラムで構成
Dockerイメージはイメージ・レイヤの積み重ね
38
プログラムやライブラリと
メタ情報(実行するプログラムやポートなど)
さて、次は「Dockerイメージ」です。これは仮想マシン・イメージとは全く異なる概念です。
Dockerイメージはイメージ・レイヤの積み重ね
39
プログラムやライブラリと
メタ情報(実行するプログラムやポートなど)
Dockerイメージは、複数のイメージ・レイヤ(image layer)の組み合わせで、読み込み専用。
1つ1つのイメージ・レイヤの
実体は、ファイルシステム( /
以下の /bin や /etc などの
ディレクトリやファイル)を tar
アーカイブ化したものや、
メタ情報(どのプログラムを自
動実行するか、パラメータは
何か、どのポートを公開するか
など)が記録。
Dockerイメージはイメージ・レイヤの積み重ね
40
利用者からは
1つに見える
親
子
関
係
プログラムやライブラリと
メタ情報(実行するプログラムやポートなど)
イメージ・レイヤは親子関係を持ち、複数のレイヤは利用時に1つのファイルシステムに見える。
⚫ 一般的にDockerイメージ
は複数のイメージ・レイヤ
で構成
⚫ 例えば、“nginx:latest”
イメージを取得(pull)する
と、親のレイヤ情報を持つ
レイヤも自動的に取得
⚫ 結果として、利用者からは
1つのDockerイメージを
取得・実行するつもりでも、
実際には複数のイメージ・
レイヤをまとめて操作
Dockerイメージはイメージ・レイヤの積み重ね
41
利用者からは
1つに見える
親
子
関
係
プログラムやライブラリと
メタ情報(実行するプログラムやポートなど)
そして、親レイヤが共通の、別のイメージを作るのも簡単。共有部分はディスク容量を消費しません。
派生も
共有
利用者からは
1つに見える
Dockerイメージはイメージ・レイヤの積み重ね
42
利用者からは
1つに見える
プログラムやライブラリと
メタ情報(実行するプログラムやポートなど)
仮想マシン・イメージであればコピーは数GBもあり、通常は時間もお金も掛かります。
派生も
共有
利用者からは
1つに見える
だから高速に移動できる・開発を高速化できる
リソースを有効に使える “lightweight” な性質
親
子
関
係
43ちなみに、イメージを作るにはコマンド「docker build」で、Dockerfileというファイルを用意します。
docker image build -t <IMAGE:TAG> .
(docker build)
これがDockerfileです。1行1行が
イメージ・レイヤに相当します。
このイメージは、上から順に、
⚫ 「FROM」命令で「scratch」、何も無い
イメージ・レイヤを作成
⚫ 「ADD」命令で、ファイルシステム
をイメージ・システムの中に入れる
⚫ 「CMD」命令で、イメージ使った
コンテナ実行時に、「/bin/sh」をデフォ
ルトで実行する設定
を指定しています。
44
利用者からは
1つに見える
docker image build -t <IMAGE:TAG> .
(docker build)
3つのイメージ・レイヤは、あくまで1つのDockerイメージが存在しているように見えます。
45
利用者からは
1つに見える
docker image build -t <IMAGE:TAG> .
(docker build)
3つのイメージ・レイヤは、あくまで1つのDockerイメージが存在しているように見えます。
46
利用者からは
1つに見える
alpine
docker image build -t <IMAGE:TAG> .
(docker build)
3つのイメージ・レイヤは、あくまで1つのDockerイメージが存在しているように見えます。
これはAlpine Linuxの
Dockerfile でした。
47
利用者からは
1つに見える
hello:v1
FROM alpine
ENTRYPOINT ["/bin/echo"]
CMD ["こんにちは!こんにちは!"]
docker image build -t hello:v1 .
(docker build)
今度は「alpine」という小さなLinuxディストリビューションを使う例です。「v1」とタグを付けます。
48
hello:v1
FROM alpine
ENTRYPOINT ["/bin/echo"]
CMD [“おはよう!おはよう!"]
hello:v2
docker image build -t hello:v2 .
(docker build)
次に「v2」を作成。この時必要となるディスク領域は、「v1」との差分(画面青色のレイヤ)のみです。
Alpine Linux
49
https://www.alpinelinux.org
gliderlabs / docker-alpine
50
イメージ・レイヤ
3つのレイヤで容量たったの5MB。 Alpine Linux の Dockerfile は、GitHub上で公開されています。
docker image pull (docker pull)
51
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
Docker Hub
自分でイメージを作らなくても、DockerHubからイメージのダウンロードも可能。
DockerHub とは、GitHubがソース
コードを共有・公開・共同作業するため
の場所であるように、Dockerイメージ
を共有・公開・共同作業する場所です。
docker image pull (docker pull)
52
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
Docker Hub
大事なのは「library」が公式イメージ専用の名前空間で、セキュリティ上、公式のみ使うべきです。
53
⚫それでは、Docker コンテナと Docker イメージの違いって何?
⚫どうして1つのマシン上でコンテナをたくさん起動できるの?
54
⚫それでは、Docker コンテナと Docker イメージの違いって何?
⚫どうして1つのマシン上でコンテナをたくさん起動できるの?
Dockerコンテナ実行とは、イメージ内のプログラムを実行
55イメージ・レイヤは読み込み専用なので、レイヤで構成されるDockerイメージ全体も読み込み専用。
Dockerコンテナ実行とは、イメージ内のプログラムを実行
56
元のレイヤに対する変更情報を記録
Copy on Write の性質
コンテナ実行時に、読み書き可能なコンテナ用のイメージ・レイヤを作成し、プログラムを実行します。
docker container run -it alpine
(docker run)
この例では、ベースとなるのが
“alpine” Dockerイメージです
(読み込み専用。一切変更できません。)
変更できるのは、 “alpine” を親イメージ・レイヤとして
情報を持っている、赤い部分の読み書き可能なレイヤ。
(docker ps -aで確認でき、docker rm で消すのは
このコンテナ用レイヤです)
ファイル変更時は、読み込み専用のイメージ・レイヤ
から一度ファイルをコピーする挙動が発生します。
(これを、コピー・オン・ライトと呼びます)。
Dockerコンテナ実行とは、イメージ内のプログラムを実行
57
元のレイヤに対する変更情報を記録
Copy on Write の性質
利用者からは
1つに見える
利用者からは
1つに見える
だから高速に移動できる・開発を高速化できる
リソースを有効に使える “lightweight” な性質
コンテナ用レイヤも親子関係を持つため、同じイメージなら直ぐに起動し、容量も圧迫しません。
58
技術と仕様
Technology Specification
コンテナ Docker
つまり、Linuxカーネルのコンテナ技術を、Dockerというプラットフォームで簡単に扱えるのです。
Dockerは構築・移動・実行のためのプラットフォーム
59
サービスを
提供したい
開発
環境
テスト
環境
準備
環境
本番
環境
都度、環境構築課題 異なるOS環境課題
都度、プロビジョニング課題 動かない課題
時間がかかる課題 遅い課題 面倒課題
アプリを
動かしたい
コンテナ
開発 テスト 準備 本番
docker クライアント docker エンジン
$ docker container run hello-world
run
Docker Hub
pull
レジストリ
latest
イメージ
タグ
hello-world レポジトリ
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/
Dockerイメージを取得したり、共有するための「公開レジストリ」が「Docker Hub」。
ちなみにDockerのキャラクターの名前は “Moby”
61https://en.wikipedia.org/wiki/Moby-Dick
白鯨 – Moby-Dick
モビー
わたしです
Docker ネットワーク概要
Docker network
62
63
3つの Docker 標準ネットワークモデル
bridge
(bridge)
host
(host)
none
(null)
ブリッジ(bridge0 …)
veth
eth0
ethX
Dockerでコンテナを実行すると、
プロセスの「ネットワーク」や「ホスト名」
もisolate(分離)した状態で起動。
64
3つの Docker 標準ネットワークモデル
bridge
(bridge)
ブリッジ(bridge0 …)
veth
eth0
ethX
none
(null)
host
(host)
複数のブリッジ(ネットワーク)を定義できる
デフォルトのbridge0ブリッジは、旧仕様の
ネットワークで、挙動が異なる
デフォルトは「ブリッジ」ドライバを使う
ネットワーク。docker network lsで
3つのドライバが表示。
65
3つの Docker 標準ネットワークモデル
bridge
(bridge)
host
(host)
none
(null)
ブリッジ(bridge0 …)
veth
eth0
ethX
ホスト側のネットワークに直接接続
ブリッジのオーバーヘッドがない一方で、
セキュリティに対する考慮が必要
ホスト側のインタフェースを直接
使いたい場合、docker run のオプショ
ンで --network=host を指定
66
3つの Docker 標準ネットワークモデル
bridge
(bridge)
host
(host)
ブリッジ(bridge0 …)
veth
eth0
ethX
ネットワークを追加しない限り疎通できない
none
(null)
ネットワーク・インターフェースを持た
せない場合は、docker run のオプショ
ンで --network=none を指定
67
3つの Docker 標準ネットワークモデル
bridge
(bridge)
host
(host)
none
(null)
ブリッジ(bridge0 …)
veth
eth0
ethX
NAT
(iptables)
+
docker-proxy
ホストと
ネットワーク
共通
疎通しない
コンテナはパブリックなIPアドレスを持ない
ホスト側のポート番号を重複して、コンテナ
のポート利用(マッピング)はできない
動的なネットワークの追加・変更・削除
これらネットワークはコンテナを停止・
再起動しなくても、動的に着けたり(ア
タッチ)外したり(デタッチ)可能。
68
コンテナは複数のネットワーク(ブリッジ)に接続できる
ブリッジ1(bridge)
veth
eth0
ethX
各ネットワーク内部では、動的なコンテナ名
(サービス)の名前解決機能(サービス・ディス
カバリ)を標準提供
eth0 eth1 eth0
ブリッジ2(bridge)
veth192.168.0.1
172.18.0.2 172.18.0.3 172.19.0.2 172.19.0.3
172.19.0.1
172.19.0.0/16172.18.0.0/16
サービス・ディスカバリ連携の負荷分散
また、複数のブリッジ・ネットワークを
定義できます。内部では、コンテナ名で
IPアドレスを名前解決できる
Docker ボリューム概要
Docker volume
69
70
データの扱い
コンテナA専用
ファイル階層
File System
…
/
/bin
/etc
/var
コンテナB専用
ファイル階層
File System
…
/
/bin
/etc
/var
hello.txt
×
HOST Root
File System
/var/lib/docker/overlay/
hello.txt
ディレクトリはストレージドライバによって異なる
A
BUFS( Union File System )
コンテナA・B(のプロセス)は、お互いの
ファイルシステムを直接参照できません。
71
データ・ボリューム
コンテナA専用
ファイル階層
File System
…
/
/bin
/etc
/var
コンテナからはUFSを通してデータ領域が見える
ストレージ・ドライバのオーバヘッドを受けない
複数のコンテナでボリュームを共有できる
volume
/data
/
ボリューム
Volume
/var/lib/docker/volumes/HOST Root
File System
コンテナは「ボリューム」と呼ぶ領域(ディレクトリまたはファイル)をマウントできる
72
コンテナ
ファイル階層
File System
/
UFS ( Union File System)…
/
/bin
/var
Docker
イメージ
Docker Image
/var/lib/docker/image/
volume
/
ボリューム
Volume
/data
コンテナ用
イメージ層
Container’s
Image Layer
/
/var/lib/docker/volumes//var/lib/docker/containers/
ReadOnly
73
ボリュームは3分類
ホストをマウント 名前付き
ホスト上のディレクトリ
/docker/data
/data
名前無し
volume
ボリュームの実体は、ホスト上のディレクトリ
/var/lib/docker/volumes
ボリュームはコンテナ間でデータを共有できる
volume
/data /data /etc
ボリュームとして、ホスト上のファイルを
直接マウントできるだけでなく( docker run -v ホスト側:コンテ
ナ内)、ボリュームを複数のコンテナで共有可能。読み書きする
データは、通常このボリュームを作成し、利用する。
Docker Compose が必要な理由
Why? There are some reasons to manage containers.
74
75
⚫たくさんのコンテナを同時に実行するには?
サーバは通常、ウェブやデータベースなど、複数のプロセスが動作。
76
ふくすう の コンテナ を きどう しよう
システム
コンテナ
コンテナ
システム
コンテナ
スケールしづらさ
管理のしづらさから
Dockerやk8sには
向かないね プロセス
A
プロセス
B
プロセス
C
1つのコンテナに多くのプロセスを集約する手法もありますが、スケールしづらくなります。
77
ふくすう の コンテナ を きどう しよう
コンテナ
システム
コンテナ
ソフトウェアごとに
コンテナが別だから
スケールしやすいし
差し替えも簡単 プロセス
A
コンテナ
プロセス
B
コンテナ
プロセス
C
アプリケーション
コンテナ
プログラムごとにコンテナを分ける手法、これをアプリケーション・コンテナと呼ばれます。
78
ふくすう の コンテナ を きどう しよう
コンテナ
システム
コンテナ
ソフトウェアごとに
コンテナが別だから
スケールしやすいし
差し替えも簡単 プロセス
A
コンテナ
プロセス
B
コンテナ
プロセス
C
アプリケーション
コンテナ
docker run …
docker run …
docker run …
ただし、コンテナごとにコマンドを実行する必要があり、ます。この画面では3回の実行ですが、、、
79
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
docker run …
もしも コンテナ が 20こ ひつよう なら
⚫ 環境構築が大変
⚫ 環境の維持・再現が大変
⚫ 本末転倒
20回実行する必要があり、これでは面倒。「簡単に扱うためのDocker」から乖離してしまいます。
80
docker-compose up
そこで コンポーズ の でばん
⚫ 環境はYAMLで管理
⚫ docker コマンドと類似
利用者側のメリット:
• compose ファイルがあれば、とにかく動く
ので(環境の再現性が高い)
開発者側のメリット:
• 1つのマシン上で、複数の環境を切り替え
やすい
そこで出てきたのがCompose。dockerと似たコマンドを実行するだけで、まとめてコンテナを実行。
81
コマンド? の ごかんせい
docker と docker-compose はコマンドの意味が近いため、docker に慣れていると楽
しかも、Dockerのネットワークやボリュームも一緒に管理できる利便性
82
ちなみに
http://www.fig.sh
元々は「Fig」というプロジェクトでしたが、2014年にDocker社に買収されて名称変更。
83
これは ちがい ます
ごめんなさい、ごめんなさい
複数のコンテナを一括管理する
Docker Compose
Docker Compose
84
Docker Composeとは?
85
What is Docker Compose?
1
Composeは
アプリケーションの
サービスをファイル
で定義する
2
Dockerコマンドと
高い親和性がある
ため、学習コストが
比較的に低い
3
Swarm モードに
サービスをデプロイ
できるオーケストレー
ション機能
⚫ docker-compose CLI のコマン
体系は docker に準拠
⚫ 例:「docker run -d」は
「docker-compose up -d」
⚫ Docker swarm モードを使えば、
サービス状態を定義できるので
常に期待状態を維持できる
◼ docker stack deploy
⚫ Ingress ネットワークの活用
⚫ Compose ファイル (YAML形式)
で Docker コンテナのサービスを
定義できるため、
再利用性が高い
◼ コンテナの状態
◼ イメージ
◼ ネットワーク
◼ ボリューム
◼ メタ情報
https://github.com/docker/compose
複数のコンテナで構成するアプリケーションを
定義と実行するためのツール
multi-container applications
define and run
86
Mastodon
Mastodonのように、複雑な構成のアプリケーションも、Docker Composeで利用できる
87
redis
:alpine
postgres
:alpine
サービス サービス
イメージ イメージ
nginx
:alpine
サービス
イメージ
gargron/mastodon
:v1.4.6
サービス
イメージ
gargron/mastodon
:v1.4.6
サービス
イメージ
gargron/mastodon
:v1.4.6
サービス
イメージ
namshi/smtp
:latest
サービス
イメージ
https://github.com/tootsuite/mastodon
ネットワーク
192.168.0.0/16 mastdon (external)
ホスト側ネットワーク
eth0等
mastodon_postgresmastodon_redis certbot
(external)
assets packs system
volumevolume volume volume volume volume
80 443
80 443
services:
volumes:
networks:
特にネットワークやボリュームが混在する場合には有用
Docker Compose 活用場面
• 利用者視点
• 「docker-compose.yml」があれば、すぐに何でも実行できる
• YAML形式で記述
• Docker Hub 公式イメージ上でサンプルが公開されている
• PWD (Play With Docker という、無料で短時間利用できるクラウド上のリソース)でお試し
• 開発者視点
• 環境の再構築が簡単
• バージョン違いの環境を作りやすい
• 1つのマシン上に、複数の環境を立ち上げられやすい
88適切に書いたYAMLファイルさえあれば、誰でも簡単に実行できるのが強み。しかも、環境まとめて。
Dockerのセットアップ
89
$ curl https://get.docker.com | head
$ curl -fsSL get.docker.com -o get-docker.sh
# sh ./get.docker.com
# systemctl enable docker
# systemctl start docker
※systemd系の場合
※リポジトリの自動セットアップ
※コマンドの確認
Linuxで検証用途に手軽な方法
Dockerのセットアップはシンプルです。あるいはDocker for Mac/Winという選択肢も。
Docker Compose セットアップ方法
• Docker Desktop for Mac / Windows
• docker-compose も同梱されているので、すぐに使える
• Linux 版
• バイナリをリポジトリからローカルにダウンロードし、パーミッションを設定
• https://github.com/docker/compose/releases
“Assets”からアーキテクチャごとにダウンロードできる
Linuxは “docker-compose-Linux-x86-64”
90
curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64 ¥
-o /usr/local/bin/docker-compose
chmod 755 /usr/local/bin/docker-compose
Linuxは docker-compose のバイナリを、別途セットアップする必要があります。
Docker Composeを使うための基本ステップ
91
Compose ファイル docker-compose up
YAML
ある
ない
Docker イメージ
ない
Dockerfileを作成
Compose
ファイル作成
ある
「サービス」「ネットワーク」「ボリューム」などをYAML形式で記述した、Composeファイルが必要。
docker-compose.yml
• 「サービス」「ネットワーク」「ボリューム」を定義
• image … イメージ IDやイメージ名
• build … Dockerfile のパス(イメージを構築する場合)
• command … デフォルトの(イメージ実行時)コマンドを上書き
• restart … コンテナの再起動ポリシー(例: always)
• ports … ポートのマッピング
• environment: , env_file: 環境変数の指定
92
services: networks: volumes:
Docker Composeは「プロジェクト」を操作。プロジェクトを定義するのが、このComposeファイル。
93
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
◀ ネットワークやボリュームを使う場合、通常2以上
swarm modeにデプロイする場合は3を想定
WordPress公式の
Docker Compose例
◀ 使用するDockerイメージは「wordpress:latest」
◀ サービスを定義
◀ サービス「wordpress」
◀ 停止時、常にプロセス再起動
◀ ホスト側ポート8080を、コンテナ内ポート80に割り当て
◀ コンテナ内で使える環境変数を定義
◀ 初回実行時rootパス自動生成
◀ サービス「db」
◀ サービス「db」で名前解決できる
◀ WordPress用のデータベース、
ユーザ、ユーザのパスワードを定義
◀ 使用するDockerイメージは「mysql:5.7」
◀ 停止時、常にプロセス再起動
◀ コンテナ内で使える環境変数を定義
※ネットワークを定義していないが
docker-compose up時に自動的
に、このプロジェクト専用の bridge
ネットワークが作成される。
※wordpressとdbのコンテナ間は
ポートの公開を明示しなくても、
同一 bridge ネットワークに所属
しているため、お互い内部通信可能
94
version: '3'
services:
web:
image: zembutsu/docker-sample-nginx
deploy:
replicas: 3
resources:
limits:
cpus: "0.1"
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
internal:
aliases:
- frontend
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
internal:
◀ ネットワークやボリュームを使う場合、通常2以上
swarm modeにデプロイする場合は3を想定「web」という名称のサービスを
定義(内部ネットワークで名前
解決できる)▶
◀ 使用するDockerイメージ
◀ コンテナのレプリカ(複製)を3つ起動
◀ CPUリソース制限
◀ 再起動ポリシーを指定:障害時に再起動
◀ ホスト側のポート80を、コンテナ内のポート80にマッピング
◀ 「internal」という名称のブリッジネットワークに接続し、
frontend というエイリアス(別名)を指定
◀ ボリューム定義
/etc/localhost を読み込み専用で
◀ ネットワーク定義
internalという名称のブリッジ・ネットワーク
◀ docker stack deploy時の挙動
別例:
95
コンテナは複数のネットワーク(ブリッジ)に接続できる
ブリッジ1(bridge)
veth
eth0
ethX
各ネットワーク内部では、動的なコンテナ名
(サービス)の名前解決機能(サービス・ディス
カバリ)を標準提供
eth0 eth1 eth0
ブリッジ2(bridge)
veth192.168.0.1
172.18.0.2 172.18.0.3 172.19.0.2 172.19.0.3
172.19.0.1
172.19.0.0/16172.180.0/16
サービス・ディスカバリ連携の負荷分散
Composeはプロジェクト単位で
ブリッジ・ネットワークを自動的に
作成でき、ホスト側とのマッピングも
設定可能。
Composeプロジェクトの「ネットワーク」定義
96
networks:
external_network:
internal_network:
internal: true
services:
web:
...
networks:
hostnet: {}
networks:
hostnet:
external: true
name: host
「networks」でネットワークを定義。”external:true” は、この Compose プロジェクト外で(手動・自動的
に存在しているネットワークと接続)。”driver: overlay”の場合、”internal:true”で、複数ホスト間をつな
ぐローカルネットワークも定義できる。
97
ボリュームは3分類
ホストをマウント 名前付き
ホスト上のディレクトリ
/docker/data
/data
名前無し
volume
ボリュームの実体は、ホスト上のディレクトリ
/var/lib/docker/volumes
ボリュームはコンテナ間でデータを共有できる
volume
/data /data /etc
コンテナ(のプロセス)でマウントするボリューム(領域)も、Composeで定義できる。
Composeプロジェクトの「ボリューム」定義
98
services:
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
volumes:
- /var/lib/mysql
- cache:/tmp/cache
- ./configs:/etc/configs/:ro
「volumes:」に “- ディレクトリまたはファイル名”の場合は
名前無し(volume idが割り振られる)。主に使い捨て用途
“- 名前:パス” は名前付きボリューム。ホスト上での管理を
容易にするため(バックアップや参照で)
“- パス:パス” はホスト上を直接マウント。
“:ro”は Read-Only オプション
個々のサービスの中で定義する場合は、
そのサービス(のコンテナ)だけが参照
プロジェクト全体または個々のサービスに定義。毎回 docker volume create等の管理が不要に。
動かし方や便利なコツ
Run & Tips
99
Docker Compose Run & Tips
• docker-compose up -d --build
• docker-compose down -v –rmi all / local
• docker-compose exec <サービス名> コマンド
• docker-compose -f <ファイル名.yml>
• docker-compose -p <プロジェクト名>
• docker-compose --config
• docker system prune
• docker volume rm $(docker volume ls -q)
100compose を普段使う上で、よく使うコマンドは、このあたり。
特に知らないうちにネットワークやボリュームが混在するときは prune(プルーン)コマンドで一斉掃除。
◀ プロジェクト起動時、毎回Dockerfileをbuildする
◀ 停止時、イメージとボリューム全削除
◀ デバッグ用途。コンテナ内で操作
◀ 任意のYAMLファイルを指定可能
◀ ディレクトリ名ではなく、任意のプロジェクト
名を指定可能
◀ 稼働しているプロジェクトの情報を、YAML形式で表示
(間違って YAML を消した場合や、複数の YAML が混在し
操作対象が分からなくなった時に重宝・・・)
◀ 不要コンテナ、中間イメージ、ネットワークを削除(-vでボリュームも)
◀ ボリュームの全削除
Compose ファイル形式バージョン
• networks: volumes: は v2 , v3 で利用可能
• v3 を使うには Docker v1.13 以上
• Swarm mode を使うには v3 (同じオプションでも v2 と挙動が異なる)
• 細かな差違はリファレンス
https://docs.docker.com/compose/compose-file/
101細かな挙動の違いはあるものの、docker stack コマンドで swarm 使わなければ、ほぼ考慮不要。
コンテナ内の環境変数 env_file & environment:
102
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD:
examplepass
WORDPRESS_DB_NAME: exampledb
services:
wordpress:
image: wordpress
restart: always
ports:
- 88:80
env_file:
- wordpress.env
WORDPRESS_DB_HOST=db
WORDPRESS_DB_USER=exampleuser
WORDPRESS_DB_PASSWORD=examplepass
WORDPRESS_DB_NAME=exampledb
知っておくと便利なのが環境変数の定義方法。「enf_file:」で別ファイルにすると
Compose ファイルと分離できる。セキュリティ上、考慮が必要な情報に対して有効。
(間違って GitHub に push してしまうのを .gitignore で回避できる、、)
wordpress.env の内容
args: はイメージ構築時の環境変数を定義
$ docker-compose build --build-arg="text=hello"
103
version: '3'
services:
apache:
build:
context: ./service-httpd/
dockerfile: Dockerfile.httpd
args:
- text=plain
image: localhttpd:1.0
ports:
- "80:80"
FROM httpd:2.4-alpine
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && apk del tzdata
ARG text
RUN echo $text > /usr/local/apache2/htdocs/index.html
コンテナの実行時ではなく、コンテナの build 時にのみ使う環境変数が「args:」で指定可能。
docker-compoes build時に --build-argを指定する方法と、
Composeファイルの中で「args:」を指定する方法がある。
オーケストレーションと
Swarm mode
Orchestration
104
Cloud Native 参照アーキテクチャ
Networking
Provisioning
Runtime
Orchestration & Management
Application Definition / Development
Compute
Storage
マイクロサービス・パターン
分散オーケストレーションと管理
コンテナ化
インフラ
※ CNCFプロジェクトが定義する範囲外
【参考】 https://github.com/cncf/presentations/blob/master/2016-software-circus/what-is-cloud-native/what-is-cloud-native.pdf
105
reference architecture
巷で話題のKubernetesとDocker(containerd)の関係性がこちら。
106
( ( )
Scheduling Cluster Management
• Marathon, chronos
• Docker swarm
• Deis
• fleet
• Apache Mesos
• DCOS (Mesosphere)
Orchestration
複数のホスト・システム上を横
断するアプリケーションをス
ケール(拡大・縮小)できる機能
※コンテナに依存しない
• Kubernetes
• Docker Engine
(swarm mode)
+ Docker Compose
• Rancher
• Nomad
設定ファイルをベースに
サービスを定義・維持
計算資源の抽象化
「オーケストレーション」の領域は、KubernetesとDocker Engineの「swarm mode」が該当。
従来のオーケストレーション
107
クラスタ
一方通行
従来はクラスタを構成するノードに対して、一方的なリソース要求が一般的。
【参考】 https://www.slideshare.net/Docker/container-orchestration-from-theory-to-practice/7
宣言型サービス・モデルのオーケストレーション
108
Declarative service model
OD クラスタ
Δ S
D = 期待状態
O = オーケストレータ
S = 状態
Δ = 状態から期待状態への収束
フィードバック
⚫ レプリカ作成
⚫ グローバル・サービス
並列
遅延
変更可能
【参考】 https://www.slideshare.net/Docker/container-orchestration-from-theory-to-practice/7
KubernetesやDocker swarm modeでは、定義した「あるべき状態」を自動的に維持する仕組み。
standalone swarm
Docker Swarm vs Docker Swarm mode
109
SwarmKit
Docker
Engine
Docker
Engine
Swarm
マネージャ
Swarm
エージェント
Swarm
エージェント
KVS リソース・プール
管
理
Docker
Host
Docker
Host
Swarm(クラスタ)
Docker
Engine
Docker
Engine
Docker
Engine
swarm モード
Docker
Host
Docker
Host
Docker
Host
Docker 1.12からクラスタ管理機能を内蔵管理用マネージャ・エージェントや KVS が別途必要
「swarm mode」は、昔からある「Docker Swarm」(スタンドアロン)とは別モノ。
Swarm mode の構成要素
110
manager
node
worker
node
worker
node
swarm モード
docker service や
docker stack 等
クラスタとサービスの
管理コマンドを受け付け
タスク
(コンテナ)
タスク
(コンテナ)
サービス
docker service や docker stack 系コマンドの実行は、 kubectl と互換性を持つ
※ Docker for Mac で Experimental かつ Kubernetes 有効化の場合
Docker Engine Docker Engine Docker Engine
swarm
SwarmKit SwarmKit SwarmKit
docker CLI
- ネットワーク
Ingress Network
Routing Mesh
Docker
Compose
YAML
サービス定義
(option)
docker コマンドを使い、
分散環境でも簡単に
アプリをスケールできる
現在は、Dockerが入っていれば「docker swarm init」の実行で、直ちに有効化できる。
swarm mode のネットワーク機能
111
Multi Host Networking
Worker
node
Worker
node
Worker
node
overlay
network
Ingress
network
コンテナ
PublishPort
Routing
Mesh
80 443 80 443 80 443
負荷分散
swarmモードで便利なのは、複数のホスト間で共通ネットワーク(ingress)を自動生成。
どのノードにアクセスがあっても、コンテナが動作しているノードに自動ルーティング。
しかも、Docker Composeファイルがあれば、それを使ったデプロイも可能。
サービス・ディスカバリ
(動的な名前解決)
クラスタ初期化と
サービス実行
swarm mode
112
Dockerのセットアップ
113
$ curl https://get.docker.com | head
$ curl -fsSL get.docker.com -o get-docker.sh
# sh ./get.docker.com
# systemctl enable docker
# systemctl start docker
※systemd系の場合
※リポジトリの自動セットアップ
※コマンドの確認
Linuxで検証用途に手軽な方法
swarm modeを使うには、まず Docker Engine のセットアップが必要。準備はこれだけ。
クラスタ初期化と join 手順
114
manager
ノード
$ docker swarm init
Swarm initialized: current node (hhzcdnj2r43ywjcmjcwbgvwa7) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapub….. <IP_ADDR>:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
worker
ノード
$ docker swarm join ¥
--token SWMTKN-1-0w2m8k41xh1tbapub….. <IP_ADDR>:2377
managerのIPアドレスとポート
This node joined a swarm as a worker.
それから「docker swarm init」でクラスタを初期化。ノードの追加は「join」で。
マネージャに対してのみ docker stack コマンドで操作可能。
ここに出てくる文字列を
ワーカノードで実行
クラスタ join 時のトークン確認
115
manager $ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapubwl7sd7j7x….. <IP_ADDR>:2377
manager $ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapubwl7sd0m0….. <IP_ADDR>:2377
ノード追加時のコマンドを忘れてしまった場合は、このコマンドで確認。
クラスタ状態確認
116
manager $ docker node ls
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
hhzcdnj2r43ywjcmjcwbgvwa7 * node-01 Ready Active Leader
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
hhzcdnj2r43ywjcmjcwbgvwa7 * node-01 Ready Active Leader
znmguxtqwywhja9chkkaa6a7y node-02 Ready Active
2mgqqmgt0dlv9zc932nz9rkat node-03 Ready Active
あとは、ノードの状態を確認したり、
Compose file でサービス作成・操作
117
manager $ vi docker-compose.yml
version: '3'
services:
web:
image: zembutsu/docker-sample-nginx
deploy:
replicas: 3
resources:
limits:
cpus: "0.1"
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
internal:
aliases:
- web
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
internal:
$ docker stack deploy -c ./docker-compose.yml
demo
Creating network demo_internal
Creating service demo_web
$ docker stack ls
$ docker stack ps demo
$ docker service scale demo_web=5
$ docker service stop demo
$ docker stack rm demo
サービスのデプロイも行えるようになる。
詳しい手順は、チュートリアルやドキュメントを
118
⚫ Swarm mode overview | Docker Documentation
https://docs.docker.com/engine/swarm/
⚫ Get Started, Part 3: Services | Docker Documentation
https://docs.docker.com/get-started/part3/
Docker for Mac/Windows では、swarm modeがすぐにご利用できます。
また、今後の方向性としては Compose on Kubernetes [1]との連携により
Kubernetes クラスタ上で Compose ファイルを使ってデプロイする方法もあり、
引き続き Compose 周辺プロジェクトの動きには注目です。
[1] https://github.com/docker/compose-on-kubernetes
まとめ
119
Dockerとは?
120
Why Docker?
1
Dockerコンテナは
実行に必要な全て
をパッケージして、
簡単に動かせる
2
Dockerイメージは
複数のイメージ・レイ
ヤとメタ情報の積み
重なり
3
コンテナのプロセス
はデフォルトで
isolate(隔離・分離)
された状態
⚫ イメージ・レイヤ(image layer)は
読み込み専用
⚫ 親子関係がある
⚫ イメージに対する変更はCopy on
Write(CoW)処理が走る
⚫ コンテナ実行にはイメージが必要
で、Docker Hubから得られる
⚫ コンテナ実行時のみ、読み書きが
可能なレイヤを追加
⚫ namespace(名前空間)でプロセ
ス空間やファイルシステムやネッ
トワーク等を分ける技術と、
cgroups(コントロール・グループ)
でリソースの利用上限を指定
⚫ コンテナはポートをデフォルトで開
かない
⚫ ネットワークはブリッジ、ホスト、
noneの3種類
⚫ ボリュームはコンテナ間でファイル
システムを共有できる。名前付き
(named)とホスト・ボリューム
⚫ アプリケーションを簡単に開発し、
移動し、実行するためのプログラム
とプラットフォームを提供するのが
Docker
⚫ クライアント・サーバ型
https://docker.com
プロセスを簡単にコンテナ化(isolate)し、
簡単かつ素早く開発・移動・実行できるプラットフォームが Docker
Containerization
「プロセス・ファイルシステム・ネットワーク・等々」に対して
Namespace・Cgroup
Build Ship Run
Docker Composeとは?
121
What is Docker Compose?
1
Composeは
アプリケーションの
サービスをファイル
で定義する
2
Dockerコマンドと
高い親和性がある
ため、学習コストが
比較的に低い
3
Swarm モードに
サービスをデプロイ
できるオーケストレー
ション機能
⚫ docker-compose CLI のコマン
体系は docker に準拠
⚫ 例:「docker run -d」は
「docker-compose up -d」
⚫ Docker swarm モードを使えば、
サービス状態を定義できるので
常に期待状態を維持できる
◼ docker stack deploy
⚫ Ingress ネットワークの活用
⚫ Compose ファイル (YAML形式)
で Docker コンテナのサービスを
定義できるため、
再利用性が高い
◼ コンテナの状態
◼ イメージ
◼ ネットワーク
◼ ボリューム
◼ メタ情報
https://github.com/docker/compose
複数のコンテナで構成するアプリケーションを
定義と実行するためのツール
multi-container applications
define and run
122
Q&A
• 何か気になるところはありますか?
• https://slideshare.net/zembutsu
• Dockerドキュメント日本語訳
http://docs.docker.jp
• Docker Composeドキュメント日本語訳
http://docs.docker.jp/compose/
• 公式ドキュメント
https://docs.docker.com
123

More Related Content

What's hot

Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜Preferred Networks
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxShota Shinogi
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Masahito Zembutsu
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうRyuji Tsutsui
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
AWSではじめるMLOps
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOpsMariOhbuchi
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 

What's hot (20)

Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
AWSではじめるMLOps
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOps
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 

Similar to Docker Compose 徹底解説

CAMPHOR- day 2020 - Docker 超入門
CAMPHOR- day 2020 - Docker 超入門CAMPHOR- day 2020 - Docker 超入門
CAMPHOR- day 2020 - Docker 超入門KokiMakita1
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 
Newcomer2020 Docker研修
Newcomer2020 Docker研修Newcomer2020 Docker研修
Newcomer2020 Docker研修Suguru Yazawa
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Yuichi Ito
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker雄哉 吉田
 
[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
 
鯨物語~Dockerコンテナとオーケストレーションの理解
鯨物語~Dockerコンテナとオーケストレーションの理解鯨物語~Dockerコンテナとオーケストレーションの理解
鯨物語~Dockerコンテナとオーケストレーションの理解Masahito Zembutsu
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Masahito Zembutsu
 
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーションDocker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーションMasahito Zembutsu
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西Masahide Yamamoto
 
[CNDT] 最近のDockerの新機能
[CNDT] 最近のDockerの新機能[CNDT] 最近のDockerの新機能
[CNDT] 最近のDockerの新機能Akihiro Suda
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例maebashi
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Masahito Zembutsu
 
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Masahito Zembutsu
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座Masahito Zembutsu
 
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
そろそろ知っておきたい!!コンテナ技術とDockerのキホンそろそろ知っておきたい!!コンテナ技術とDockerのキホン
そろそろ知っておきたい!!コンテナ技術と DockerのキホンNaoki Nagazumi
 
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くLinuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くTetsuyuki Kobayashi
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Etsuji Nakai
 

Similar to Docker Compose 徹底解説 (20)

CAMPHOR- day 2020 - Docker 超入門
CAMPHOR- day 2020 - Docker 超入門CAMPHOR- day 2020 - Docker 超入門
CAMPHOR- day 2020 - Docker 超入門
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
Newcomer2020 Docker研修
Newcomer2020 Docker研修Newcomer2020 Docker研修
Newcomer2020 Docker研修
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
 
[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)
 
真Drone入門
真Drone入門真Drone入門
真Drone入門
 
鯨物語~Dockerコンテナとオーケストレーションの理解
鯨物語~Dockerコンテナとオーケストレーションの理解鯨物語~Dockerコンテナとオーケストレーションの理解
鯨物語~Dockerコンテナとオーケストレーションの理解
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーションDocker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
[CNDT] 最近のDockerの新機能
[CNDT] 最近のDockerの新機能[CNDT] 最近のDockerの新機能
[CNDT] 最近のDockerの新機能
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
 
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
 
Bsd suki
Bsd sukiBsd suki
Bsd suki
 
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
そろそろ知っておきたい!!コンテナ技術とDockerのキホンそろそろ知っておきたい!!コンテナ技術とDockerのキホン
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
 
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くLinuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書く
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会
 

More from 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
 
CNCFアップデート情報~2018年のCNCFを振り返る
CNCFアップデート情報~2018年のCNCFを振り返るCNCFアップデート情報~2018年のCNCFを振り返る
CNCFアップデート情報~2018年のCNCFを振り返るMasahito Zembutsu
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Masahito Zembutsu
 
コンテナ導入概要資料2018
コンテナ導入概要資料2018コンテナ導入概要資料2018
コンテナ導入概要資料2018Masahito Zembutsu
 

More from 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
 
CNCFアップデート情報~2018年のCNCFを振り返る
CNCFアップデート情報~2018年のCNCFを振り返るCNCFアップデート情報~2018年のCNCFを振り返る
CNCFアップデート情報~2018年のCNCFを振り返る
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
 
コンテナ導入概要資料2018
コンテナ導入概要資料2018コンテナ導入概要資料2018
コンテナ導入概要資料2018
 

Docker Compose 徹底解説