Trema を Docker コンテナ上で動かす
いまさらですが,とある事情で Trema を動かす必要があったため,docker コンテナ上で動かしてみましたので,ここに手順を書き残しておきます.docker 関連の必要なソフトウェアは事前にインストール済みであることを前提に話を進めます.
準備
まず,作業用のディレクトリを用意します.ディレクトリ名は trema-docker としましたが,何でも良いでしょう.
$ mkdir trema-docker $ cd trema-docker
次に docker-compose.yml を作ります.内容は以下の通り.
version: '3' services: trema: container_name: trema build: context: . dockerfile: Dockerfile volumes: - type: bind source: ./root target: /root
Trema を含むコンテナイメージを自前で作る必要があるため,以下の内容で Dockerfile を作成します.Ruby 2.0 が動作するコンテナをベースに,必要な gems を bundle を使ってインストールします.
FROM ruby:2.0 WORKDIR /tmp COPY ./Gemfile /tmp RUN bundle install --gemfile=/tmp/Gemfile && bundle clean WORKDIR /root
Gemfile の中身は以下のとおりです.
source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem 'minitest', '5.8.4' gem 'concurrent-ruby', '1.0.0' gem 'trema', '0.10.1'
コンテナ内部の /root にマウントするためのディレクトリを作っておきます.
$ mkdir root
以下のような状態になっていることを確認して次に進みます.
$ ls
docker-compose.yml Dockerfile Gemfile root
コンテナ作成
以下のコマンドでコンテナのイメージを作成します.(少し時間がかかります.)
$ sudo docker-compose build
trema を起動
コンテナ内で trema を起動し,バージョンを表示させるプログラムを動作させてみます.--rm オプションがついているため,trema の終了後,コンテナも消去されます.
$ sudo docker-compose run --rm trema trema --version trema version 0.10.1
trema アプリを動かす
./root の下に,以下の内容で hello_trema.rb というファイルを作ります.'Trema started.' と表示するだけの OpenFlow コントローラになります.
class HelloTrema < Trema::Controller def start(_args) logger.info 'Trema started.' end end
このコントローラを起動させるには,以下のようにします.終了させたいときには,Ctrl+C を押してください.
$ sudo docker-compose run --rm trema trema run ./hello_trema.rb
Trema started.
セキュアチャネルを開いて trema アプリを起動
docker-compose run を行う時,docker-compose.yml の ports にセキュアチャネルのポート番号を書いておいても反映されないらしいので,docker-compose のコマンドラインオプションでポート番号を指定します.セキュアチャネルのデフォルトのポート番号は 6653 です.
$ sudo docker-compose run -p 6653:6653 --rm trema trema run ./hello_trema.rb Trema started.
まとめ
docker コンテナ内で Trema を動作させる方法を説明しました.