Docker内でTUN/TAPを使うときのメモ
Dockerコンテナ内でTUN/TAP IFを使う用途が出て最初上手くいかなかったのでその時のメモ。
使ったベースのイメージは公式(?)の fedora:20
/dev/net/tun が無い
$ docker run -ti fedora:20 bash bash-4.2# ip tuntap add tun0 mode tun open: No such file or directory bash-4.2#
まず最初に躓くのはこれ。まぁちょっとググったら分かるんだけど、何が"No such file or directory"なのか教えてくれないのでわかりづらい。
最近の環境だと大体しょっぱなからdevfs周りは整備されているから気づきづらいかもしれない
bash-4.2# mkdir -p /dev/net bash-4.2# mknod /dev/net/tun c 10 200 bash-4.2# chmod 666 /dev/net/tun
マジックナンバーはまぁkernel内部の話だから仕方ないのかなと思う。
rootでip tuntapしても怒られる
bash-4.2# ip tuntap add tun0 mode tun ioctl(TUNSETIFF): Operation not permitted bash-4.2#
ホストでSecureOS関連は動いていないので(ゴメンナサイイシカワサン)rootでも蹴られたのは解決までちょっとかかった。
docker runは実行時に--privilegedというオプションを渡せて、これで特権が必要なアクセスができるようになる。
$ docker run --help [14-08-31 23:00] Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container (((snip))) (use 'docker port' to see the actual mapping) --privileged=false Give extended privileges to this container --restart="" Restart policy to apply when a container exits (no,
ということで
--privileged付きで実行して、mknodすればいいことがわかったので、
$ docker run --privileged -ti fedora:20 bash bash-4.2# mkdir -p /dev/net bash-4.2# mknod /dev/net/tun c 10 200 mknod: '/dev/net/tun': File exists bash-4.2# ls -l /dev/net/tun crw-rw-rw- 1 root root 10, 200 Aug 31 14:04 /dev/net/tun bash-4.2#
どうやら--privilegedが付いていると/dev/net/tunは作られるようだ...
結論
- 基本的に--privilegedを付けてrunすればいい
- ただ、Dockerfile内とかで/dev/net/tunが存在している必要がある場合はmknodするしかない
- ところで、docker buildには--privilegedがないけど途中で必要なときどうすればいいんだろう