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`
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
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”という名前で参照可能になる
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 ユーザへの権限の設定
事前にテーブルとエントリを作成
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)