去年末くらいから流行っている Docker(Docker-IO) 。最近では勉強会でも花形になりつつある感じで、いわゆるビックウェーブ感ある。また、 Red Hat が結構本気出して肩入れしている事もあり、コミュニティ、エッジユーザ、エンプラ関連共に今年は盛り上がりそうな気がする。
そんな Docker なのだけど、とある案件で使おうかなと思い立ったのでもう一度おさらいすることにした。
- Docker とは
- SeeAlso: docker.io
あと、何でもかんでもコンテナにして「みゅーたぶるいんh(ry ひゃっはー」みたいな思考は破滅するのでよした方が良いし、可搬性だけ取り上げて以下のようなパターンは死亡の一途なのでハマらないようにしなければならない。
- 社内の検証環境は
CentOS、デプロイ先はAWSのAmazon LinuxにコンテナとしてCentOS突っ込むぜ!- 多分わりと普通に動くんだけど、
Amazon Linuxの kernel でCentOS動かすとか狂気でしかない。誰が運用・保守・サポート・トラブルシューティングするのか考えよう。 - 同じ理由で
UbuntuonCentOSとかその逆も然り。 - あくまで kernel を共有するコンテナであることを忘れてはならない。
KVMやXenとは根本的に異なる。- あと、
AWSでCentOS 6.x使う場合大概PVMになると思うんだけど、Xen Kernelでコンテナ動かすのってどうなんだろう。気分的にはスゲー認められないが、調査が必要。HVM使うならその辺は他の IaaS やら仮想マシンと変らないだろうけど。
- あと、
- 多分わりと普通に動くんだけど、
Docker を使う
-
Docker を入れるには RHEL/Cent6.4 以降、特に 6.5 以降を強く推奨(他のディストリビューションはよく知らない)
-
Docker は NAT に
dnsmasqではなく、iptablesを使うという仕様- したがって
iptablesを止めてる場合は明示的に起動すべし
- したがって
-
Docker をする上で確認しておくべき事
- 間違ってもコンテナに繋ぐネットワークを
bridge形式にしたい、とか考えないこと - 間違っても
libvirtdと共存出来ないかな、とか考えないこと DeviceMapperなゴミが増え出すことが発生したら、おとなしく再起動する勇気を持つことSELinux対応を真面目に想定するならちゃんと工数積んでおくこと(うん、まぁマジで大変)- コンテナの中からネットワークが繋がらない時は
iptablesのMasquerade設定が正しいか確認する事 - コンテナの中からネットワークが繋がらない時は
sysctlのnet.ipv4.ip_forward設定が正しいか確認する事
- 間違ってもコンテナに繋ぐネットワークを
[root@docker-dev1 ~]# iptables -L -t nat -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain DOCKER (2 references)
target prot opt source destination
install
epel有効にしてから
[root@docker-dev1 ~]# yum install docker-io -y
usage
docker-reg:5000は手元に立てた docker リポジトリpullで引っ張ってくる
[root@docker-dev1 ~]# docker pull docker-reg:5000/centos
Pulling repository docker-reg:5000/centos
9f3410859d2b: Download complete
53fad8fd86de: Download complete
imagesで確認docker-reg:5000/centosというのをタグ(6.5-httpdとかがタグ)を指定せず引っ張ったので、ベースイメージとそれに紐付いて登録されているタグのイメージが引っ張られてきていることが確認できる
[root@docker-dev1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker-reg:5000/centos 6.5-httpd 9f3410859d2b 20 hours ago 383.6 MB
docker-reg:5000/centos 6.5 53fad8fd86de 20 hours ago 322.9 MB
runで立ち上げる-i -t無しだと一番後ろの引数(つまり実行コマンド)/bin/bashが一回実行されて、そのままコンテナは終了してしまうので注意
[root@docker-dev1 ~]# docker run -i -t docker-reg:5000/centos:6.5-httpd /bin/bash
bash-4.1#
bash-4.1#
- 適等にコンテナの中で作業する
- とりあえず
vimとか入れる
- とりあえず
exitするとその時点でコンテナは終了する
bash-4.1# yum install vim
....
bash-4.1# exit
psで動いてるコンテナを確認できるexitしたのでマジで消えていることが確認できる
[root@docker-dev1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-a -notrunで動いてないコンテナは確認できるromantic_euclidとか謎の識別子がコンテナ毎に振られるようだ- この
NAMESはランダムで振られるんだけど、run のタイミングか何かで任意に付けられると思われる(要調査)
0bf055...ことromantic_euclid、このイメージが今し方vimを入れたコンテナである
[root@docker-dev1 ~]# docker ps -a -notrunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0bf0555ec0af4f5cbc0b6ccd14b6e665511051d698d1c6781072827432f56896 docker-reg:5000/centos:6.5-httpd /bin/bash 2 minutes ago Exit 0 romantic_euclid
- 状態を保存する為
commitするvimいれた事だし6.5-vimという名前(タグ)にしたlocal/centosはローカルのバケット
[root@docker-dev1 ~]# docker commit romantic_euclid local/centos:6.5-vim
6fea513e51aa4c646c79f8cd4e6752f61259100584ecbbb85abd301ca735b333
imagesで確認
[root@docker-dev1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
local/centos 6.5-vim 6fea513e51aa 21 seconds ago 486.3 MB
docker-reg:5000/centos 6.5-httpd 9f3410859d2b 20 hours ago 383.6 MB
docker-reg:5000/centos 6.5 53fad8fd86de 20 hours ago 322.9 MB
- docker リポジトリに登録するためにタグ打ちする
[root@docker-dev1 ~]# docker tag local/centos:6.5-vim docker-reg:5000/centos:6.5-vim
pushする
[root@docker-dev1 ~]# docker push docker-reg:5000/centos
The push refers to a repository [docker-reg:5000/centos] (len: 3)
Sending image list
Pushing repository docker-reg:5000/centos (3 tags)
Image 53fad8fd86de already pushed, skipping
Pushing tag for rev [53fad8fd86de] on {http://docker-reg:5000/v1/repositories/centos/tags/6.5}
Image 9f3410859d2b already pushed, skipping
Pushing tag for rev [9f3410859d2b] on {http://docker-reg:5000/v1/repositories/centos/tags/6.5-httpd}
6fea513e51aa: Image successfully pushed
Pushing tag for rev [6fea513e51aa] on {http://docker-reg:5000/v1/repositories/centos/tags/6.5-vim}
- これで今後
vimが入ったコンテナはdocker pull docker-reg:5000/centos:65-vimで引っ張ってこれるようになる
Private Docker-Registry の作り方
- 簡単なのでまた今度。