SlideShare uma empresa Scribd logo
1 de 63
Baixar para ler offline
Docker 入門 
コンテナ型仮想化技術の仕組みと使い方 
Cisco Systems, Japan TAC 
伊藤 裕一 (twitter: @yuichi110) 
第二回 ネットワークプログラマビリティ勉強会, Dec 16 2014
自己紹介 
• 伊藤裕一 (twitter: @yuichi110 ) 
• Docker : 仕事ではなく個人での利用 (VPSの数を減らすため) 
@interop2014 
• 仕事: Cisco Japan TAC でデータセンタスイッチ Nexus と SDN 関連技 
術の障害対応業務に従事。時々、趣味で得た知識で開発系やインフラ系 
の社内トレーニングを実施したり、データセンタやSDN関連のSEさん 
の外部講演の手伝いをしています。 
• 略歴: 学生時代はオーバーレイネットワークの研究に従事(特殊なマルチ 
パス通信を行うルータの開発など)。Cisco に入社後は昼はカスタマー 
サポート、夜は個人プログラマという生活。障害調査ツール等を作って 
一部公開してます。(https://supportforums.cisco.com/ja/document/ 
12270086)。2009年度のIPA未踏OB, Cisco CCIE, RedHat RHCE, 
Oracle Java Gold. 
• 趣味: プログラミング及び開発全般、登山と温泉。 
Docker 入門 
2
最近作ったサービス「ゆくも」の宣伝 
• 人口音声合成のサービスを2014年10月に開始。http://www.yukumo.net 
• 内部アーキテクチャの解説。激安のHA構築法をテーマにインフラを設計 
Docker 入門 
3 
https://supportforums.cisco.com/ja/blog/12344671 
WEBで人口音声の合成「ゆくも」アーキテクチャ全体図
今日のお題 
Docker 入門 
• 話すこと 
- そもそもDocker って何 ? 
- なぜ Network Engineer が Docker をやるか 
- 基本的な使い方や応用例 (ややネットワーク重視) 
! 
• 話さないこと (次があれば是非) 
- Docker とその足回りの仕組み 
- 実環境でのDocker の運用法 
4
Agenda 
Docker 入門 
• Docker の概要 
• 簡単な Docker の使い方 (デモ) 
• Docker のネットワークについて 
• 3階層のサービスの展開例 
• まとめ 
• 補足資料 
5
Docker ってそもそも何 ? 
• Linux で利用される仮想化技術の一つ 
• コンテナと呼ばれる仮想化技術を使う 
Docker 入門 
6
コンテナ型の仮想化 
• 完全仮想化(VMWareなど)とは異なり、OS の一部のみを仮想化 
• Linuxのkernelの機能でリソースを分離し、Docker はそれを管理 
• Kernel (with Docker) とコンテナの関係は JVM と Jar の関係に近い 
Docker 入門 
7
Infrastructure as a Code 
• サーバーに変更を加え続けると複雑になり壊れても戻しにくい 
• Docker はゲストへの変更を「イメージ」としてバージョン管理 
• イメージから作ったコンテナは複製や復旧を容易にできる 
Docker 入門 
8 
イメージ V1! 
(Code) 
イメージ V2! 
(Code) 
コンテナ化 
変更成功 
(保存したい) 
変更失敗 
(V2コンテナを作りなおせばOK) 
イメージ化 
イメージV1の! 
コンテナ1 
イメージV2の! 
コンテナ2
Docker の強み 
• 仮想化のオーバーヘッドが少ない 
Docker 入門 
- CPU 
- Memory 
- ストレージ 
• 「コード」でインフラの構成を管理 
- 状態の復元が簡単にできる 
- 他の環境にも簡単にデプロイできる 
- 同じ構成を自動で大量に作成できる 
Linpack(数値計算ライブラリ)を 
使った演算(CPU)性能測定結果 
An Updated Performance Comparison of 
Virtual Machines and Linux Containers より 
• 適度に環境を分離し、サーバーの複雑性を減らす 
9 
IBM Research Report
Network Engineer がなぜ Docker をやるか 
• コンテナが一般化したらネットワーク機器への接続を意識するこ 
とが必要になる(VM の vSwitchがそうであったように) 
• コンテナのオーケストレーションにはネットワークも必ず関わって 
くる。また、コンテナ型の仮想ネットワーク機器を触ることになる 
可能性がある (Ambassador パターンなど) 
• コンテナがネットワーク機器の内部で使われる可能性がある(最近 
の機器は Linux Kernel を使っていることが多い) 
• コンテナをツールとして利用することになる可能性がある 
Docker 入門 
10
Agenda 
Docker 入門 
• Docker の概要 
• 簡単な Docker の使い方 (デモ) 
• Docker のネットワークについて 
• 3階層のサービスの展開例 
• まとめ 
• 補足資料 
11
Docker を構成するコンポーネント 
• Docker Client : Server に対して命令を与える 
• Docker Daemon (Server) : コンテナを実際に動かす Worker 
• Docker Repository : イメージを保存、管理 
push 
image image 
Docker 入門 
12 
Client 
Daemon(本体) Repository 
container 
container 
image 
image 
CLIで命令 
pull 
githubに似ているLinux
Docker コンテナの操作と状態の遷移 
stopped 
shutdown 状態 
タスク終了 
(or stop) start 
Docker 入門 
13 
image running removed 
paused 
run 
rm 
pause unpause 
コンテナを破棄 
suspend 状態 
イメージ(雛形)から 
コンテナ(実体)を作成 
commit 
new! 
image 
コンテナをイメージ化
Docker のイメージの取り扱いまとめ 
docker commit docker push 
Docker Repository! 
(イメージ保管場所) 
Image! 
(雛形) 
Docker 入門14 
container! 
(実体) 
Docker file! 
(設計図) 
docker run 
docker pull 
docker build 
edit 
import 
破棄 
docker rmi
テスト環境 
• OS: CentOS 6.5 (Mac上の仮想マシン) 
• Docker: 1.1.2 (Client も CentOS) 
Docker 入門 
• レポジトリ: DockerHub 
15 
CentOSへのインストール手順 
! 
(1)EPELを登録しDockerをインストール 
# yum install -y epel-release 
# yum install -y docker-io 
! 
(2) Dockerの起動と登録 
# service docker start 
# chkconfig docker on 
補足)Ubuntuへのインストール手順 
! 
# apt-get update 
# apt-get -y install docker.io
# OK, Let’s start demo !! 
Docker 入門 
16 
(いくつかのページを飛ばしますが、資料の順に進めます)
docker コマンドの利用 
• Dockerコマンドの基本 : docker [オプション] コマンド [引数] 
Docker 入門 
17 
[root@localhost ~]# docker version 
Client version: 1.1.2 
Client API version: 1.13 
Go version (client): go1.2.2 
Git commit (client): d84a070/1.1.2 
Server version: 1.1.2 
Server API version: 1.13 
Go version (server): go1.2.2 
Git commit (server): d84a070/1.1.2 
• コマンドの詳細は本家の CLI リファレンスを参照してください 
https://docs.docker.com/reference/commandline/cli/
リポジトリ(DockerHub)へのログイン(省略) 
• パプリックリポジトリであるDockerHub への登録が必要 
• プライベートなリポジトリの作成も可能 (割愛) 
Docker 入門 
18 
[root@localhost ~]# docker login 
Username: ######## 
Password: 
Email: ########@######## 
Login Succeeded 
!! 
[root@localhost ~]# docker info 
Containers: 19 
.. 
Kernel Version: 2.6.32-431.el6.x86_64 
Username: XXXXXXXX 
Registry: [https://index.docker.io/v1/]
イメージの検索 
• ベースとなるイメージは DockerHub から取得することが多い 
• イメージの検索 : docker search [オプション] キーワード 
[root@localhost ~]# docker search ubuntu 
NAME DESCRIPTION STARS OFFICIAL AUTOMATED 
ubuntu Official Ubuntu base image 994 [OK] 
dockerfile/ubuntu Trusted automated Ubuntu (http://www.ubunt... 34 [OK] 
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 25 [OK] 
clue/ttrss The Tiny Tiny RSS feed reader allows you t... 21 [OK] 
crashsystems/gitlab-docker A trusted, regularly updated build of GitL... 21 [OK] 
.. 
Docker 入門 
19 
イメージの名前 
公式: イメージ名のみ 
非公式: ユーザー名/イメージ名 
メジャー度合い 
公式イメージか否か
イメージの取得 
• リポジトリからの取得: docker pull [オプション] イメージ名 [:タグ] 
• pull しておかなくても run 時にダウンロードしてくる (ただし遅い) 
• ローカルレジストリのイメージの確認: docker images 
Docker 入門 
20 
[root@localhost ~]# docker pull ansible/ubuntu14.04-ansible 
Pulling repository ansible/ubuntu14.04-ansible 
745e437a93a5: Pulling dependent layers 
06b4dde722cc: Pulling dependent layers 
.. 
[root@localhost ~]# docker images 
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 
ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB 
ansible/ubuntu14.04-ansible 1.8 731ee0ca00c3 Less than a second ago 445.1 MB 
ansible/ubuntu14.04-ansible latest 34f599260e20 Less than a second ago 445.1 MB 
..
イメージの実行 
• docker run [オプション] イメージ名 実行するコマンド 
• 補足) CentOS上でUbuntuが動いているか念のために確認 
Docker 入門 
21 
[root@localhost ~]# docker run ubuntu:14.04 echo "hello docker" 
hello docker 
! 
[root@localhost ~]# docker run ubuntu:14.04 ping www.google.com 
PING www.google.com (74.125.235.243) 56(84) bytes of data. 
64 bytes from kix01s02-in-f19.1e100.net (74.125.235.243): icmp_seq=1 ttl=127 time=65.3 ms 
64 bytes from kix01s02-in-f19.1e100.net (74.125.235.243): icmp_seq=2 ttl=127 time=82.3 ms 
^C 
--- www.google.com ping statistics --- 
2 packets transmitted, 2 received, 0% packet loss, time 1002ms 
rtt min/avg/max/mdev = 65.388/73.876/82.365/8.492 ms 
[root@localhost ~]# cat /etc/issue 
CentOS release 6.5 (Final) 
Kernel r on an m 
! 
[root@localhost ~]# docker run ubuntu:14.04 cat /etc/issue 
Ubuntu 14.04.1 LTS n l
コンテナのシェルに入って操作(省略) 
• コンテナをシェルで操作 : docker run -ti ubuntu:14.04 /bin/bash 
Docker 入門 
22 
(1) コンテナのシェルに入り hello.txt を作成し、コンテナを抜ける 
! 
[root@localhost ~]# docker run -t -i ubuntu:14.04 /bin/bash 
root@604439e971e9:/# pwd 
/ 
root@604439e971e9:/# echo hello > hello.txt 
root@604439e971e9:/# ls 
bin boot dev etc hello.txt home lib lib64 .. 
root@604439e971e9:/# exit 
exit 
!! 
(2) 新しいコンテナを立ち上げて、hello.txt の存在を確認する -> 存在しない 
! 
[root@localhost ~]# docker run -ti ubuntu:14.04 /bin/bash 
root@cfa3e2757167:/# ls 
bin boot dev etc home lib lib64 .. 
root@cfa3e2757167:/# ※ 同一イメージでもコンテナが違えば別物
コマンドの help の確認方法(省略) 
• 引数が必要なコマンドを引数なしで呼ぶと help が出る 
• オプション -h を付けても確認ができる 
Docker 入門 
23 
[root@localhost ~]# docker search 
Usage: docker search TERM 
Search the Docker Hub for images 
! 
--automated=false Only show automated builds 
--no-trunc=false Don't truncate output 
-s, --stars=0 Only displays with at least x stars 
!!! 
[root@localhost ~]# docker run -h 
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 
Run a command in a new container 
! 
-a, --attach=[] Attach to stdin, stdout or stderr. 
-c, --cpu-shares=0 CPU shares (relative weight) 
--cidfile="" Write the container ID to the file 
--cpuset="" CPUs in which to allow execution (0-3, 0,1) 
-d, --detach=false Detached mode: Run container in the background, print new container id 
--dns=[] Set custom dns servers 
--dns-search=[] Set custom dns search domains 
-e, --env=[] Set environment variables 
..
コンテナの状態確認 
• コンテナの状態確認 : docker ps [オプション] 
• 状態確認だけでなくコンテナID を特定するのによく使う 
• デフォルトは停止中のコンテナは表示しない。-a オプションで表示 
• -q オプションを使うと ID のみを出力。スクリプトで便利 
[root@localhost ~]# docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
b9ecf98b6fcc ubuntu:14.04 /bin/bash 10 hours ago Up 10 hours db 
Docker 入門 
24 
!! 
[root@localhost ~]# docker ps -a 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
3b129749222b centos:centos6 /bin/bash 35 seconds ago Exited (0) 10 seconds ago test 
b9ecf98b6fcc ubuntu:14.04 /bin/bash 10 hours ago Up 10 hours db 
!! 
[root@localhost ~]# docker ps -q 
b9ecf98b6fcc
コンテナをデーモン化(省略) 
• コンテナをデーモン化: docker run -d イメージ コマンド 
• デーモン化されたコンテナの標準出力は抑制される 
Docker 入門 
25 
[root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; 
sleep 1; done" 
7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 
• 標準出力を確認 : docker logs コンテナID 
[root@localhost ~]# docker logs 7cc259672c 
hello world 
hello world 
.. 
• デーモンを前に持ってくる 
[root@localhost ~]# docker attach 7cc259672c 
hello world 
hello world 
.. 
コンテナIDが返される 
※ ポートが開く場合はコマンドを 
指定しなくてもデーモン化可能
コンテナのsuspendと再開(省略) 
• pause はコンテナを一時停止する。いわゆる suspend 状態 
• unpause で一時停止解除。コンテナ自体はpauseを認知しない 
Docker 入門 
26 
[root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 
7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 
[root@localhost ~]# docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes insane_bartik 
!! 
[root@localhost ~]# docker pause 7cc259672c00 
7cc259672c00 
[root@localhost ~]# docker ps 
CONTAINER ID  IMAGE COMMAND CREATED STATUS PORTS NAMES 
7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes (Paused) insane_bartik 
!! 
[root@localhost ~]# docker unpause 7cc259672c00 
7cc259672c00 
[root@localhost ~]# docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 13 minutes ago Up 13 minutes insane_bartik
コンテナの停止と再開 
• stop はコンテナを shutdown する。kill も同じだが少し乱暴 
• start すると再び同じコンテナを立ち上げる。状態は継続している 
Docker 入門 
27 
[root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 
7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 
[root@localhost ~]# docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes insane_bartik 
!! 
[root@localhost ~]# docker stop 7cc259672c00 
7cc259672c00 
[root@localhost ~]# docker ps -a | grep 7cc259672c00 
7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 27 minutes ago Exited (-1) About a minute ago insane_bartik 
!! 
[root@localhost ~]# docker start 7cc259672c00 
7cc259672c00 
[root@localhost ~]# docker ps 
CONTAINER ID MAGE COMMAND CREATED STATUS PORTS NAMES 
7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 27 minutes ago Up 4 seconds insane_bartik 
• 補足) 全てのコンテナを停止。(pauseも同じ要領でできる) 
[root@localhost ~]# docker stop `docker ps --no-trunc -q`
コンテナの設定(json)を確認(省略) 
• docker inspect コンテナID 
• docker inspect -f “フォーマット条件” コンテナID 
Docker 入門 
28 
[root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 
e5b758beabad9d1a98f3fd21c6384df223d1abb44502e7cb4e698b52fe4a6a0a 
! 
[root@localhost ~]# docker inspect e5b758beabad 
[{ 
"Args": [ 
"-c", 
"while true; do echo hello world; sleep 1; done" 
.. 
"Pid": 18349, 
"Running": true, 
"StartedAt": "2014-11-23T23:50:39.732187978Z" 
}, 
"Volumes": {}, 
"VolumesRW": {} 
} 
] 
!! 
[root@localhost ~]# docker inspect -f '{{ .NetworkSettings.IPAddress }}' e5b758beabad 
172.17.0.28 
!! 
[root@localhost ~]# docker inspect -f '{{ .NetworkSettings }}' e5b758beabad 
map[Bridge:docker0 Gateway:172.17.42.1 IPAddress:172.17.0.28 IPPrefixLen:16 PortMapping:<nil> Ports:map[]]
コンテナから新イメージの作成 
• コンテナへの変更を永続化するためにはイメージ化が必要 
• イメージ化: docker commit コンテナID イメージ名 
• イメージ名は自分のユーザ名を付けないと push できなくなる 
[root@localhost ~]# docker run ubuntu:14.04 wget www.google.com 
2014/11/24 07:17:47 Error response from daemon: Cannot start container 
05c8eca1bc3d395162d028ad7c26c4b73875028d8891c43c1cca0a655e41ecfe: exec: "wget": executable file not found in $PATH 
! 
[root@localhost ~]# docker run -t -i ubuntu:14.04 /bin/bash 
root@6b8305bdeb74:/# apt-get -y update 
root@6b8305bdeb74:/# apt-get install -y wget 
root@6b8305bdeb74:/# exit 
exit 
! 
[root@localhost ~]# docker ps -a 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
6b8305bdeb74 ubuntu:14.04 /bin/bash 4 minutes ago Exited (0) 17 seconds ago furious_archimedes 
[root@localhost ~]# docker commit 6b8305bdeb74 yuichi110/ubuntu_wget 
b89d196b00504777278e83c0c44374f1243d59c16494f2112eb94054373b3e58 
Docker 入門 
29 
!! 
[root@localhost ~]# docker run yuichi110/ubuntu_wget wget www.google.com 
.. 
0K .......... ....... 181K=0.1s 
2014-11-23 22:13:40 (181 KB/s) - 'index.html' saved [17721]
コンテナの削除 
• 停止中のコンテナの削除: docker rm コンテナID(もしくは名前) 
• コンテナの強制削除: docker rm -f コンテナID 
• 削除されたコンテナは復元できない 
[root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 
7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 
Docker 入門 
30 
!! 
[root@localhost ~]# docker rm 7cc259672c00 
Error response from daemon: Impossible to remove a running container, please stop it first or use -f 
2014/11/24 06:35:24 Error: failed to remove one or more containers 
!! 
[root@localhost ~]# docker rm -f 7cc259672c00 
7cc259672c00 
[root@localhost ~]# docker ps -a | grep 7cc259672c00 
[root@localhost ~]# 
• 補足) 全てのコンテナを削除。必要に応じて -f を追加 
[root@localhost ~]# docker rm `docker ps --no-trunc -aq`
新イメージをリポジトリに push(省略) 
• 作成したイメージをリポジトリに登録 
• 他ユーザや自分の別のホストでも新イメージが利用可能になる 
Docker 入門 
31 
[root@localhost ~]# docker commit 6b8305bdeb74 yuichi110/ubuntu_wget 
b89d196b00504777278e83c0c44374f1243d59c16494f2112eb94054373b3e58 
[root@localhost ~]# docker images | grep yuichi 
yuichi110/ubuntu_wget latest b89d196b0050 10 minutes ago 219.5 MB 
!! 
[root@localhost ~]# docker push yuichi110/ubuntu_wget 
The push refers to a repository [yuichi110/ubuntu_wget] (len: 1) 
Sending image list 
Pushing repository yuichi110/ubuntu_wget (1 tags) 
511136ea3c5a: Image already pushed, skipping 
1de2bd7201a2: Image already pushed, skipping 
b70ad18cfc2a: Image already pushed, skipping 
3b39241dab7c: Image already pushed, skipping 
23f1840ed5a5: Image already pushed, skipping 
dfa12c637781: Image already pushed, skipping 
1357f421be38: Image already pushed, skipping 
b89d196b0050: Image successfully pushed 
Pushing tag for rev [b89d196b0050] on {https://cdn-registry-1.docker.io/v1/repositories/yuichi110/ubuntu_wget/ 
tags/latest} 
! 
[root@localhost ~]# docker search ubuntu | grep yuichi 
yuichi110/ubuntu_wget 0
Docker file から新イメージの作成 
• Docker file (ファイル名はDockerfile) にイメージ作成手順を書く 
• Docker file をビルドして実際にイメージを作成する 
• Dockerfile を使うことでコンテナのポータビリティが得られる 
Docker 入門 
32 
[root@localhost ~]# cat Dockerfile 
FROM ubuntu:14.04 
RUN apt-get update 
RUN apt-get install -y wget 
! 
[root@localhost ~]# docker build -t yuichi110/ubuntu_wget2 ./ 
Sending build context to Docker daemon 36.35 kB 
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04 
---> 1357f421be38 
Step 1 : RUN apt-get update 
---> Using cache 
.. 
Successfully built c28f0e25c627 
!! 
[root@localhost ~]# docker run yuichi110/ubuntu_wget2 wget www.google.com 
.. 
0K .......... ....... 135K=0.1s 
2014-11-23 23:08:36 (135 KB/s) - 'index.html' saved [17682]
イメージの削除(省略) 
• ローカルイメージの削除: docker rmi イメージ名 
• イメージに依存しているコンテナが存在していたら実施できない 
Docker 入門 
33 
[root@localhost ~]# docker images | grep ansible 
ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB 
ansible/ubuntu14.04-ansible 1.8 731ee0ca00c3 Less than a second ago 445.1 MB 
ansible/ubuntu14.04-ansible stable 745e437a93a5 Less than a second ago 287.7 MB 
ansible/ubuntu14.04-ansible 1.7 06b4dde722cc Less than a second ago 287.7 MB 
!! 
[root@localhost ~]# docker rmi ansible/ubuntu14.04-ansible:1.8 
Untagged: ansible/ubuntu14.04-ansible:1.8 
Deleted: 731ee0ca00c31909b0c9f13b641e904038eb16496702ab296c3fcddecd304422 
Deleted: 755662277f77a375dd85d4bdad1205a5a6e6310a839c478bc7e87cff809af3a9 
.. 
Deleted: 9d62b40139980fa70e88e34522459b5dd4d81b6806e32ced36440068edfea98a 
Deleted: b43510963a3adc28e20bebba4f7629ced7ff36efa97a0ce2dfb66d44492c3301 
!! 
[root@localhost ~]# docker images | grep ansible 
ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB 
ansible/ubuntu14.04-ansible stable 745e437a93a5 Less than a second ago 287.7 MB 
ansible/ubuntu14.04-ansible 1.7 06b4dde722cc Less than a second ago 287.7 MB
ホストのデータを参照(省略) 
• コンテナ内のデータはコンテナを消したら消滅 
• コンテナがホストのデータを参照すればデータは永続化される 
• オプション: docker run -v ホストのパス:コンテナのパス 
参照 
ホスト 
Docker 入門 
34 
実データ 
[root@localhost ~]# ls /root/ | grep datastore 
datastore 
[root@localhost ~]# ls /root/datastore/ 
directory hello.txt hello2.txt 
!! 
コンテナ 
[root@localhost ~]# docker run -ti -v /root/datastore/:/ds ubuntu:14.04 /bin/bash 
root@177cae414b7d:/# ls / | grep ds 
ds 
root@177cae414b7d:/# ls /ds 
directory hello.txt hello2.txt
demo completed!! 
! 
Docker 入門 
35 
## . 
## ## ## == 
## ## ## ## === 
/""""""""""""""""___/ === 
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ 
______ o __/ 
  __/ 
__________/
Agenda 
Docker 入門 
• Docker の概要 
• 簡単な Docker の使い方 (デモ) 
• Docker のネットワークについて 
• 3階層のサービスの展開例 
• まとめ 
• 補足資料 
36
Docker のネットワーク 
• IPマスカレード(IP,Port変換)を利用している。 
• docker 0 という bridge に veth 経由でコンテナの eth0 が接続 
• コンテナは利用されていない IP を与えられる (不定) 
[root@localhost ~]# ifconfig docker0 | head -2 
docker0 Link encap:Ethernet HWaddr 2E:69:D1:FB:67:91 
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 
! 
[root@localhost ~]# brctl show 
bridge name bridge id STP enabled interfaces 
docker0 8000.726a62967372 no vethe9f0 
Docker 入門 
ホスト 
37 
NIC 
コンテナ 
eth0 
veth 
コンテナ 
eth0 
veth 
docker0 (DGW) 
vethf267 
root@bea59cfb76ea:/# ifconfig eth0 | head -2 
eth0 Link encap:Ethernet HWaddr 06:eb:00:45:f7:43 
inet addr:172.17.0.40 Bcast:0.0.0.0 Mask:255.255.0.0 
root@bea59cfb76ea:/# route 
Kernel IP routing table 
Destination Gateway Genmask Flags Metric Ref Use Iface 
172.17.0.0 * 255.255.0.0 U 0 0 0 eth0 
default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0 
172.17.0.0/16 
NAPT 
コンテナ
Port Forwarding 
• NAT超え(外から中へのアクセス)にはポートフォワーディングを行う 
• ホストのポートXに来た通信はコンテナのポートYに転送(同一でもOK) 
• docker run -p PORT_X:PORT_Y イメージ名 (大文字 -P は自動割り当て) 
Docker 入門 
38 
コンテナ 
Host 
NIC 
eth0 
docker0 
Dest IP : NIC 
Dest Port : X 
Dest IP : eth0 
Dest Port : Y 
[root@localhost ~]# docker run -ti -p 10080:80 ubuntu:14.04 /bin/bash 
root@102a39277af9:/# service nginx start 
root@102a39277af9:/# nmap localhost 
... 
PORT STATE SERVICE 
80/tcp open http 
... 
コンテナは port 80 を使用 
外からは port 10080 でアクセス
Link によるコンテナ間の連携 
• 割り振られるIPは自動で決まるので、それを使ったコンテナ間の連携は難しい 
• コンテナ間を「 Link 」で接続することでアドレスを隠蔽できる 
• Link 元は Link 先のIP等を etc/hosts や環境変数(env)で参照可能。 
• 設定ファイル等でIPを書き込むのではなく、環境変数で相手を特定する 
コンテナの立ち上げと Link オプション 
Docker 入門 
39 
コンテナ! 
web 
コンテナ! 
db 
link 
root@cf283587658f:/# cat /etc/hosts 
172.17.0.63 cf283587658f 
127.0.0.1 localhost 
.. 
172.17.0.61 db 
root@cf283587658f:/opt/webapp# env 
HOSTNAME=cf283587658f 
DB_NAME=/web2/db 
TERM=xterm 
DB_PORT_5432_TCP_ADDR=172.17.0.61 
DB_PORT=tcp://172.17.0.61:5432 
DB_PORT_5432_TCP=tcp://172.17.0.61:5432 
.. 
Host 
/etc/hosts 
# env 
#docker run -d --name db2 training/postgres 
#docker run -ti -P --name web2 --link db2:db training/webapp /bin/bash 
--link name:alias 
コンテナ内でコンテナ”name”を! 
”alias”という名前で参照可能になる
Agenda 
Docker 入門 
• Docker の概要 
• 簡単な Docker の使い方 (デモ) 
• Docker のネットワークについて 
• 3階層のサービスの展開例 
• まとめ 
• 補足資料 
40
フルスクラッチで3階層モデルを構成 
• Linkでコンテナ間の連携をさせる 
• コンテナ1 (WEB) : nginx をロードバランサにする 
• コンテナ2 (APP) : Python をアプリケーションサーバとして動かす 
• コンテナ3 (DB) : データベースとしてMySQLを動かす 
Link Link 
Docker 入門 
41 
ロードバランサ 
NAPT 
10080 : 80 
App Server DB Server
作業手順の例 
1. DBコンテナの立ち上げと設定(MySQL) 
2. APP コンテナを DB コンテナにリンクして立ち上げて設定(Python) 
3. WEB コンテナを APP コンテナにリンクして立ち上げて設定(NGINX) 
4. ブラウザからホストにアクセスし、コンテナのレスポンスを確認 
5. コンテナを停止しイメージ化を行う 
6. イメージからコンテナをたちあげて動くか確認 
Docker 入門 
42
DB コンテナ (MySQL) 
[root@localhost ~]# docker run -ti --name db ubuntu:14.04 /bin/bash 
• MySQL の設定 (途中で設定するパスワードが聞かれ、password とした) 
• MySQL のデータベースとテーブルを作成 
Docker 入門 
外からアクセス可能に 
43 
• コンテナの立ち上げ 
root@b9ecf98b6fcc:/# apt-get update 
root@b9ecf98b6fcc:/# apt-get install mysql-server-5.6 
root@b9ecf98b6fcc:/# sed -i -e "s/bind-address/# bind-address/g" /etc/mysql/my.cnf 
root@b9ecf98b6fcc:/# service mysql start 
root@b9ecf98b6fcc:/# mysql -u root -p 
Enter password: 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; 
mysql> FLUSH PRIVILEGES; 
mysql> create database test_db; 
mysql> use test_db; 
mysql> create table test_table (id int, value varchar(100)); 
mysql> insert into test_table values (1, "mysql on db container"); 
mysql> quit 
root ユーザへの権限の設定 
事前にテーブルとエントリを作成
APP コンテナ (Python) 
[root@localhost ~]# docker run -ti --name app --link db:db ubuntu:14.04 /bin/bash 
Docker 入門 
フレームワークではなく 
http処理用のライブラリを利用 
44 
• コンテナの立ち上げ 
• Python の設定と起動 
root@0b6dc84addf4:/# apt-get update 
root@0b6dc84addf4:/# apt-get install python-mysqldb 
root@0b6dc84addf4:/# python2 app.py 
• Application Server のプログラムの作成 : app.py 
接続先DBをIPではなく 
ドメイン名”db”で指定 
(etc/hostsで解決される) 
http get がきたら DB から 
エントリを取得して、 
textデータを返すだけ
WEB コンテナ (NGINX) 
Docker 入門 
45 
root@522fbc2bba47:/# apt-get update 
root@522fbc2bba47:/# apt-get install nginx 
root@522fbc2bba47:/# rm /etc/nginx/sites-enabled/default 
root@522fbc2bba47:/# vi /etc/nginx/sites-enabled/default 
root@522fbc2bba47:/# service nginx restart 
server { 
listen 80 default_server; 
location / { 
proxy_pass http://app:80; 
} 
} 
• コンテナの立ち上げ 
[root@localhost ~]# docker run -ti -p 10080:80 --name web --link app:app ubuntu:14.04 /bin/bash 
• NGINX の設定 
• NGINX の編集したファイル内容: /etc/nginx/sites-enabled/default 
link機能で解決できるドメイン名 
app を設定ファイルに書き込み 
webサーバーではなくロードバランサーとして使う設定(クラスタは組んでいない)
イメージ化と動作確認 
• イメージ化 + 今までのコンテナの削除 
[root@localhost ~]# docker commit db 3tier/db 
[root@localhost ~]# docker commit app 3tier/app 
[root@localhost ~]# docker commit web 3tier/web 
[root@localhost ~]# docker rm `docker ps -aq` 
• コンテナの立ち上げ (サービス自動立ち上げにしてデーモン化でもOK) 
Docker 入門 
46 
[root@localhost ~]# docker run -ti --name db 3tier/db /bin/bash 
root@71cfbce43a8d:/# service mysql start 
[root@localhost ~]# docker run -ti --name app --link db:db 3tier/app /bin/bash 
root@06ef42352907:/# python2 app.py 
[root@localhost ~]# docker run -p 10080:80 -ti --name web --link app:app 3tier/web /bin/bash 
root@f1048cc4d64a:/# service nginx start 
• ブラウザでホストにアクセスして確認。成功 
DBコンテナに保存されているデータ 
(補足) 
linkのエイリアスを使えば 
同一構成の複数展開も可能 
--link app:app 
--link app2:app 
--link app3:app
補足) コンテナをサービス分離にのみ使用する例 
• プレゼンターの使い方 (図には若干の変更や実装中の部分が含まれます) 
• 各コンテナに1つのサービスを全ていれ、NGINXでドメインで振り分け 
Primary 
Host1 
(固定IP) 
DNS Secondary 
Docker 入門 
47 
localhost (docker) 
10080:80 
11080:80 
80 
VirtualHost Cluster 
Cache, Security 
localhost (docker) 
10080:80 
80 11080:80 
RR with HA 
Host2 
(固定IP) 
VirtualHost Cluster 
Cache, Security 
.. ..
Agenda 
Docker 入門 
• Docker の概要 
• 簡単な Docker の使い方 (デモ) 
• Docker のネットワークについて 
• 3階層のサービスの展開例 
• まとめ 
• 補足資料 
48
まとめ 
• Dockerのようなコンテナ型仮想化はリソース効率的に利用 
• 環境を適度に分離する目的に利用できる 
• 不変なイメージをコンテナ化して使う 
• イメージが不変であるため複製や移行、復旧が簡単 
• イメージから環境依存をどのようにして減らすかが重要 
Docker 入門 
49
Docker の将来 
• コンテナの業界標準になる可能性があるだけでなく、 
VMWare などの完全仮想化を食ってしまう可能性がある 
• 大規模環境ではKubernetes のようなオーケストレーショ 
ンツールで管理する必要性が高まる 
• クラウドのVM上で Docker を動かすとベンダへの依存性 
が減るかもしれない。(InterCloudの実現に便利) 
Docker 入門 
50
Thanks !! 
要望があれば実環境向けの Docker with Ansible(管理ツール) とかやりたいです。 
Docker 入門51
Agenda 
Docker 入門 
• Docker の概要 
• 簡単な Docker の使い方 (デモ) 
• Docker のネットワークについて 
• 3階層のサービスの展開例 
• まとめ 
• 補足資料 
52
Docker ベストプラクティス 
• コンテナはStateless な運用を目指す (ログ等も) 
• IPなどの環境に依存する設定をイメージから排する 
• 1機能(もしくは1サービス)1コンテナを意識する 
• Docker だけで全てを完結させず、CheffやAnsibleも利用 
• /bin/bash ではなく Docker file でイメージを作る 
Docker 入門 
53
Docker の弱み 
• Docker はホストとゲストが kernel を共有している 
- 異なる kernel を使うOSは仮想化できない 
- kernel レベルの機能は仮想化できない 
• 完全仮想化に比べて歴史が浅い 
- 提供される機能が多くない 
- オーケストレーションなどが難しい 
• ネットワーク、ストレージなどに融通を効かせにくい 
Docker 入門 
54
Docker に対する業界動向 (2014年12月現在) 
• Docker社: ホストまたぎのオーケストレーションに注力, API など 
• VMWare: 競合しつつも協業の未知を探している。幹部がDocker 社に移る。 
• Red Hat: RHEL などで Docker を提供。 
• Microsoft: 次期の Windows Server を Docker 対応させる 
• Amazon: Docker のコンテナ実行環境と管理サービスを提供 
• Google: コンテナ実行環境の提供。kubernetes の開発 
• IBM: bluemix 上でコンテナが使えるようになった 
• GUI: いくつかのプロジェクトが走っている 
• 個人コミッタ: マルチホストでDockerを使うためのツール開発がブーム 
Docker 入門 
55
補足) レイヤー化されたDocker のイメージファイル 
• イメージに差分を「積み重ねる」ことで新しいイメージを作る 
• Gitなどのように樹形図的に子イメージが増えていく 
• 子のイメージやコンテナは親のイメージのデータをReadOnlyで共有 
docker run 
apt-get install apache2 
apt-get install emacs 
公式 debian image 
コンテナを! 
たちあげ 
変更! 
イメージ化 
変更! 
イメージ化 
Docker 入門56
補足) /bin/bash を上手に使う 
• docker run,start で bin bash に入るのは便利 (良し悪しは別として) 
• bin/bash でコンテナとイメージに改変を加えていく作業を繰り返す 
• 複雑になってきたら Dockerfile でイメージを作り直す(リファクタリング) 
作業の区切りでイメージ化 
作業 
docker commit コンテナID 
Docker 入門 
57 
作業終了 
image running stopped 
/bin/bash に戻る 
/bin/bash に入る 
docker run -t -i イメージ名 /bin/bash 
docker start コンテナID! 
docker attach コンテナID 
Dockerfileで書き直す 
(リファクタリング)
補足) DNS によるコンテナ間の連携手法 
• 複雑な構成でコンテナ間接続を Link だけで実現するのは難しい 
• リンクでホスト跨ぎもできない (通常はオーケストレーションで) 
• 個人レベルなら簡易 DNS (dnsmasqなど) を使って管理できる? 
(1) DNS参照とコンテナ名の設定をして立ち上げ 
(2) コンテナ名から inspect して IP を取得 
address=/test.docker/172.17.0.53 
service dnsmasq restart 
Docker 入門 
58 
App! 
Server 
DB1! 
Primary 
DB2! 
Secondary 
DNS 
docker run -d -dns 172.17.42.1 -name web WEB_IMAGE 
docker run -d -dns 172.17.42.1 -name app APP_IMAGE 
docker run -d -dns 172.17.42.1 -name db DB_IMAGE 
docker0 (172.17.42.1) 
docker inspect -f '{{ .NetworkSettings.IPAddress }}' NAME 
IP_ADDRESS 
(3) コンテナ名と IP の組み合わせをDNS登録 
(4) コンテナ間の通信はドメイン・ネームで行う 
(動的に割り当てられるIPに非依存) 
App! 
Server 
リンク可 
双方向は 
リンク不可
補足) 簡易DNSであるDnsmasqの使い方 
• Dnsmasq は BIND より簡単に運用可能。スクリプトで制御しやすい 
• 登録するドメイン名は「コンテナ名.docker」としている (自由) 
/etc/dnsmasq.d/test 
/etc/dnsmasq.d/test2 
Docker 入門 
59 
listen-address=172.17.42.1 
interface=docker0 
conf-dir=/etc/dnsmasq.d 
address=/test.docker/172.17.0.53 
/etc/dnsmasq.conf 
/etc/dnsmasq.d 
address=/test2.docker/172.17.0.54 
# yum install dnsmasq 
# chkconfig dnsmasq on 
# service dnsmasq restart
補足) DNS方式の制御用スクリプト 
Docker 入門 
60 
web, app, db という標準的な3階層構成 
Web 
Server 
APP! 
Server 
DB! 
Server 
name: web! 
IP: X 
name: app! 
IP: Y 
name: db! 
IP: Z 
DNS 
to! 
app 
to! 
db 
docker0 (172.17.42.1)
補足) コンテナにNICを追加する 
• Docker 単独の機能では実現できないので Linux コマンドを使う 
• コンテナの環境依存性が高まるので利用には注意が必要 
• 私なら OVS を使った Ambassador パターンや Trunk を検討するかも 
コンテナ 
eth1 
veth veth veth 
NICとのマッピング 
Docker 入門 
61 
eth0 
docker0 (DGW) Linux bridge 
NIC1 
eth2 
OVS 
NIC2 NIC_N 
「Docker を支える技術」 
RedHat 中井さんによる日本語資料 
Slide Share にあります
補足) オーケストレーションによるネットワーク管理 
Docker 入門 
• fig 
• Ambassador パターン 
• etcd (zookeeper) 
• pipework 
62 
個人的な考え 
• コンテナ間の接続はイメージ内に直接書くべきではない 
• Docker file を使う 
• .bash_profile などを外出しして、それを編集とかどう ? 
• プログラミングの Actor モデルのパターンなどが流用可能 ?
Docker 入門63 
bye !!

Mais conteúdo relacionado

Mais procurados

Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
DockerクイックツアーEtsuji Nakai
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能Kohei Tokunaga
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門Masahito Zembutsu
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術Etsuji Nakai
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話Yuta Shimada
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Masahito Zembutsu
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケットTakaaki Hoyo
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Masahito Zembutsu
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Masahito Zembutsu
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能Kohei Tokunaga
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 

Mais procurados (20)

Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
Dockerクイックツアー
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケット
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 

Destaque

インフラエンジニアのためのRancherを使ったDocker運用入門
インフラエンジニアのためのRancherを使ったDocker運用入門インフラエンジニアのためのRancherを使ったDocker運用入門
インフラエンジニアのためのRancherを使ったDocker運用入門Masahito Zembutsu
 
DockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようDockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようmookjp
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかえむ ばーど
 
はじめてのdocker
はじめてのdockerはじめてのdocker
はじめてのdockerat grandpa
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Masahito Zembutsu
 
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudyJenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudyKazuhito Miura
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Etsuji Nakai
 
神奈川Ruby会議の会場係 だけが知る密かな危機の話
神奈川Ruby会議の会場係だけが知る密かな危機の話神奈川Ruby会議の会場係だけが知る密かな危機の話
神奈川Ruby会議の会場係 だけが知る密かな危機の話Naoki Nagazumi
 
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解するEtsuji Nakai
 
Kubernetesを触ってみた
Kubernetesを触ってみたKubernetesを触ってみた
Kubernetesを触ってみたKazuto Kusama
 
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...Alex Levenson
 
Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要Kazuyuki Mori
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Masahito Zembutsu
 
Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Emma Haruka Iwao
 
8a1#19[はじめてのdocker] 公開版
8a1#19[はじめてのdocker] 公開版8a1#19[はじめてのdocker] 公開版
8a1#19[はじめてのdocker] 公開版Kamon Nobuchika
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入Yu Nobuoka
 
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介Masahito Zembutsu
 
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Emma Haruka Iwao
 
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜Shuji Yamada
 

Destaque (20)

インフラエンジニアのためのRancherを使ったDocker運用入門
インフラエンジニアのためのRancherを使ったDocker運用入門インフラエンジニアのためのRancherを使ったDocker運用入門
インフラエンジニアのためのRancherを使ったDocker運用入門
 
DockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようDockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみよう
 
コンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのかコンテナ型仮想化とはなんだったのか
コンテナ型仮想化とはなんだったのか
 
はじめてのdocker
はじめてのdockerはじめてのdocker
はじめてのdocker
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
 
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudyJenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
神奈川Ruby会議の会場係 だけが知る密かな危機の話
神奈川Ruby会議の会場係だけが知る密かな危機の話神奈川Ruby会議の会場係だけが知る密かな危機の話
神奈川Ruby会議の会場係 だけが知る密かな危機の話
 
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
 
Kubernetesを触ってみた
Kubernetesを触ってみたKubernetesを触ってみた
Kubernetesを触ってみた
 
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
Hadoop Summit 2015: Performance Optimization at Scale, Lessons Learned at Twi...
 
Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月
 
8a1#19[はじめてのdocker] 公開版
8a1#19[はじめてのdocker] 公開版8a1#19[はじめてのdocker] 公開版
8a1#19[はじめてのdocker] 公開版
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
 
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
 
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
 

Semelhante a Docker入門: コンテナ型仮想化技術の仕組みと使い方

Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Masahito Zembutsu
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
DockerハンズオンKazuyuki Mori
 
Webアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオンWebアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオン虎の穴 開発室
 
ゆるふわなDockerの使い方
ゆるふわなDockerの使い方ゆるふわなDockerの使い方
ゆるふわなDockerの使い方Kento Aoyama
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念Masahito Zembutsu
 
Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519虎の穴 開発室
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門hiro nemu
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎Daisuke Hiraoka
 
今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOFVirtualTech Japan Inc.
 
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINARVirtualTech Japan Inc.
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西Masahide Yamamoto
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門Toru Miyahara
 
Newcomer2020 Docker研修
Newcomer2020 Docker研修Newcomer2020 Docker研修
Newcomer2020 Docker研修Suguru Yazawa
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例maebashi
 
Docker handson
Docker handsonDocker handson
Docker handsonkoda3
 
Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspecTsuyoshi Yamada
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Etsuji Nakai
 

Semelhante a Docker入門: コンテナ型仮想化技術の仕組みと使い方 (20)

Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
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社内勉強会Docker社内勉強会
Docker社内勉強会
 
Webアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオンWebアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオン
 
ゆるふわなDockerの使い方
ゆるふわなDockerの使い方ゆるふわなDockerの使い方
ゆるふわなDockerの使い方
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念
 
Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門
 
今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF
 
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門
 
Newcomer2020 Docker研修
Newcomer2020 Docker研修Newcomer2020 Docker研修
Newcomer2020 Docker研修
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例
 
Docker handson
Docker handsonDocker handson
Docker handson
 
Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspec
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会
 

Docker入門: コンテナ型仮想化技術の仕組みと使い方

  • 1. Docker 入門 コンテナ型仮想化技術の仕組みと使い方 Cisco Systems, Japan TAC 伊藤 裕一 (twitter: @yuichi110) 第二回 ネットワークプログラマビリティ勉強会, Dec 16 2014
  • 2. 自己紹介 • 伊藤裕一 (twitter: @yuichi110 ) • Docker : 仕事ではなく個人での利用 (VPSの数を減らすため) @interop2014 • 仕事: Cisco Japan TAC でデータセンタスイッチ Nexus と SDN 関連技 術の障害対応業務に従事。時々、趣味で得た知識で開発系やインフラ系 の社内トレーニングを実施したり、データセンタやSDN関連のSEさん の外部講演の手伝いをしています。 • 略歴: 学生時代はオーバーレイネットワークの研究に従事(特殊なマルチ パス通信を行うルータの開発など)。Cisco に入社後は昼はカスタマー サポート、夜は個人プログラマという生活。障害調査ツール等を作って 一部公開してます。(https://supportforums.cisco.com/ja/document/ 12270086)。2009年度のIPA未踏OB, Cisco CCIE, RedHat RHCE, Oracle Java Gold. • 趣味: プログラミング及び開発全般、登山と温泉。 Docker 入門 2
  • 3. 最近作ったサービス「ゆくも」の宣伝 • 人口音声合成のサービスを2014年10月に開始。http://www.yukumo.net • 内部アーキテクチャの解説。激安のHA構築法をテーマにインフラを設計 Docker 入門 3 https://supportforums.cisco.com/ja/blog/12344671 WEBで人口音声の合成「ゆくも」アーキテクチャ全体図
  • 4. 今日のお題 Docker 入門 • 話すこと - そもそもDocker って何 ? - なぜ Network Engineer が Docker をやるか - 基本的な使い方や応用例 (ややネットワーク重視) ! • 話さないこと (次があれば是非) - Docker とその足回りの仕組み - 実環境でのDocker の運用法 4
  • 5. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 5
  • 6. Docker ってそもそも何 ? • Linux で利用される仮想化技術の一つ • コンテナと呼ばれる仮想化技術を使う Docker 入門 6
  • 7. コンテナ型の仮想化 • 完全仮想化(VMWareなど)とは異なり、OS の一部のみを仮想化 • Linuxのkernelの機能でリソースを分離し、Docker はそれを管理 • Kernel (with Docker) とコンテナの関係は JVM と Jar の関係に近い Docker 入門 7
  • 8. Infrastructure as a Code • サーバーに変更を加え続けると複雑になり壊れても戻しにくい • Docker はゲストへの変更を「イメージ」としてバージョン管理 • イメージから作ったコンテナは複製や復旧を容易にできる Docker 入門 8 イメージ V1! (Code) イメージ V2! (Code) コンテナ化 変更成功 (保存したい) 変更失敗 (V2コンテナを作りなおせばOK) イメージ化 イメージV1の! コンテナ1 イメージV2の! コンテナ2
  • 9. Docker の強み • 仮想化のオーバーヘッドが少ない Docker 入門 - CPU - Memory - ストレージ • 「コード」でインフラの構成を管理 - 状態の復元が簡単にできる - 他の環境にも簡単にデプロイできる - 同じ構成を自動で大量に作成できる Linpack(数値計算ライブラリ)を 使った演算(CPU)性能測定結果 An Updated Performance Comparison of Virtual Machines and Linux Containers より • 適度に環境を分離し、サーバーの複雑性を減らす 9 IBM Research Report
  • 10. Network Engineer がなぜ Docker をやるか • コンテナが一般化したらネットワーク機器への接続を意識するこ とが必要になる(VM の vSwitchがそうであったように) • コンテナのオーケストレーションにはネットワークも必ず関わって くる。また、コンテナ型の仮想ネットワーク機器を触ることになる 可能性がある (Ambassador パターンなど) • コンテナがネットワーク機器の内部で使われる可能性がある(最近 の機器は Linux Kernel を使っていることが多い) • コンテナをツールとして利用することになる可能性がある Docker 入門 10
  • 11. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 11
  • 12. Docker を構成するコンポーネント • Docker Client : Server に対して命令を与える • Docker Daemon (Server) : コンテナを実際に動かす Worker • Docker Repository : イメージを保存、管理 push image image Docker 入門 12 Client Daemon(本体) Repository container container image image CLIで命令 pull githubに似ているLinux
  • 13. Docker コンテナの操作と状態の遷移 stopped shutdown 状態 タスク終了 (or stop) start Docker 入門 13 image running removed paused run rm pause unpause コンテナを破棄 suspend 状態 イメージ(雛形)から コンテナ(実体)を作成 commit new! image コンテナをイメージ化
  • 14. Docker のイメージの取り扱いまとめ docker commit docker push Docker Repository! (イメージ保管場所) Image! (雛形) Docker 入門14 container! (実体) Docker file! (設計図) docker run docker pull docker build edit import 破棄 docker rmi
  • 15. テスト環境 • OS: CentOS 6.5 (Mac上の仮想マシン) • Docker: 1.1.2 (Client も CentOS) Docker 入門 • レポジトリ: DockerHub 15 CentOSへのインストール手順 ! (1)EPELを登録しDockerをインストール # yum install -y epel-release # yum install -y docker-io ! (2) Dockerの起動と登録 # service docker start # chkconfig docker on 補足)Ubuntuへのインストール手順 ! # apt-get update # apt-get -y install docker.io
  • 16. # OK, Let’s start demo !! Docker 入門 16 (いくつかのページを飛ばしますが、資料の順に進めます)
  • 17. docker コマンドの利用 • Dockerコマンドの基本 : docker [オプション] コマンド [引数] Docker 入門 17 [root@localhost ~]# docker version Client version: 1.1.2 Client API version: 1.13 Go version (client): go1.2.2 Git commit (client): d84a070/1.1.2 Server version: 1.1.2 Server API version: 1.13 Go version (server): go1.2.2 Git commit (server): d84a070/1.1.2 • コマンドの詳細は本家の CLI リファレンスを参照してください https://docs.docker.com/reference/commandline/cli/
  • 18. リポジトリ(DockerHub)へのログイン(省略) • パプリックリポジトリであるDockerHub への登録が必要 • プライベートなリポジトリの作成も可能 (割愛) Docker 入門 18 [root@localhost ~]# docker login Username: ######## Password: Email: ########@######## Login Succeeded !! [root@localhost ~]# docker info Containers: 19 .. Kernel Version: 2.6.32-431.el6.x86_64 Username: XXXXXXXX Registry: [https://index.docker.io/v1/]
  • 19. イメージの検索 • ベースとなるイメージは DockerHub から取得することが多い • イメージの検索 : docker search [オプション] キーワード [root@localhost ~]# docker search ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Official Ubuntu base image 994 [OK] dockerfile/ubuntu Trusted automated Ubuntu (http://www.ubunt... 34 [OK] ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 25 [OK] clue/ttrss The Tiny Tiny RSS feed reader allows you t... 21 [OK] crashsystems/gitlab-docker A trusted, regularly updated build of GitL... 21 [OK] .. Docker 入門 19 イメージの名前 公式: イメージ名のみ 非公式: ユーザー名/イメージ名 メジャー度合い 公式イメージか否か
  • 20. イメージの取得 • リポジトリからの取得: docker pull [オプション] イメージ名 [:タグ] • pull しておかなくても run 時にダウンロードしてくる (ただし遅い) • ローカルレジストリのイメージの確認: docker images Docker 入門 20 [root@localhost ~]# docker pull ansible/ubuntu14.04-ansible Pulling repository ansible/ubuntu14.04-ansible 745e437a93a5: Pulling dependent layers 06b4dde722cc: Pulling dependent layers .. [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible 1.8 731ee0ca00c3 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible latest 34f599260e20 Less than a second ago 445.1 MB ..
  • 21. イメージの実行 • docker run [オプション] イメージ名 実行するコマンド • 補足) CentOS上でUbuntuが動いているか念のために確認 Docker 入門 21 [root@localhost ~]# docker run ubuntu:14.04 echo "hello docker" hello docker ! [root@localhost ~]# docker run ubuntu:14.04 ping www.google.com PING www.google.com (74.125.235.243) 56(84) bytes of data. 64 bytes from kix01s02-in-f19.1e100.net (74.125.235.243): icmp_seq=1 ttl=127 time=65.3 ms 64 bytes from kix01s02-in-f19.1e100.net (74.125.235.243): icmp_seq=2 ttl=127 time=82.3 ms ^C --- www.google.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 65.388/73.876/82.365/8.492 ms [root@localhost ~]# cat /etc/issue CentOS release 6.5 (Final) Kernel r on an m ! [root@localhost ~]# docker run ubuntu:14.04 cat /etc/issue Ubuntu 14.04.1 LTS n l
  • 22. コンテナのシェルに入って操作(省略) • コンテナをシェルで操作 : docker run -ti ubuntu:14.04 /bin/bash Docker 入門 22 (1) コンテナのシェルに入り hello.txt を作成し、コンテナを抜ける ! [root@localhost ~]# docker run -t -i ubuntu:14.04 /bin/bash root@604439e971e9:/# pwd / root@604439e971e9:/# echo hello > hello.txt root@604439e971e9:/# ls bin boot dev etc hello.txt home lib lib64 .. root@604439e971e9:/# exit exit !! (2) 新しいコンテナを立ち上げて、hello.txt の存在を確認する -> 存在しない ! [root@localhost ~]# docker run -ti ubuntu:14.04 /bin/bash root@cfa3e2757167:/# ls bin boot dev etc home lib lib64 .. root@cfa3e2757167:/# ※ 同一イメージでもコンテナが違えば別物
  • 23. コマンドの help の確認方法(省略) • 引数が必要なコマンドを引数なしで呼ぶと help が出る • オプション -h を付けても確認ができる Docker 入門 23 [root@localhost ~]# docker search Usage: docker search TERM Search the Docker Hub for images ! --automated=false Only show automated builds --no-trunc=false Don't truncate output -s, --stars=0 Only displays with at least x stars !!! [root@localhost ~]# docker run -h Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container ! -a, --attach=[] Attach to stdin, stdout or stderr. -c, --cpu-shares=0 CPU shares (relative weight) --cidfile="" Write the container ID to the file --cpuset="" CPUs in which to allow execution (0-3, 0,1) -d, --detach=false Detached mode: Run container in the background, print new container id --dns=[] Set custom dns servers --dns-search=[] Set custom dns search domains -e, --env=[] Set environment variables ..
  • 24. コンテナの状態確認 • コンテナの状態確認 : docker ps [オプション] • 状態確認だけでなくコンテナID を特定するのによく使う • デフォルトは停止中のコンテナは表示しない。-a オプションで表示 • -q オプションを使うと ID のみを出力。スクリプトで便利 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9ecf98b6fcc ubuntu:14.04 /bin/bash 10 hours ago Up 10 hours db Docker 入門 24 !! [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b129749222b centos:centos6 /bin/bash 35 seconds ago Exited (0) 10 seconds ago test b9ecf98b6fcc ubuntu:14.04 /bin/bash 10 hours ago Up 10 hours db !! [root@localhost ~]# docker ps -q b9ecf98b6fcc
  • 25. コンテナをデーモン化(省略) • コンテナをデーモン化: docker run -d イメージ コマンド • デーモン化されたコンテナの標準出力は抑制される Docker 入門 25 [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 • 標準出力を確認 : docker logs コンテナID [root@localhost ~]# docker logs 7cc259672c hello world hello world .. • デーモンを前に持ってくる [root@localhost ~]# docker attach 7cc259672c hello world hello world .. コンテナIDが返される ※ ポートが開く場合はコマンドを 指定しなくてもデーモン化可能
  • 26. コンテナのsuspendと再開(省略) • pause はコンテナを一時停止する。いわゆる suspend 状態 • unpause で一時停止解除。コンテナ自体はpauseを認知しない Docker 入門 26 [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes insane_bartik !! [root@localhost ~]# docker pause 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps CONTAINER ID  IMAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes (Paused) insane_bartik !! [root@localhost ~]# docker unpause 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 13 minutes ago Up 13 minutes insane_bartik
  • 27. コンテナの停止と再開 • stop はコンテナを shutdown する。kill も同じだが少し乱暴 • start すると再び同じコンテナを立ち上げる。状態は継続している Docker 入門 27 [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes insane_bartik !! [root@localhost ~]# docker stop 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps -a | grep 7cc259672c00 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 27 minutes ago Exited (-1) About a minute ago insane_bartik !! [root@localhost ~]# docker start 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps CONTAINER ID MAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 27 minutes ago Up 4 seconds insane_bartik • 補足) 全てのコンテナを停止。(pauseも同じ要領でできる) [root@localhost ~]# docker stop `docker ps --no-trunc -q`
  • 28. コンテナの設定(json)を確認(省略) • docker inspect コンテナID • docker inspect -f “フォーマット条件” コンテナID Docker 入門 28 [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" e5b758beabad9d1a98f3fd21c6384df223d1abb44502e7cb4e698b52fe4a6a0a ! [root@localhost ~]# docker inspect e5b758beabad [{ "Args": [ "-c", "while true; do echo hello world; sleep 1; done" .. "Pid": 18349, "Running": true, "StartedAt": "2014-11-23T23:50:39.732187978Z" }, "Volumes": {}, "VolumesRW": {} } ] !! [root@localhost ~]# docker inspect -f '{{ .NetworkSettings.IPAddress }}' e5b758beabad 172.17.0.28 !! [root@localhost ~]# docker inspect -f '{{ .NetworkSettings }}' e5b758beabad map[Bridge:docker0 Gateway:172.17.42.1 IPAddress:172.17.0.28 IPPrefixLen:16 PortMapping:<nil> Ports:map[]]
  • 29. コンテナから新イメージの作成 • コンテナへの変更を永続化するためにはイメージ化が必要 • イメージ化: docker commit コンテナID イメージ名 • イメージ名は自分のユーザ名を付けないと push できなくなる [root@localhost ~]# docker run ubuntu:14.04 wget www.google.com 2014/11/24 07:17:47 Error response from daemon: Cannot start container 05c8eca1bc3d395162d028ad7c26c4b73875028d8891c43c1cca0a655e41ecfe: exec: "wget": executable file not found in $PATH ! [root@localhost ~]# docker run -t -i ubuntu:14.04 /bin/bash root@6b8305bdeb74:/# apt-get -y update root@6b8305bdeb74:/# apt-get install -y wget root@6b8305bdeb74:/# exit exit ! [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b8305bdeb74 ubuntu:14.04 /bin/bash 4 minutes ago Exited (0) 17 seconds ago furious_archimedes [root@localhost ~]# docker commit 6b8305bdeb74 yuichi110/ubuntu_wget b89d196b00504777278e83c0c44374f1243d59c16494f2112eb94054373b3e58 Docker 入門 29 !! [root@localhost ~]# docker run yuichi110/ubuntu_wget wget www.google.com .. 0K .......... ....... 181K=0.1s 2014-11-23 22:13:40 (181 KB/s) - 'index.html' saved [17721]
  • 30. コンテナの削除 • 停止中のコンテナの削除: docker rm コンテナID(もしくは名前) • コンテナの強制削除: docker rm -f コンテナID • 削除されたコンテナは復元できない [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 Docker 入門 30 !! [root@localhost ~]# docker rm 7cc259672c00 Error response from daemon: Impossible to remove a running container, please stop it first or use -f 2014/11/24 06:35:24 Error: failed to remove one or more containers !! [root@localhost ~]# docker rm -f 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps -a | grep 7cc259672c00 [root@localhost ~]# • 補足) 全てのコンテナを削除。必要に応じて -f を追加 [root@localhost ~]# docker rm `docker ps --no-trunc -aq`
  • 31. 新イメージをリポジトリに push(省略) • 作成したイメージをリポジトリに登録 • 他ユーザや自分の別のホストでも新イメージが利用可能になる Docker 入門 31 [root@localhost ~]# docker commit 6b8305bdeb74 yuichi110/ubuntu_wget b89d196b00504777278e83c0c44374f1243d59c16494f2112eb94054373b3e58 [root@localhost ~]# docker images | grep yuichi yuichi110/ubuntu_wget latest b89d196b0050 10 minutes ago 219.5 MB !! [root@localhost ~]# docker push yuichi110/ubuntu_wget The push refers to a repository [yuichi110/ubuntu_wget] (len: 1) Sending image list Pushing repository yuichi110/ubuntu_wget (1 tags) 511136ea3c5a: Image already pushed, skipping 1de2bd7201a2: Image already pushed, skipping b70ad18cfc2a: Image already pushed, skipping 3b39241dab7c: Image already pushed, skipping 23f1840ed5a5: Image already pushed, skipping dfa12c637781: Image already pushed, skipping 1357f421be38: Image already pushed, skipping b89d196b0050: Image successfully pushed Pushing tag for rev [b89d196b0050] on {https://cdn-registry-1.docker.io/v1/repositories/yuichi110/ubuntu_wget/ tags/latest} ! [root@localhost ~]# docker search ubuntu | grep yuichi yuichi110/ubuntu_wget 0
  • 32. Docker file から新イメージの作成 • Docker file (ファイル名はDockerfile) にイメージ作成手順を書く • Docker file をビルドして実際にイメージを作成する • Dockerfile を使うことでコンテナのポータビリティが得られる Docker 入門 32 [root@localhost ~]# cat Dockerfile FROM ubuntu:14.04 RUN apt-get update RUN apt-get install -y wget ! [root@localhost ~]# docker build -t yuichi110/ubuntu_wget2 ./ Sending build context to Docker daemon 36.35 kB Sending build context to Docker daemon Step 0 : FROM ubuntu:14.04 ---> 1357f421be38 Step 1 : RUN apt-get update ---> Using cache .. Successfully built c28f0e25c627 !! [root@localhost ~]# docker run yuichi110/ubuntu_wget2 wget www.google.com .. 0K .......... ....... 135K=0.1s 2014-11-23 23:08:36 (135 KB/s) - 'index.html' saved [17682]
  • 33. イメージの削除(省略) • ローカルイメージの削除: docker rmi イメージ名 • イメージに依存しているコンテナが存在していたら実施できない Docker 入門 33 [root@localhost ~]# docker images | grep ansible ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible 1.8 731ee0ca00c3 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible stable 745e437a93a5 Less than a second ago 287.7 MB ansible/ubuntu14.04-ansible 1.7 06b4dde722cc Less than a second ago 287.7 MB !! [root@localhost ~]# docker rmi ansible/ubuntu14.04-ansible:1.8 Untagged: ansible/ubuntu14.04-ansible:1.8 Deleted: 731ee0ca00c31909b0c9f13b641e904038eb16496702ab296c3fcddecd304422 Deleted: 755662277f77a375dd85d4bdad1205a5a6e6310a839c478bc7e87cff809af3a9 .. Deleted: 9d62b40139980fa70e88e34522459b5dd4d81b6806e32ced36440068edfea98a Deleted: b43510963a3adc28e20bebba4f7629ced7ff36efa97a0ce2dfb66d44492c3301 !! [root@localhost ~]# docker images | grep ansible ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible stable 745e437a93a5 Less than a second ago 287.7 MB ansible/ubuntu14.04-ansible 1.7 06b4dde722cc Less than a second ago 287.7 MB
  • 34. ホストのデータを参照(省略) • コンテナ内のデータはコンテナを消したら消滅 • コンテナがホストのデータを参照すればデータは永続化される • オプション: docker run -v ホストのパス:コンテナのパス 参照 ホスト Docker 入門 34 実データ [root@localhost ~]# ls /root/ | grep datastore datastore [root@localhost ~]# ls /root/datastore/ directory hello.txt hello2.txt !! コンテナ [root@localhost ~]# docker run -ti -v /root/datastore/:/ds ubuntu:14.04 /bin/bash root@177cae414b7d:/# ls / | grep ds ds root@177cae414b7d:/# ls /ds directory hello.txt hello2.txt
  • 35. demo completed!! ! Docker 入門 35 ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ ______ o __/ __/ __________/
  • 36. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 36
  • 37. Docker のネットワーク • IPマスカレード(IP,Port変換)を利用している。 • docker 0 という bridge に veth 経由でコンテナの eth0 が接続 • コンテナは利用されていない IP を与えられる (不定) [root@localhost ~]# ifconfig docker0 | head -2 docker0 Link encap:Ethernet HWaddr 2E:69:D1:FB:67:91 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 ! [root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.726a62967372 no vethe9f0 Docker 入門 ホスト 37 NIC コンテナ eth0 veth コンテナ eth0 veth docker0 (DGW) vethf267 root@bea59cfb76ea:/# ifconfig eth0 | head -2 eth0 Link encap:Ethernet HWaddr 06:eb:00:45:f7:43 inet addr:172.17.0.40 Bcast:0.0.0.0 Mask:255.255.0.0 root@bea59cfb76ea:/# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.17.0.0 * 255.255.0.0 U 0 0 0 eth0 default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0/16 NAPT コンテナ
  • 38. Port Forwarding • NAT超え(外から中へのアクセス)にはポートフォワーディングを行う • ホストのポートXに来た通信はコンテナのポートYに転送(同一でもOK) • docker run -p PORT_X:PORT_Y イメージ名 (大文字 -P は自動割り当て) Docker 入門 38 コンテナ Host NIC eth0 docker0 Dest IP : NIC Dest Port : X Dest IP : eth0 Dest Port : Y [root@localhost ~]# docker run -ti -p 10080:80 ubuntu:14.04 /bin/bash root@102a39277af9:/# service nginx start root@102a39277af9:/# nmap localhost ... PORT STATE SERVICE 80/tcp open http ... コンテナは port 80 を使用 外からは port 10080 でアクセス
  • 39. Link によるコンテナ間の連携 • 割り振られるIPは自動で決まるので、それを使ったコンテナ間の連携は難しい • コンテナ間を「 Link 」で接続することでアドレスを隠蔽できる • Link 元は Link 先のIP等を etc/hosts や環境変数(env)で参照可能。 • 設定ファイル等でIPを書き込むのではなく、環境変数で相手を特定する コンテナの立ち上げと Link オプション Docker 入門 39 コンテナ! web コンテナ! db link root@cf283587658f:/# cat /etc/hosts 172.17.0.63 cf283587658f 127.0.0.1 localhost .. 172.17.0.61 db root@cf283587658f:/opt/webapp# env HOSTNAME=cf283587658f DB_NAME=/web2/db TERM=xterm DB_PORT_5432_TCP_ADDR=172.17.0.61 DB_PORT=tcp://172.17.0.61:5432 DB_PORT_5432_TCP=tcp://172.17.0.61:5432 .. Host /etc/hosts # env #docker run -d --name db2 training/postgres #docker run -ti -P --name web2 --link db2:db training/webapp /bin/bash --link name:alias コンテナ内でコンテナ”name”を! ”alias”という名前で参照可能になる
  • 40. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 40
  • 41. フルスクラッチで3階層モデルを構成 • Linkでコンテナ間の連携をさせる • コンテナ1 (WEB) : nginx をロードバランサにする • コンテナ2 (APP) : Python をアプリケーションサーバとして動かす • コンテナ3 (DB) : データベースとしてMySQLを動かす Link Link Docker 入門 41 ロードバランサ NAPT 10080 : 80 App Server DB Server
  • 42. 作業手順の例 1. DBコンテナの立ち上げと設定(MySQL) 2. APP コンテナを DB コンテナにリンクして立ち上げて設定(Python) 3. WEB コンテナを APP コンテナにリンクして立ち上げて設定(NGINX) 4. ブラウザからホストにアクセスし、コンテナのレスポンスを確認 5. コンテナを停止しイメージ化を行う 6. イメージからコンテナをたちあげて動くか確認 Docker 入門 42
  • 43. DB コンテナ (MySQL) [root@localhost ~]# docker run -ti --name db ubuntu:14.04 /bin/bash • MySQL の設定 (途中で設定するパスワードが聞かれ、password とした) • MySQL のデータベースとテーブルを作成 Docker 入門 外からアクセス可能に 43 • コンテナの立ち上げ root@b9ecf98b6fcc:/# apt-get update root@b9ecf98b6fcc:/# apt-get install mysql-server-5.6 root@b9ecf98b6fcc:/# sed -i -e "s/bind-address/# bind-address/g" /etc/mysql/my.cnf root@b9ecf98b6fcc:/# service mysql start root@b9ecf98b6fcc:/# mysql -u root -p Enter password: mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; mysql> create database test_db; mysql> use test_db; mysql> create table test_table (id int, value varchar(100)); mysql> insert into test_table values (1, "mysql on db container"); mysql> quit root ユーザへの権限の設定 事前にテーブルとエントリを作成
  • 44. APP コンテナ (Python) [root@localhost ~]# docker run -ti --name app --link db:db ubuntu:14.04 /bin/bash Docker 入門 フレームワークではなく http処理用のライブラリを利用 44 • コンテナの立ち上げ • Python の設定と起動 root@0b6dc84addf4:/# apt-get update root@0b6dc84addf4:/# apt-get install python-mysqldb root@0b6dc84addf4:/# python2 app.py • Application Server のプログラムの作成 : app.py 接続先DBをIPではなく ドメイン名”db”で指定 (etc/hostsで解決される) http get がきたら DB から エントリを取得して、 textデータを返すだけ
  • 45. WEB コンテナ (NGINX) Docker 入門 45 root@522fbc2bba47:/# apt-get update root@522fbc2bba47:/# apt-get install nginx root@522fbc2bba47:/# rm /etc/nginx/sites-enabled/default root@522fbc2bba47:/# vi /etc/nginx/sites-enabled/default root@522fbc2bba47:/# service nginx restart server { listen 80 default_server; location / { proxy_pass http://app:80; } } • コンテナの立ち上げ [root@localhost ~]# docker run -ti -p 10080:80 --name web --link app:app ubuntu:14.04 /bin/bash • NGINX の設定 • NGINX の編集したファイル内容: /etc/nginx/sites-enabled/default link機能で解決できるドメイン名 app を設定ファイルに書き込み webサーバーではなくロードバランサーとして使う設定(クラスタは組んでいない)
  • 46. イメージ化と動作確認 • イメージ化 + 今までのコンテナの削除 [root@localhost ~]# docker commit db 3tier/db [root@localhost ~]# docker commit app 3tier/app [root@localhost ~]# docker commit web 3tier/web [root@localhost ~]# docker rm `docker ps -aq` • コンテナの立ち上げ (サービス自動立ち上げにしてデーモン化でもOK) Docker 入門 46 [root@localhost ~]# docker run -ti --name db 3tier/db /bin/bash root@71cfbce43a8d:/# service mysql start [root@localhost ~]# docker run -ti --name app --link db:db 3tier/app /bin/bash root@06ef42352907:/# python2 app.py [root@localhost ~]# docker run -p 10080:80 -ti --name web --link app:app 3tier/web /bin/bash root@f1048cc4d64a:/# service nginx start • ブラウザでホストにアクセスして確認。成功 DBコンテナに保存されているデータ (補足) linkのエイリアスを使えば 同一構成の複数展開も可能 --link app:app --link app2:app --link app3:app
  • 47. 補足) コンテナをサービス分離にのみ使用する例 • プレゼンターの使い方 (図には若干の変更や実装中の部分が含まれます) • 各コンテナに1つのサービスを全ていれ、NGINXでドメインで振り分け Primary Host1 (固定IP) DNS Secondary Docker 入門 47 localhost (docker) 10080:80 11080:80 80 VirtualHost Cluster Cache, Security localhost (docker) 10080:80 80 11080:80 RR with HA Host2 (固定IP) VirtualHost Cluster Cache, Security .. ..
  • 48. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 48
  • 49. まとめ • Dockerのようなコンテナ型仮想化はリソース効率的に利用 • 環境を適度に分離する目的に利用できる • 不変なイメージをコンテナ化して使う • イメージが不変であるため複製や移行、復旧が簡単 • イメージから環境依存をどのようにして減らすかが重要 Docker 入門 49
  • 50. Docker の将来 • コンテナの業界標準になる可能性があるだけでなく、 VMWare などの完全仮想化を食ってしまう可能性がある • 大規模環境ではKubernetes のようなオーケストレーショ ンツールで管理する必要性が高まる • クラウドのVM上で Docker を動かすとベンダへの依存性 が減るかもしれない。(InterCloudの実現に便利) Docker 入門 50
  • 51. Thanks !! 要望があれば実環境向けの Docker with Ansible(管理ツール) とかやりたいです。 Docker 入門51
  • 52. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 52
  • 53. Docker ベストプラクティス • コンテナはStateless な運用を目指す (ログ等も) • IPなどの環境に依存する設定をイメージから排する • 1機能(もしくは1サービス)1コンテナを意識する • Docker だけで全てを完結させず、CheffやAnsibleも利用 • /bin/bash ではなく Docker file でイメージを作る Docker 入門 53
  • 54. Docker の弱み • Docker はホストとゲストが kernel を共有している - 異なる kernel を使うOSは仮想化できない - kernel レベルの機能は仮想化できない • 完全仮想化に比べて歴史が浅い - 提供される機能が多くない - オーケストレーションなどが難しい • ネットワーク、ストレージなどに融通を効かせにくい Docker 入門 54
  • 55. Docker に対する業界動向 (2014年12月現在) • Docker社: ホストまたぎのオーケストレーションに注力, API など • VMWare: 競合しつつも協業の未知を探している。幹部がDocker 社に移る。 • Red Hat: RHEL などで Docker を提供。 • Microsoft: 次期の Windows Server を Docker 対応させる • Amazon: Docker のコンテナ実行環境と管理サービスを提供 • Google: コンテナ実行環境の提供。kubernetes の開発 • IBM: bluemix 上でコンテナが使えるようになった • GUI: いくつかのプロジェクトが走っている • 個人コミッタ: マルチホストでDockerを使うためのツール開発がブーム Docker 入門 55
  • 56. 補足) レイヤー化されたDocker のイメージファイル • イメージに差分を「積み重ねる」ことで新しいイメージを作る • Gitなどのように樹形図的に子イメージが増えていく • 子のイメージやコンテナは親のイメージのデータをReadOnlyで共有 docker run apt-get install apache2 apt-get install emacs 公式 debian image コンテナを! たちあげ 変更! イメージ化 変更! イメージ化 Docker 入門56
  • 57. 補足) /bin/bash を上手に使う • docker run,start で bin bash に入るのは便利 (良し悪しは別として) • bin/bash でコンテナとイメージに改変を加えていく作業を繰り返す • 複雑になってきたら Dockerfile でイメージを作り直す(リファクタリング) 作業の区切りでイメージ化 作業 docker commit コンテナID Docker 入門 57 作業終了 image running stopped /bin/bash に戻る /bin/bash に入る docker run -t -i イメージ名 /bin/bash docker start コンテナID! docker attach コンテナID Dockerfileで書き直す (リファクタリング)
  • 58. 補足) DNS によるコンテナ間の連携手法 • 複雑な構成でコンテナ間接続を Link だけで実現するのは難しい • リンクでホスト跨ぎもできない (通常はオーケストレーションで) • 個人レベルなら簡易 DNS (dnsmasqなど) を使って管理できる? (1) DNS参照とコンテナ名の設定をして立ち上げ (2) コンテナ名から inspect して IP を取得 address=/test.docker/172.17.0.53 service dnsmasq restart Docker 入門 58 App! Server DB1! Primary DB2! Secondary DNS docker run -d -dns 172.17.42.1 -name web WEB_IMAGE docker run -d -dns 172.17.42.1 -name app APP_IMAGE docker run -d -dns 172.17.42.1 -name db DB_IMAGE docker0 (172.17.42.1) docker inspect -f '{{ .NetworkSettings.IPAddress }}' NAME IP_ADDRESS (3) コンテナ名と IP の組み合わせをDNS登録 (4) コンテナ間の通信はドメイン・ネームで行う (動的に割り当てられるIPに非依存) App! Server リンク可 双方向は リンク不可
  • 59. 補足) 簡易DNSであるDnsmasqの使い方 • Dnsmasq は BIND より簡単に運用可能。スクリプトで制御しやすい • 登録するドメイン名は「コンテナ名.docker」としている (自由) /etc/dnsmasq.d/test /etc/dnsmasq.d/test2 Docker 入門 59 listen-address=172.17.42.1 interface=docker0 conf-dir=/etc/dnsmasq.d address=/test.docker/172.17.0.53 /etc/dnsmasq.conf /etc/dnsmasq.d address=/test2.docker/172.17.0.54 # yum install dnsmasq # chkconfig dnsmasq on # service dnsmasq restart
  • 60. 補足) DNS方式の制御用スクリプト Docker 入門 60 web, app, db という標準的な3階層構成 Web Server APP! Server DB! Server name: web! IP: X name: app! IP: Y name: db! IP: Z DNS to! app to! db docker0 (172.17.42.1)
  • 61. 補足) コンテナにNICを追加する • Docker 単独の機能では実現できないので Linux コマンドを使う • コンテナの環境依存性が高まるので利用には注意が必要 • 私なら OVS を使った Ambassador パターンや Trunk を検討するかも コンテナ eth1 veth veth veth NICとのマッピング Docker 入門 61 eth0 docker0 (DGW) Linux bridge NIC1 eth2 OVS NIC2 NIC_N 「Docker を支える技術」 RedHat 中井さんによる日本語資料 Slide Share にあります
  • 62. 補足) オーケストレーションによるネットワーク管理 Docker 入門 • fig • Ambassador パターン • etcd (zookeeper) • pipework 62 個人的な考え • コンテナ間の接続はイメージ内に直接書くべきではない • Docker file を使う • .bash_profile などを外出しして、それを編集とかどう ? • プログラミングの Actor モデルのパターンなどが流用可能 ?