tkhrsskの日記

技術ネタなど

Dockerのネットワーク関連 (CoreOSで pipeworkとか weaveとか)

ガチガチにネットワーク設計されたマルチコンテナな環境を作りたい。 しかも、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以外のコマンドどれくらい入っているのかなぁと見てみると

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を試してみた

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