Skip to main content
Docker入門-基礎編
い ま か ら 始 め る D o c k e r 管 理 v 2 . 0 0
JAWS-UG コンテナ支部 Docker 入門 #2
2015年10月30日(金)
@zembutsu
Technology Evangelist; Creationline, Inc.
Introduction to docker, basic management and operations
背景画像CREDIT:スフィア / PIXTA(ピクスタ)
2
本スライドで得られる知識
Docker入門-基礎編 いまから始めるDocker
‣ Docker概要と環境構築
なぜ Docker なのか? 速さと利便性。そして、Docker はコンテナではなくプラットフォーム。
‣ Dockerの基本操作コマンドの理解
コンテナのイメージ管理、起動、情報取得、ログ参照、Dockerfile、ボリューム操作
‣ Dockerとコンテナを取り巻く状況
DockerCon 2015 前後、Dockerのオーケストレーション Docker Machine, Swarm, Compose
This slide is an introduction of the basic concept and command of Docker. Because the main purpose uses Docker as a
tool. This is a Japanese document for community of the JAWS-UG Container Branch, in Tokyo on Oct 30.
Are you interested in this English version? Please comment me or mention @zembutsu . Thank you.
これからDockerを知る方のため
コンテナ概要から、環境構築、
ツールを使ったコンテナの操作や
管理方法を整理したものです。
2015年秋現在の状況にあわせ、
内容を大幅に改訂しました。
3
重要なポイント
Docker入門-基礎編 いまから始めるDocker
‣ Dockerコンテナはプロセスレベルの隔離技術
Control Groups(cgroups) と Namespaces という Linux カーネル機能
Docker イメージ(ファイルシステム、各種設定等)を使って、Docker コンテナを起動する
‣ Dockerはクライアント・サーバ型
Docker デーモンに対して、クライアントからアクセスする
‣ 複数の環境を管理するオーケストレーション
コンテナを扱う環境を、より簡単にする、Docker Machine、 Docker Swarm、 Docker Compose
今回は特に、そもそもコンテナや
Dockerとは何だっけ?との説明を
追加しています。
4
今日の内容
Docker入門-基礎編 いまから始めるDocker
‣ 1. コンテナとは何か? なぜDockerなのか?
‣ 2. Docker概要と環境構築
‣ 3. 基本操作コマンドの理解
‣ 4. Dockerのオーケストレーション
‣ 5. Amazon ECS (EC2 Container Service)
JAWS-UG コンテナ支部による
Docker入門 #2 の発表資料。
10月30日(金)にドリコムさんの
会場をお借りして開催。
私・個人としては、基本的に、
無理にコンテナを導入したり
コンテナ環境に移行しようとし
ても、導入目的や目標が定まら
なければ・・・・
コンテナの残骸だけしか残され
ないことに…と思っています。
コンテナとは何か?
なぜDockerなのか?
1 ■□□□□□
Introduction – What is Docker?
 Docker登場前後
 Dockerは何を解決するのか
 コンテナを取り巻く業界動向
