今日も秋田で IoT

旧 Trema 日記

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-composeのportsの設定が反映されない - Qiita

まとめ

docker コンテナ内で Trema を動作させる方法を説明しました.