Dockerでルータをコンテナ化してみた
最近Dockerを触る機会がちょくちょくあって、ルータをコンテナ化したら面白いことできそうだし、便利かもしれないと思ってやってみました。 思い返すと、初めてDockerを触ったのは2013年の12月で、こんな記事を書いたこともあったっぽい。懐かしい。
vyOSをコンテナ化する!
コンテナ化するルータOS(ネットワークOS)はvyOSです。 そもそもベースイメージが提供されていないOSってどうやってコンテナ化するんだろう?とか調べてたら、すでにやられている方がいました。
VyOS の Docker イメージを作ってみる - higeblog
大まかな流れとしては、
- docker をインストール
- overlayroot をインストール
- ISO をダウンロード
- ISO をマウント
- ISO の中身から root パーティションを構築
- イメージビルド用ディレクトリにコピー
- イメージビルド用ディレクトリを圧縮
- Dockerfile を作成
- docker build
という感じでやればコンテナのベースイメージが作れるようです。コンテナ自身はLinuxカーネルを持つ必要はありませんので、アンインストールしてイメージサイズを減らしたりもしています。
新しいバージョンが使いたかったので、自分でビルドしてみました。 イメージを作るのに使ったスクリプトです。公開されているスクリプトをforkして、ちょこっと変更しました。
ビルドしたイメージ
Ubuntu15.04上でやりました。あとは、パッケージ docker.io
と overlayroot
をインストールしたくらいです。
ビルドしたイメージは、DockerHubで公開しています。
https://hub.docker.com/r/kurochan/vyos/
Repository Description書かないと使い方がわからないですね。。。
起動方法
vyOSはカーネルモジュールが必要なので、通常の起動方法だと、うまく動きません。 特権コンテナとして動かすのと、ホスト側の/lib/modulesをコンテナ内の/lib/modulesにマウントしてあげます。 vyOSはDebian系なので、Ubuntu15.04の上で動かしました。
初回のみdocker imageのpullが必要です。
$ docker pull kurochan/vyos:latest
コンテナを起動するには、
$ docker run -d --privileged -v /lib/modules:/lib/modules kurochan/vyos:latest
と打ちます。
動作確認
container idの取得
container idを取得します。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES de8b263b5332 kurochan/vyos:latest "/sbin/init" 3 seconds ago Up 2 seconds ecstatic_bhabha
シェルの起動
vbashを起動します。
$ docker exec -it de8b263b5332 /bin/vbash vbash-4.1#
vyOSユーザでコマンドを実行する必要があるので、シェルを起動した後、 su - vyos
でユーザを切り替える必要があります。
あとは、普通のvyOSと同じように使えるはずです!
vbash-4.1# su - vyos vyos@vyos:~$ configure [edit] vyos@vyos# show WARNING: terminal is not fully functional interfaces {URN) ethernet eth0 { address dhcp } loopback lo { } } system { config-management { commit-revisions 20 } console { device ttyS0 { speed 9600 } } ......
その他
コンテナでvyOSを動かす事ができましたが、カーネルはvyOSのものではなく、Ubuntuのものなので、もしかしたらうまく動かない機能があるかもしれません。今のところうまく動いてくれていますが。 これを使って簡単なネットワークを作ってみたりもしましたので、そのことも別の記事で書いてみようと思います!