物理サーバ・ネットワーク環境の全盛時代
開 発 用 端 末
社 内 サ ー バ デ ー タ セ ン タ
かつてプログラムや
データを送るには
物理サーバ・ネットワーク環境の全盛時代
開 発 用 端 末
社 内 サ ー バ デ ー タ セ ン タ
ftp, rsync, scp
FTP等で別々の環境に
転送するのが大前提
環境の構築は大変
環境をデプロイするのも大変
壊れた後の復旧も大変
ですが、そもそも…
突然の死
サーバ障害があれば…
再構築の悪夢
復旧作業が大変でした
仮想化・クラウド時代
開 発 用 端 末
社 内 サ ー バ ク ラ ウ ド 環 境
VirtualBox VirtualBox VirtualBox
Virtual
Machine
Virtual
Machine
Virtual
Machine
Virtual
Machine
Virtual
Machine
新しい技術の登場で
仮想化・クラウド時代
開 発 用 端 末
社 内 サ ー バ ク ラ ウ ド 環 境
VirtualBox VirtualBox VirtualBox
Virtual
Machine
Virtual
Machine
Virtual
Machine
Virtual
Machine
Machine
Image
Virtual
Machine
Machine
Image
開 発 用 C I ス テ ー ジ ン グ 本 番
Virtual
Machine
Virtual
Machine
Virtual
Machine
構成管理ツール
(Chef, Puppet, Ansible, Itamae… etc.)
デプロイ支援ツール
(Capistrano, Vagrant, Packer,
Terraform, AWS CLI … etc.)
異なる環境をつなぐ
技術が拡がりました
インフラ別の環境構築は面倒
環境によってOSが違う
開発・リモートどちらも同じにしたい
そして新しい課題が
開発の各段階から運用に至る流れを
より効率的に!より速く!確実に!
Docker誕生
The future of Linux Containers - YouTube
https://www.youtube.com/watch?v=wW9CAH9nSLs
‣ 2013年3月13日
‣ PyCon US 2013
‣ Solomon Hyke 氏
Dockerが世の中に登場してから、まだ
3年も経っていません。初めての公開は
Pythonカンファレンスの、たった5分の
ライトニングトークでした。
The future of Linux Containers - YouTube
https://www.youtube.com/watch?v=wW9CAH9nSLs
‣ dotCloud
‣ どこにでも運ぶ
‣ プロセスの分離
"Software you can deliver from your
laptop to EC2,to BareMetal, giant
server, run the same way. Because
isolated with process level. And it's
has own file system"
発表したのはdotCoud社の創設者。皆は
ソフトをどこでも動かせるのを求めている
コンテナ化
それを実現するのは、コンテナ化という
プロセスを隔離・分離(isolate)する技術
Linux kernel
Control Groups
Namespaces
基盤となっているのは、Linuxカーネルに
搭載されている2つの機能
サーバ
OS のカーネル空間
ユーザ空間
OS …
通常の環境
通常のLinuxは、1つのOSの中に複数の
プロセスがいくつも稼働しています。
サーバ
OS のカーネル空間
Docker
Docker環境
ユーザ空間 ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
コンテナ
Dockerの場合は、Linuxカーネルの名前
空間を使って、プロセス毎にユーザ空間
を分離して、Cgroupsでリソースを設定。
このプロセス環境をコンテナと呼びます。
しかも、それぞれの環境はお互い分離し
ています。それぞれがファイルシステム
やホスト名・ドメイン名、ネットワーク、
UID・GIDを持ち、プロセス毎に独立して
ます。コンテナからホストは見えません。
chrootやfork・execに近いものです。
一方ホスト側からは、あくまでも普通に
プロセスが起動しているように見えます。
(例えるとマジックミラーのようなもの)
OS
サーバ
OS のカーネル空間
ユーザ空間
OS …
通常の環境
サーバ
OS のカーネル空間
Docker
Docker環境
ユーザ空間 ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
コンテナ
コンテナやLinuxカーネルの機能に関しては、
次のスライドがとても参考になります。
• Dockerを支える技術 ( @enakai00 さん )
http://www.slideshare.net/enakai/docker-34668707
• LinuxコンテナとLXC入門 (2015-09-13) ( @ten_forward さん )
https://speakerdeck.com/tenforward/1st-kistudy
The future of Linux Containers - YouTube
https://www.youtube.com/watch?v=wW9CAH9nSLs
‣ docker ps
‣ docker images
‣ docker run
さて、これらLinuxカーネルの技術を使い、
コンテナ環境を操作するのが「docker」
コマンド。デモで使われたのがプロセス
確認、イメージ一覧、"hello world"を
表示する、これら3つのコマンドでした。
なお、dotCloud社は後にDocker社に名
前を変え、事業主体をDockerに絞ります。
プラットフォーム
このようにDockerはコンテナを操作する
ためのツールであり、また、コンテナを
管理するためのプラットフォームの役割を
もっているものです。
サーバ・クライアント型
Docker Hub
オープンソース
コンテナ管理の仕組みだけでなく、共有
するためのGitHub風の環境。そして、
オープンな開発体制がDockerの特長。
サーバ
OS のカーネル空間
Docker
Docker サーバ
ユーザ空間 ユーザ空間
$ docker run -ti ubuntu /bin/bash
https://hub.docker.com/
Docker Hub (レジストリ)
Docker クライアント
DockerHubの役割について説明します。
これは「docker run」コマンドでコンテナ
を実行する時の流れです。「ubuntu」イ
メージを使い、「/bin/bash」プロセスを
実行しようとしています。
サーバ
OS のカーネル空間
Docker
Docker サーバ
ユーザ空間 ユーザ空間
$ docker run -ti ubuntu /bin/bash
https://hub.docker.com/
Docker Hub (レジストリ)
Docker クライアント
ubuntu:latest
?
しかし、ローカル環境に「ubuntu」の
Dockerイメージ(ファイルシステムや
各種設定が1ファイルになったもの)が
ローカルにありません。その場合自動で
Docker Hubからイメージを取得します。
サーバ
OS のカーネル空間
Docker
Docker サーバ
ユーザ空間 ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
コンテナ
$ docker run -ti ubuntu /bin/bash
https://hub.docker.com/
Docker Hub (レジストリ)
Docker クライアント
ubuntu:latest
ubuntu:latest
イメージを取得したあと、「/bin/bash」
のプロセスをLinuxカーネル技術を使い
起動します。これこそがコンテナ化した
プロセスを起動した状態です。
zem@dev:~$ docker run -ti ubuntu /bin/bash
root@bdf6207621c7:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:11 ? 00:00:00 /bin/bash
root 16 1 0 01:11 ? 00:00:00 ps -ef
root@bdf6207621c7:/#
zem@dev:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 27987 1 0 Oct07 ? 00:13:58 /usr/bin/docker
root 22881 27987 0 21:11 pts/5 00:00:00 /bin/bash
PID TTY STAT TIME COMMAND
27987 ? Ssl 13:58 /usr/bin/docker daemon -H tcp://...
22881 pts/5 Ss+ 0:00 ¥_ /bin/bash
コ ン テ ナ 内 の P I D
コ ン テ ナ の プ ロ セ ス
そのため、コンテナ化された環境内では
bashのプロセスIDは「1」です。
しかしホスト側では、dockerのプロセス
ツリー下にあり、別のPIDを持っています。
開 発 用 端 末
社 内 サ ー バ ク ラ ウ ド 環 境
VirtualBox VirtualBox VirtualBox
Virtual
Machine
Virtual
Machine
Virtual
Machine
Virtual
Machine
Machine
Image
Virtual
Machine
Machine
Image
開 発 用 C I ス テ ー ジ ン グ 本 番
Virtual
Machine
Virtual
Machine
Virtual
Machine
構成管理ツール
(Chef, Puppet, Ansible, Itamae… etc.)
デプロイ支援ツール
(Capistrano, Vagrant, Packer,
Terraform, AWS CLI … etc.)
この技術があれば、先ほどの課題に対し
開 発 用 端 末
社 内 サ ー バ ク ラ ウ ド 環 境
VirtualBox VirtualBox VirtualBox
Virtual
Machine
Virtual
Machine
Virtual
Machine
Virtual
Machine
Machine
Image
Virtual
Machine
Machine
Image
開 発 用 C I ス テ ー ジ ン グ 本 番
Virtual
Machine
Virtual
Machine
Virtual
Machine
構成管理ツール
(Chef, Puppet, Ansible, Itamae… etc.)
デプロイ支援ツール
(Capistrano, Vagrant, Packer,
Terraform, AWS CLI … etc.)
D o k c e r H u b
autobiuld
webhook
Dockerを使うことにより、
開 発 用 端 末
社 内 サ ー バ ク ラ ウ ド 環 境
VirtualBox VirtualBox VirtualBox
Virtual
Machine
Virtual
Machine
Virtual
Machine
Virtual
Machine
Machine
Image
Virtual
Machine
Machine
Image
開 発 用 C I ス テ ー ジ ン グ 本 番
Virtual
Machine
Virtual
Machine
Virtual
Machine
構成管理ツール
(Chef, Puppet, Ansible, Itamae… etc.)
デプロイ支援ツール
(Capistrano, Vagrant, Packer,
Terraform, AWS CLI … etc.)
D o k c e r H u b
autobiuld
webhook
コンテナ化されたプロセス、
そしてDockerHubやDocker
イメージを活用することが、
問題解決につながるのでは?
これがDockerの役割です。
Z氏の場合
Munin 3.0.0b1
l o c a l P C
sudo apt-get update
sudo apt-get install git
git clone git://github.com/munin-monitoring/munin
cd munin
perl Build.PL
sudo apt-get install gcc pkg-config libssl-dev build-essential
sudo apt-get install expat libexpat1 libexpat1-dev libexpat1-dev
sudo apt-get install libxml2-dev libxml-libxml-perl libcairo-gobject-perl libglib2.0-dev libglib-perl
sudo apt-get install libcairo-perl libcairo-gobject-perl libgraphics-primitive-driver-cairo-perl
sudo apt-get install libcairo2-dev libpango1.0-dev
sudo cpan -i XML::Parser XML::Dumper
sudo cpan -i Alien::RRDtool
sudo cpan -i Test::Class Test::MockModule Test::MockObject Test::LongString Test::Differences
sudo cpan -i File::Slurp
sudo ./Build installdeps
./Build test
sudo ./Build installe
cd /usr/local/etc/munin/
sudo mkdir /usr/local/etc/munin/plugins
sudo cp munin.conf.sample munin.conf
sudo cp munin-node.conf.sample munin-node.conf
sudo munin-node-configure --shell --families=contrib,auto | sh -x
リ モ ー ト の サ ー バ
もう少し具体的な例をみていきます。
Muninは多くの依存関係がありますが
最新ベータはバイナリがありません。
なので、リモート環境上で使うには、
手動で環境の再構築が必要です。
Z氏の場合
Munin 3.0.0b1
l o c a l P C
sudo apt-get update
sudo apt-get install git
git clone git://github.com/munin-monitoring/munin
cd munin
perl Build.PL
sudo apt-get install gcc pkg-config libssl-dev build-essential
sudo apt-get install expat libexpat1 libexpat1-dev libexpat1-dev
sudo apt-get install libxml2-dev libxml-libxml-perl libcairo-gobject-perl libglib2.0-dev libglib-perl
sudo apt-get install libcairo-perl libcairo-gobject-perl libgraphics-primitive-driver-cairo-perl
sudo apt-get install libcairo2-dev libpango1.0-dev
sudo cpan -i XML::Parser XML::Dumper
sudo cpan -i Alien::RRDtool
sudo cpan -i Test::Class Test::MockModule Test::MockObject Test::LongString Test::Differences
sudo cpan -i File::Slurp
sudo ./Build installdeps
./Build test
sudo ./Build installe
cd /usr/local/etc/munin/
sudo mkdir /usr/local/etc/munin/plugins
sudo cp munin.conf.sample munin.conf
sudo cp munin-node.conf.sample munin-node.conf
sudo munin-node-configure --shell --families=contrib,auto | sh -x
zembutsu/muinin3
Dockerfile
docker commit
docker bulid
でも、もしそこにDockerを使っていれば、
Muninの環境をDockerイメージ化してお
くことができます。これを使い、
Z氏の場合
Munin 3.0.0b1
l o c a l P C
sudo apt-get update
sudo apt-get install git
git clone git://github.com/munin-monitoring/munin
cd munin
perl Build.PL
sudo apt-get install gcc pkg-config libssl-dev build-essential
sudo apt-get install expat libexpat1 libexpat1-dev libexpat1-dev
sudo apt-get install libxml2-dev libxml-libxml-perl libcairo-gobject-perl libglib2.0-dev libglib-perl
sudo apt-get install libcairo-perl libcairo-gobject-perl libgraphics-primitive-driver-cairo-perl
sudo apt-get install libcairo2-dev libpango1.0-dev
sudo cpan -i XML::Parser XML::Dumper
sudo cpan -i Alien::RRDtool
sudo cpan -i Test::Class Test::MockModule Test::MockObject Test::LongString Test::Differences
sudo cpan -i File::Slurp
sudo ./Build installdeps
./Build test
sudo ./Build installe
cd /usr/local/etc/munin/
sudo mkdir /usr/local/etc/munin/plugins
sudo cp munin.conf.sample munin.conf
sudo cp munin-node.conf.sample munin-node.conf
sudo munin-node-configure --shell --families=contrib,auto | sh -x
zembutsu/muinin3
Dockerfile
D o c k e r H u b
docker push
zembutsu/muinin3
docker commit
docker bulid
DockerHubにDockerイメージを
アップロードしておけば、
Z氏の場合
Munin 3.0.0b1
l o c a l P C
sudo apt-get update
sudo apt-get install git
git clone git://github.com/munin-monitoring/munin
cd munin
perl Build.PL
sudo apt-get install gcc pkg-config libssl-dev build-essential
sudo apt-get install expat libexpat1 libexpat1-dev libexpat1-dev
sudo apt-get install libxml2-dev libxml-libxml-perl libcairo-gobject-perl libglib2.0-dev libglib-perl
sudo apt-get install libcairo-perl libcairo-gobject-perl libgraphics-primitive-driver-cairo-perl
sudo apt-get install libcairo2-dev libpango1.0-dev
sudo cpan -i XML::Parser XML::Dumper
sudo cpan -i Alien::RRDtool
sudo cpan -i Test::Class Test::MockModule Test::MockObject Test::LongString Test::Differences
sudo cpan -i File::Slurp
sudo ./Build installdeps
./Build test
sudo ./Build installe
cd /usr/local/etc/munin/
sudo mkdir /usr/local/etc/munin/plugins
sudo cp munin.conf.sample munin.conf
sudo cp munin-node.conf.sample munin-node.conf
sudo munin-node-configure --shell --families=contrib,auto | sh -x
リ モ ー ト の サ ー バ
zembutsu/muinin3
Dockerfile
D o c k e r H u b
docker push
zembutsu/muinin3
docker pull
zembutsu/muinin3
docker run
docker commit
docker bulid
環境を再構築する必要なく、
すぐに環境を実行できるように。
l o c a l P C
l o c a l P C
l o c a l P C
G i t H u b D o c k e r H u b
B i t B u c k e t
git add …
git push origin master
autobuild
webhook
共同開発環境に向けて、DockerHubには
GitHubと連携してpushするとDocker
イメージを自動構築する機能があります。
l o c a l P C
l o c a l P C
l o c a l P C
G i t H u b D o c k e r H u b
B i t B u c k e t
git add …
git push origin master
autobuild
webhook
また、webhook
でフックさせるこ
とにより、いわゆ
るCIやCDツール
との連携も可能
になります。
l o c a l P C
l o c a l P C
l o c a l P C
G i t H u b D o c k e r H u b
B i t B u c k e t
git add …
git push origin master
autobuild
webhook
更に、様々なシステムと連携し、デプロイまでも。
その中心にいるのがDockerなのです。
Open Container Initiative Open Container Project (runC)
https://www.opencontainers.org/ http://runc.io/
コンテナ規格の標準化団体 標準ランタイム策定プロジェクト
コンテナをとりまく業界は、2014年当時
は混沌としていましたが、2015年には標
準化団体やプロジェクトが始まりました。
単にDocker社だけの取り組みというより
業界全体を大きく動かし始めています。
なんとなく、こんな雰囲気もありますが
そうではありません。
だが
ちょっと待って欲しい
48
なぜコンテナ化するのか?
‣ 開発から運用に至る流れを
より速く、正確に、効率的に行う手段の1つ
‣ Docker を入れたから、コンテナを使うから
速く・正確・効率的になる訳ではない
‣ 理想的な開発・運用にDockerが適している(かも)
例えば、私はVOCALOID大好きですが、
VOCALOIDのソフトを購入しただけで
だれもが自由に歌い手になれるわけでは
決してありません。それと同じです。
引用 https://www.docker.com/what-docker
そもそも仮想化・クラウドとは技術が異な
るので、単純にインフラとしての比較は
意味が無いのではないでしょうか。
50Introduction to Docker Basic Course
ここまでのまとめ
‣ Docker は Linux カーネルの機能で
プロセスレベルの「隔離」を行う=コンテナ化
Control Groups ( cgroups )
Namespaces
‣ Dockerは Linux コンテナを扱うプラットフォーム
‣ オープンソースで配布、オープンな開発体制
Docker概要と
環境構築
2 ■■□□□□
How to use Docker?
 Dockerアーキテクチャ
 Dockerイメージとコンテナ
 環境構築方法
