May 31, 2014

Docker はじめの一歩

去年末くらいから流行っている Docker(Docker-IO) 。最近では勉強会でも花形になりつつある感じで、いわゆるビックウェーブ感ある。また、 Red Hat が結構本気出して肩入れしている事もあり、コミュニティ、エッジユーザ、エンプラ関連共に今年は盛り上がりそうな気がする。

そんな Docker なのだけど、とある案件で使おうかなと思い立ったのでもう一度おさらいすることにした。

あと、何でもかんでもコンテナにして「みゅーたぶるいんh(ry ひゃっはー」みたいな思考は破滅するのでよした方が良いし、可搬性だけ取り上げて以下のようなパターンは死亡の一途なのでハマらないようにしなければならない。

  • 社内の検証環境は CentOS、デプロイ先は AWS Amazon Linux にコンテナとして CentOS 突っ込むぜ!
    • 多分わりと普通に動くんだけど、Amazon Linux の kernel で CentOS 動かすとか狂気でしかない。誰が運用・保守・サポート・トラブルシューティングするのか考えよう。
    • 同じ理由で Ubuntu on CentOS とかその逆も然り。
    • あくまで kernel を共有するコンテナであることを忘れてはならない。KVMXen とは根本的に異なる。
      • あと、AWSCentOS 6.x 使う場合大概 PVM になると思うんだけど、Xen Kernel でコンテナ動かすのってどうなんだろう。気分的にはスゲー認められないが、調査が必要。HVM 使うならその辺は他の IaaS やら仮想マシンと変らないだろうけど。

Docker を使う

  • Docker を入れるには RHEL/Cent6.4 以降、特に 6.5 以降を強く推奨(他のディストリビューションはよく知らない)

  • Docker は NAT に dnsmasq ではなく、iptables を使うという仕様

    • したがって iptables を止めてる場合は明示的に起動すべし
  • Docker をする上で確認しておくべき事

    • 間違ってもコンテナに繋ぐネットワークを bridge 形式にしたい、とか考えないこと
    • 間違ってもlibvirtd と共存出来ないかな、とか考えないこと
    • DeviceMapper なゴミが増え出すことが発生したら、おとなしく再起動する勇気を持つこと
    • SELinux 対応を真面目に想定するならちゃんと工数積んでおくこと(うん、まぁマジで大変)
    • コンテナの中からネットワークが繋がらない時は iptablesMasquerade 設定が正しいか確認する事
    • コンテナの中からネットワークが繋がらない時は sysctlnet.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 の作り方

  • 簡単なのでまた今度。

© Kazuhisa Hara 2014-2022