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

Dockerでルータをコンテナ化してみた

最近Dockerを触る機会がちょくちょくあって、ルータをコンテナ化したら面白いことできそうだし、便利かもしれないと思ってやってみました。 思い返すと、初めてDockerを触ったのは2013年の12月で、こんな記事を書いたこともあったっぽい。懐かしい。

kurochan-note.hatenablog.jp

vyOSをコンテナ化する!

コンテナ化するルータOS(ネットワークOS)はvyOSです。 そもそもベースイメージが提供されていないOSってどうやってコンテナ化するんだろう?とか調べてたら、すでにやられている方がいました。

VyOS の Docker イメージを作ってみる - higeblog

大まかな流れとしては、

  • docker をインストール
  • overlayroot をインストール
  • ISO をダウンロード
  • ISO をマウント
  • ISO の中身から root パーティションを構築
  • イメージビルド用ディレクトリにコピー
  • イメージビルド用ディレクトリを圧縮
  • Dockerfile を作成
  • docker build

という感じでやればコンテナのベースイメージが作れるようです。コンテナ自身はLinuxカーネルを持つ必要はありませんので、アンインストールしてイメージサイズを減らしたりもしています。

新しいバージョンが使いたかったので、自分でビルドしてみました。 イメージを作るのに使ったスクリプトです。公開されているスクリプトをforkして、ちょこっと変更しました。

mkimage_vyos.sh · GitHub

ビルドしたイメージ

Ubuntu15.04上でやりました。あとは、パッケージ docker.iooverlayroot をインストールしたくらいです。 ビルドしたイメージは、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のものなので、もしかしたらうまく動かない機能があるかもしれません。今のところうまく動いてくれていますが。 これを使って簡単なネットワークを作ってみたりもしましたので、そのことも別の記事で書いてみようと思います!