サーバ
OS のカーネル空間
Docker サーバ
ユーザ空間 ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
コンテナ
https://hub.docker.com/
Docker Hub
(レジストリ)
Docker
クライアント
"docker" デーモン
TCP:2375,TCP:2376(TSL),UnixSocket
Ubuntu
レポジトリ
MySQL
レポジトリ
tag:latest
tag:14.04
…
tag:latest
tag:5.7
…docker run …
Dockerが「コンテナ」と
「イメージ」扱う流れを
詳しく見ていきます。
サーバ
OS のカーネル空間
Docker サーバ
ユ
ー
ザ
プ
ロ
セ
ス
ユ
ー
ザ
プ
ロ
セ
ス
ユーザ空間
ユ
ー
ザ
プ
ロ
セ
ス
ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
コンテナ
https://hub.docker.com/
Docker Hub
(レジストリ)
Docker
クライアント
"docker" デーモン
TCP:2375,TCP:2376(TSL),UnixSocket
Ubuntu
レポジトリ
MySQL
レポジトリ
tag:latest
tag:14.04
…
tag:latest
tag:5.7
…docker run …
Docker
コンテナ
そもそも「Dockerコンテナ」とは?
サーバ
OS のカーネル空間
Docker サーバ
ユーザ空間 ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
コンテナ
https://hub.docker.com/
Docker Hub
(レジストリ)
Docker
クライアント
"docker" デーモン
TCP:2375,TCP:2376(TSL),UnixSocket
Ubuntu
レポジトリ
MySQL
レポジトリ
tag:latest
tag:14.04
…
tag:latest
tag:5.7
…docker run …
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
DockerはLinuxカーネルの機能を使って
プロセスを隔離。この環境がコンテナ。
zem@dev:~$ docker run -ti ubuntu /bin/bash
root@bdf6207621c7:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:11 ? 00:00:00 /bin/bash
root 16 1 0 01:11 ? 00:00:00 ps -ef
root@bdf6207621c7:/#
コ ン テ ナ 内 の プ ロ セ ス
コンテナの中のプロセスは、自分自身が
PIDが1として存在して見えます。
root@bdf6207621c7:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@bdf6207621c7:/# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 20511356 12952564 6493836 67% /
none 20511356 12952564 6493836 67% /
tmpfs 250896 0 250896 0% /dev
shm 65536 0 65536 0% /dev/shm
tmpfs 250896 0 250896 0% /sys/fs/cgroup
/dev/disk/by-label/DOROOT 20511356 12952564 6493836 67% /etc/hosts
tmpfs 250896 0 250896 0% /proc/kcore
tmpfs 250896 0 250896 0% /proc/latency_stats
tmpfs 250896 0 250896 0% /proc/timer_stats
コ ン テ ナ 内 の フ ァ イ ル シ ス テ ム それだけでなく、コンテナ内だけで独自
のファイルシステムを持ちます。
root@bdf6207621c7:/# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
361: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
group default
link/ether 02:42:ac:11:00:25 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.37/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:25/64 scope link
valid_lft forever preferred_lft forever
root@bdf6207621c7:/# ip route
default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.37
コ ン テ ナ 内 の ネ ッ ト ワ ー ク
さらに、独自でネットワークを持ちます。
これはホスト側(eth0等)とは異なったイ
ンターフェースを持ちます。正確には
dokcer0というブリッジを通しています。
またルーティングにはiptablesも自動的
に使用しています。
root@bdf6207621c7:/# free
total used free shared buffers cached
Mem: 501792 485128 16664 460 127028 164560
-/+ buffers/cache: 193540 308252
Swap: 0 0 0
コ ン テ ナ 内 の メ モ リ
メモリのリソースは、ホスト側と共有なの
で(コンテナ内で上限は設定できます
が)、このようにホスト側のメモリ量が
そのまま表示されます。
root@bdf6207621c7:/# exit
zem@dev:~$ docker stop bdf6207621c7
コ ン テ ナ の 終 了
なお、コンテナは「プロセス」なので、
bashであれば"exit"で終了したらプロセ
ス終了=コンテナ終了です。
あるいはdocker stopやkillコマンドでも
停止可能です。
サーバ
OS のカーネル空間
Docker サーバ
ユ
ー
ザ
プ
ロ
セ
ス
ユ
ー
ザ
プ
ロ
セ
ス
ユーザ空間
ユ
ー
ザ
プ
ロ
セ
ス
ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
コンテナ
https://hub.docker.com/
Docker Hub
(レジストリ)
Docker
クライアント
"docker" デーモン
TCP:2375,TCP:2376(TSL),UnixSocket
Ubuntu
レポジトリ
MySQL
レポジトリ
tag:latest
tag:14.04
…
tag:latest
tag:5.7
…docker run …
Docker
イメージ
もう1つ重要な「Dockerイメージ」とは。
ベース・イメージ
(公式)
Ubuntu, CentOS等
イメージ層
コマンドごとに記録
Docker イメージの構造
読み込み専用
(Read Only)
Dockerイメージの実体は、単なる
バイナリ(Tar)です。中にはいくつ
もの「イメージ層」を持っています。
ベース・イメージ
(公式)
Ubuntu, CentOS等
イメージ層
コマンドごとに記録
Docker イメージの構造
読み込み専用
(Read Only)
一番下に「ベース・イメージ」という
Docker社が配布している各ディス
トリビューションのイメージがありま
す。ここは自分で独自に作ることも
できます。
ベース・イメージ
(公式)
Ubuntu, CentOS等
イメージ層
コマンドごとに記録
Docker イメージの構造
読み込み専用
(Read Only)
その上に、コマンドを実行する毎に
イメージ層が積み重なります。
ベース・イメージ
(公式)
Ubuntu, CentOS等
イメージ層
コマンドごとに記録
Docker イメージの構造
読み込み専用
(Read Only)
ベース・イメージ
(公式)
Ubuntu, CentOS等
イメージ層
コマンドごとに記録
Docker イメージの構造
読み込み専用
(Read Only)
ベース・イメージ
(公式)
Ubuntu, CentOS等
イメージ層
コマンドごとに記録
Docker イメージの構造
読み込み専用
(Read Only)
これらの集合体がDockerイメージ
です。この仕組みがあるので共通
部分をキャッシュとして使い高速に
イメージを構築したり、イメージ間
で共用するので容量を節約すると
いった利点があります。
ベース・イメージ
(公式)
Ubuntu, CentOS等
イメージ層
コマンドごとに記録
Docker イメージの構造
読み込み専用
(Read Only)
これらの集合体がDockerイメージ
です。この仕組みがあるので共通
部分をキャッシュとして使い高速に
イメージを構築したり、イメージ間
で共用するので容量を節約すると
いった利点があります。
Nginx イメージの構造
具体的なDockerイメージの例を見
てみましょう。各イメージは、それ
ぞれ「イメージID」をもって持って
います。先ほど見たように、実体
は複数のイメージの積み重ねです。
もちろん、それぞれのイメージ層
ごとにイメージIDが存在します。
Nginx イメージの構造
902b87aaaec9 3 months ago /bin/sh -c #(nop) ADD file:e1dd18493a216ecd0c 125.2 MB
一番下にあるのは、このファイルを
追加するというコマンドを実行した
イメージID 902b87aaaec9 という
ものです。
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
その上に…
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
いくつもの
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
イメージ層が
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
積み重なっています。上の方には
Nginxのデーモンとしてのオプション
や公開ポート等の情報もあります。
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>
これがNginxイメージの実体です。どのイメー
ジも、「docker history」コマンドでイメージ
作成の経緯を辿ることが可能です。
ベース・イメージ
(公式)
イメージ層
Docker コンテナを起動するとは
読み込み専用
(Read Only)
docker run <opts> <image:tag>
もう1つ、このイメージを
使いコンテナを起動する時
何が起こっているのか?
ベース・イメージ
(公式)
イメージ層
Docker コンテナを起動するとは
読み込み専用
(Read Only)
・新しいイメージ・レイヤの
自動的な割り当て
・隔離されたプロセスの起動
(コンテナ化の状態)
docker run <opts> <image:tag>
イメージを使ってコンテナを
実行すると、新しくイメージ
が割り当てられています。
だから、実行するたびに
環境が作り直されているよう
に見えますが、実際には
都度イメージが作り直されて
いるのです。
サーバ
OS のカーネル空間
Docker サーバ
ユ
ー
ザ
プ
ロ
セ
ス
ユ
ー
ザ
プ
ロ
セ
ス
ユーザ空間
ユ
ー
ザ
プ
ロ
セ
ス
ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
Dockerコンテナ
https://hub.docker.com/
Docker Hub
(レジストリ)
Docker
クライアント
"docker" デーモン
TCP:2375,TCP:2376(TSL),UnixSocket
Ubuntu
レポジトリ
MySQL
レポジトリ
tag:latest
tag:14.04
…
tag:latest
tag:5.7
…docker run …
Dockerイメージ
以上が「コンテナ」と
「イメージ」の関係です。
Docker動作環境の構築
ローカルで構築 リモートで構築 クラウドサービスの利用
Docker Machine
(旧boot2docker)
Docker社による
バイナリ・パッケージ
Amazon EC2
Container Service
(ECS)
IBM Bluemix
Microsoft Azure
Google Container
Engine
VirtualBox
Windows or Mac OSX Virtual or Physical Linux Machine
コミュニティによる
バイナリ・パッケージ
商用サポート版
ソースコードからビルド
+
Docker Toolbox
コンテナを動かすためには様々な
選択肢があります。
81Introduction to Docker Basic Course
‣ 様々なツールのパッケージ
• Docker Client
• Docker Machine
• Docker Compose
• Docker Kitematic
• VirtualBox
‣ 標準セットアップ手法
• かつての boot2docker に置き換わる位置付け
Docker Toolbox PC上の開発環境向けには、Docker
Toolbox(道具箱)というインス
トーラーが提供されています。
82Introduction to Docker Basic Course
‣ オーケストレーション強化の目的
• Docker Machine, Swarm, Compose それぞれ v0.4.0 リリース
• 以前のバージョンに比べ、お互いが連携
• まだベータ版の扱い
Docker Toolbox Dockerはサーバ・クライアント型の
システムですが、Docker単体で足
りない機能を、これらのツール群が
補っています。
Docker
コンテナ実行エンジン
Docker Machine
環境構築
Docker Swarm
クラスタ管理
Docker Compose
複数コンテナの管理と運用
83Introduction to Docker Basic Course
‣ 方法1:インストール用の汎用スクリプトを使用
wget -qO- https://get.docker.com/ | sh
service docker start
※ Ubuntu や Debian などは、こちらで Docker 社が提供する最新安定版をダウンロード可能
※ RHEL/CentOS の場合は、後述の個別パッケージをセットアップ
‣ 方法2:各ディストリビューション向けパッケージ
‣ 方法3:Docker Toolboxを使う
※ Windows と Mac OS X は、VirtualBox 上の仮想サーバを使用
Dockerのセットアップ方法
その時点の最新版が使えます。
ディストリビューションや
バージョンで、パッケージの
名前が異なる場合があります。
84Introduction to Docker Basic Course
‣ Linux
Linux Kernel の機能を使うので、
インストールスクリプトかパッケージをセットアップすることで
すぐに使えます。
‣ Windows・Mac OS
Docker Toolbox (VirtualBox)で Linux 環境を仮想マシン上に作り、
そこに Docker の動く環境をセットアップします。
クライアントは、PC上のコマンドライン(ターミナル)で動作します。
OSごとに違いが?
85Introduction to Docker Basic Course
‣ Windows or Mac OS 環境
Dokcer Toolbox をセットアップする
コマンドラインのクライアントを通して、
VirtualBox 仮想マシン上の docker に接続
‣ セットアップ
インストーラーを使う
• https://www.docker.com/docker-toolbox
– ”Download (Mac)” または "Download (Win)" をクリック
PC 環境で Docker を使うには?
86Introduction to Docker Basic Course
‣ 方法1:Docker版 v1.8(最新版)docker-engine
sudo yum update
yum install docker-engine
‣ 方法2: EPEL版 v1.6 パッケージ doker-io
curl -s https://get.docker.com | sudo sh
※参考 http://docs.docker.com/installation/centos/
RHEL/CentOS 7
$ cat >/etc/yum.repos.d/docker.repo <<-EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
87Introduction to Docker Basic Course
‣ 動作条件
RHEL/CentOS 6.5 以上かつ、Linux kernel 2.6.32-431 以上
※ Kernel のバグに起因する問題がある可能性のため、CentOS 7 の利用が推奨されています。
‣ 手順 ( EPEL 版 v1.5 )
sudo yum install epel-release
sudo yum install docker-io
sudo service docker start
※参考 http://docs.docker.com/installation/centos/
RHEL/CentOS 6.5
88Introduction to Docker Basic Course
‣ sudo docker version
‣ sudo docker run 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.
(Assuming it was not already locally available.)
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
For more examples and ideas, visit:
http://docs.docker.com/userguide/
「hello-world」コンテナは
テストで使われるものです。
89Introduction to Docker Basic Course
‣ sudo を使わず docker コマンドを使う設定
docker グループに対象ユーザを追加する
– $ sudo usermod –aG docker <ユーザ名>
※注意:docker クライアントは /var/run/docker.sock にアクセスします。docker.sock の所有者は root、
グループが docker のためです。以下の方法は、グループに所属するユーザが事実上の root 権限を持つため
セキュリティには十分配慮ください。
docker グループについて
90Introduction to Docker Basic Course
ここまでのまとめ
‣ Docker コンテナは Docker イメージを使う
• 新しいイメージ・レイヤの自動的な割り当て
• 隔離されたプロセスの起動
‣ Docker イメージは、イメージ層の積み重ね
• ベース・イメージは Docker 社が提供
• コンテナ起動時に、自動的に書き込み可能なイメージを追加
‣ セットアップ方法
• クライアント PC は Docker Toolbox ( Docker Machine )
• Linux サーバはスクリプトで、またはバイナリのセットアップが簡単
基本操作コマンドの
理解
3 ■■■□□□
How to management?
 イメージ操作
 コンテナ起動・停止
 主要なオプション設定
