ガチガチにネットワーク設計されたマルチコンテナな環境を作りたい。 しかも、DSLとかで記述してコマンド一発でいけるとうれしい。
感覚的には vagrant up で、複数VM立ち上げられるdocker版。VMの細かいカスタマイズはVagrantfileでできるように。
結論まで辿りついていないのですが、ファーストトライの個人メモです。
はじめに。固定IPを振るのに、docker単体じゃできないみたいな記事があるけど、
--privileged
で、ipコマンド打てば特に問題なく設定でき、
他コンテナとの通信もできました。
開発環境限定とかなら、これでもいいかなという気もします。
以下、Docker環境構築から順次メモ。
CoreOS導入(Vagrantで)
いつもはFedora使うけど、CoreOSで試しました。
$ git clone https://github.com/coreos/coreos-vagrant/ $ cd coreos-vagrant $ vagrant up
起動後の情報いくつか。
core-01 ~ # uname -a Linux core-01 3.18.4 #2 SMP Thu Feb 5 02:39:49 UTC 2015 x86_64 Intel(R) Celeron(R) CPU N2830 @ 2.16GHz GenuineIntel GNU/Linux core-01 ~ # df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 16591236 21644 15707096 1% / devtmpfs 498692 0 498692 0% /dev tmpfs 510984 0 510984 0% /dev/shm tmpfs 510984 224 510760 1% /run tmpfs 510984 0 510984 0% /sys/fs/cgroup /dev/sda9 16591236 21644 15707096 1% / /dev/sda3 1024016 313976 658024 33% /usr tmpfs 510984 0 510984 0% /media tmpfs 510984 0 510984 0% /tmp /dev/sda6 110576 88 101316 1% /usr/share/oem core-01 ~ # docker -v Docker version 1.4.1, build 5bc2ff8-dirty
systemd採用。一般ユーティリティ系(?)のぞいて、 docker以外のコマンドどれくらい入っているのかなぁと見てみると
- 入っていたコマンド:git, wget, curl, ip(などiproute2系), ifconfig(などnettools系), ethtool
- 入っていないコマンド:svn, perl, ruby, python, apt-get, yum, rpm, gcc, gdb, tcpdump
Rocketも入っていなかった。( CoreOS - はじめてのRocket - Qiita )
まぁ、最低限のLinux環境ならこんなもんですかね。あとはコンテナ内で。 etcdやfleetとか、オーケストレーションとかがあればいいって感じですかね。
CoreOSクラスタにDockerコンテナをデプロイ #dockerjp // Speaker Deck
privileged起動でコンテナ操作
以下、privilegedで起動して、ipを追加した操作。
core-01 ~ # docker run -it --rm --privileged ubuntu /bin/bash root@3a9c79cf6c14:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 30: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:0a:01:00:0b brd ff:ff:ff:ff:ff:ff inet 10.1.0.11/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:aff:fe01:b/64 scope link valid_lft forever preferred_lft forever root@3a9c79cf6c14:/# ip a a 192.168.0.2/24 dev eth0 root@3a9c79cf6c14:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 30: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:0a:01:00:0b brd ff:ff:ff:ff:ff:ff inet 10.1.0.11/16 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.0.2/24 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:aff:fe01:b/64 scope link valid_lft forever preferred_lft forever
pipework
pipeworkも使ってみました。 LXCコンテナを操作しているイメージだったので、今動くのかな?という懸念があったのですが、普通に動きました。
下記、サイトにある内容を実践しただけなので、詳細は割愛...
Dockerコンテナに狙ったIPアドレスを割り当てる | blog.hansode.org
まぁ、ホスト側で一発で操作できるのは嬉しいけど... コンテナ起動してから、1コンテナずつ操作する。だと、当初の目標には遠い。
Weave
Weaveが少し近づいてきた?
Weave - Dockerで仮想ネットワークを構築 MOONGIFT
ZettioがDocker用ネットワークシステムのWeaveをリリース
複数のDockerサーバで独自ネットワークを構築する「Weave」を試す! - さくらのナレッジ
Dockerコンテナ接続パターン (2014年冬) | SOTA
インストール。
$ sudo wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave /usr/local/bin/weave: Read-only file system
えっと、CoreOSでは /usr が readonlyでmountされているようなので
$ sudo mkdir -p /opt/bin $ sudo wget -O /opt/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave $ sudo chmod a+x /opt/bin/weave
weaveはroot専用コマンドらしいので、rootになって各操作。
# weave launch
まず、起動すると zettio/weavetools や zettio/weave のコンテナイメージをとりにいって、 zettio/weave を起動しているようでした。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d6023fc97310 zettio/weave:0.9.0 "/home/weave/weaver 36 seconds ago Up 34 seconds 0.0.0.0:6783->6783/udp, 0.0.0.0:6783->6783/tcp weave
では、実際に動かしたいコンテナを起動。
# weave run 192.168.0.1/24 -it ubuntu /bin/bash 06d7ed07fbd6ff0cad9d6bde89c4055a50cb38ac57fb464077e28541749ce9fa # weave ps 06d7ed07fbd6 66:f2:32:45:7c:92 192.168.0.1/24 d6023fc97310 32:c5:23:49:1f:b8 # docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 06d7ed07fbd6 ubuntu:latest "/bin/bash" 55 seconds ago Up 54 seconds elegant_torvalds
-d
指定しなくても、デーモンとして起動するのかな。
weave attach がうまくできなかったので、docker attachする。
# docker attach 06d7ed07fbd6 root@06d7ed07fbd6:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 39: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:0a:01:00:0d brd ff:ff:ff:ff:ff:ff inet 10.1.0.13/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:aff:fe01:d/64 scope link valid_lft forever preferred_lft forever 41: ethwe: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc fq_codel state UP group default qlen 1000 link/ether 66:f2:32:45:7c:92 brd ff:ff:ff:ff:ff:ff inet 127.0.0.1/24 scope host ethwe valid_lft forever preferred_lft forever inet 192.168.0.1/24 scope global ethwe valid_lft forever preferred_lft forever inet6 fe80::64f2:32ff:fe45:7c92/64 scope link valid_lft forever preferred_lft forever (ctl+p ctl+q で抜ける)
ethweというインタフェースが追加され、そこにIPアドレス付与されていることがわかる。
--net=none
付きで起動すれば、ethweオンリーのシンプルな環境にもできる。
# weave run 192.168.0.2/24 -it ubuntu /bin/bash
として、もう1個コンテナ作成し、
pingでコンテナ間通信できることを確認。資料通りやれば、複数ホスト間も同じ感じで動くだろう。
dockerをラッピングして、起動からネットワークまわりをケアできること、複数ホスト間もつなげられる。のが利点かな。
Docker Machine, Swarm
最近は、Docker社もオーケストレーションを出してきている。 ネットワークのカスタマイズは不明。やっぱりPaaS的な方向なのかなぁ。 誰かのまとめ記事を待つことにしよう(おい
Announcing Docker Machine, Swarm, and Compose for Orchestrating Distributed Apps | Docker Blog
fig, Docker Compose (2015/2/11 追記)
DSLでどうのは、figがよさそうと思っていたら、Docker Composeで置き換える模様。
Figで複数のDockerコンテナをまとめて起動して、Redmineを構築する - hidemium's blog
docker独自の構成ツール三種をアナウンス、figはDocker Composeへ - A Node in Nodes
単なるメモ
ethtoolで全IFなめる指定(もうちょっとシンプルにかけるはず...)
# ip l | grep "^[0-9]"|cut -d: -f2 | xargs -n 1 ethtool
CoreOSでプロキシまわりするスマートな方法がないみたいで、
/usr/lib/systemd/system/docker.service
を見てみると、
[Service] Environment=TMPDIR=/var/tmp EnvironmentFile=-/run/flannel_docker_opts.env
とあるんだけど -/run/flannel_docker_opts.env
ってどういう意味だ...勉強不足。。
参考: * http://ewaldertl.blogspot.jp/2014/03/using-docker-behind-http-proxy-on.html