去年末くらいから流行っている Docker
(Docker-IO
) 。最近では勉強会でも花形になりつつある感じで、いわゆるビックウェーブ感ある。また、 Red Hat が結構本気出して肩入れしている事もあり、コミュニティ、エッジユーザ、エンプラ関連共に今年は盛り上がりそうな気がする。
そんな Docker
なのだけど、とある案件で使おうかなと思い立ったのでもう一度おさらいすることにした。
- Docker とは
- SeeAlso: docker.io
あと、何でもかんでもコンテナにして「みゅーたぶるいんh(ry ひゃっはー」みたいな思考は破滅するのでよした方が良いし、可搬性だけ取り上げて以下のようなパターンは死亡の一途なのでハマらないようにしなければならない。
- 社内の検証環境は
CentOS
、デプロイ先はAWS
のAmazon Linux
にコンテナとしてCentOS
突っ込むぜ!- 多分わりと普通に動くんだけど、
Amazon Linux
の kernel でCentOS
動かすとか狂気でしかない。誰が運用・保守・サポート・トラブルシューティングするのか考えよう。 - 同じ理由で
Ubuntu
onCentOS
とかその逆も然り。 - あくまで 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 の作り方
- 簡単なのでまた今度。