読者です 読者をやめる 読者になる 読者になる

AS2500の最果てで

AS2500のどっかのNOCのまとまらないまとめ

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がないけど途中で必要なときどうすればいいんだろう