92
Docker基本コマンド
docker run
コンテナ実行
docker stop
コンテナ停止
docker commit
コンテナイメージ化
docker pull
イメージの取得
docker build
イメージの自動構築
docker attach
コンテナにアタッチ
docker logs
標準出力の表示
docker inspect
詳細情報の表示
docker rm
イメージ削除
docker images
イメージ一覧表示
diff | history
差分・履歴表示
コンテナのライフサイクルを通して、
主要なコマンドを覚えていきます。
サーバ
OS のカーネル空間
Docker サーバ
ユーザ空間 ユーザ空間
• Cgroups
• Namespaces
 mount
 UTS
 IPC
 PID
 Network
 User
Dockerコンテナ
https://hub.docker.com/
Docker Hub
(レジストリ)
Docker
クライアント
"docker" デーモン
TCP:2375,TCP:2376(TSL),UnixSocket
Ubuntu
レポジトリ
MySQL
レポジトリ
tag:latest
tag:14.04
…
tag:latest
tag:5.7
…docker run …
Dockerイメージ
まずはじめは、Docker
イメージ管理用の
コマンドからです。
docker pull
docker images
docker search
よく使うのが、この3つのコマンドです。
書式:docker pull <image名:タグ>
$ docker pull ubuntu:latest
$ docker pull zembutsu/serf
$ docker pull localhost:5000/localuser/foo:bar
コ ン テ ナ イ メ ー ジ の 取 得
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
zembutsu/perl_test latest 689c2a8b0b52 25 hours ago 187.9 MB
test1 latest f0b80600cf79 25 hours ago 187.9 MB
ubuntu 14.04 a5a467fddcb8 7 days ago 187.9 MB
rocketchat/rocket.chat latest d2a9f69c1426 2 weeks ago 409.9 MB
mongo latest 5e53867deb23 3 weeks ago 261.3 MB
mynginx latest 197fa3a74539 3 weeks ago 360.6 MB
ロ ー カ ル 上 の イ メ ー ジ 一 覧
書式:docker search <name>
コ ン テ ナ イ メ ー ジ の 検 索
96Introduction to Docker Basic Course
‣ https://hub.docker.com/
Docker Hub
# docker search wordpress
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
wordpress The WordPress rich content management syst... 358 [OK]
tutum/wordpress Wordpress Docker image - listens in port 8... 44 [OK]
tutum/wordpress-stackable Wordpress Docker image - listens in port 8... 23 [OK]
centurylink/wordpress Wordpress image with MySQL removed. 7
.
.
.
ブラウザ上で公式イメージを
含む様々な検索が可能です。
97Introduction to Docker Basic Course
‣ 公式レポジトリは Docker 社の認証・精査済み
‣ 様々なベンダから提供されている
NGINX, WordPress, Ubuntu, Red Hat, Redis, MySQL, Mariadb 等々
‣ 実際は、様々なイメージの合成
ベースイメージ:Linux の各ディストリビューション公式のもの
その上に、プログラミング言語、開発ツール、アプリケーション
公式レポジトリ
OS部分だけでなく、アプリや
ミドルウェア、データベース
など100の公式イメージや、
45,000件のイメージが公開・
配布されています。
98Introduction to Docker Basic Course
‣ 「docker images」の実行で、コンテナ一覧表示
コンテナ実行時には、ローカルにイメージがあるかどうか確認。無ければレポジトリからダウンロード。
‣ イメージは「レポジトリ名:タグ」の形式で管理
タグ省略時は latest (最新)が標準で適用
• Ubuntu 省略時は「ubuntu:latest」
• タグ「14.04」を指定するイメージは「ubuntu:14.04」
• CentOS 省略時は「centos:latest」
• タグ「6」を指定するイメージは「centos:6」
ローカルのイメージの表示
docker images
イメージ一覧表示
99Introduction to Docker Basic Course
‣ 「docker pull」でイメージを取得
docker pull は、ローカルにイメージを保存
docker run 時、ローカルに無ければ自動取得
‣ 例:
CentOS 最新版「docker pull centos」=「centos:7」
CentOS 6 を指定するには「docker pull centos:6」
イメージの取得
docker pull
イメージの取得
docker run
docker ps
docker attach
docker logs
次はコンテナの実行関連。