Monthly Archives: 3月 2015

CentOS 7.0 Go言語 + revel な環境をDockerで構築する

revelとはGo言語で作られたWebアプリケーションフレームワークです。

Go言語自体はC++の代用を試みて開発されている言語なので高速で処理を行えます。
さらに、スクリプト言語に近い形で記述することができて並列処理も得意としています。

そんなGo言語を使って作られたフレームワークは当然のごとく爆速らしいです。

そんなGo言語+revelを最近流行りのDockerを使って開発環境を作りたいと考えました。

イメージとしては、こんな感じにしたいと思います。

1,「Go言語+revel」のイメージ
2,「MySQLなどのデータベース」のイメージ
2, ソースコードやデータベースファイルなどを管理する環境
※ 取りあえず、今回は(1)のみを作成します。

CentOS7.0にDockerのインストールを行う場合は特にリポジトリの追加も必要なく以下のような感じに行う事ができます。

# yum -y update
# yum -y install docker
# systemctl enable docker
# systemctl start docker

※ SELinuxやファイアウォールは各自で設定を行ってください。

雛形となるDockerイメージを作成します。
Dockerfileと呼ばれるファイルにコンテナの構成内容をガリガリ書いていきます。

# vi Dockerfile
FROM centos

RUN useradd revel

RUN yum -y update
RUN yum -y install golang git mercurial sqlite sqlite-devel

ENV GOPATH /var/gocode/
RUN echo 'export GOPATH="$GOPATH"' >> /etc/profile
RUN echo 'export PATH="$PATH:$GOPATH/bin"' >> /etc/profile

RUN mkdir /var/gocode/

RUN go get github.com/revel/revel
RUN go get github.com/revel/cmd/revel
RUN go get github.com/mattn/go-sqlite3

RUN source /etc/profile; revel help

USER revel

ENV HOME /home/revel/
ENV GOPATH /home/revel/gocode/

RUN mkdir -p /home/revel/gocode/{bin,pkg,src}

RUN echo 'export GOPATH="$GOPATH"' >> ~/.bash_profile
RUN echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.bash_profile
RUN echo 'yes no | cp -ripf /var/gocode /home/revel/ > /dev/null 2>&1' >> ~/.bash_profile

EXPOSE 9000
VOLUME /home/revel/gocode/src/

# docker run -it -p 9000:9000 revel bash --login
# docker run -it -p 9000:9000 --volume /root/src:/home/revel/gocode/src revel bash --login
# docker run -it -p 9000:9000 --volume /root/src:/home/revel/gocode/src revel bash --login -c 'revel run sample'

※ revelの実行は原則的にrevelユーザが行います。
※ revelの雛形は/var/gocode/の中に存在していてそれを元にログインのたびに初期化して使用します。
※ revelのソースコードはホスト側や別のコンテナなど外部のボリュームで管理できるようにします。

Dockerfileを元にイメージをビルドします。
イメージにはrevelというイメージ名を付けました。

# docker build --no-cache -t revel .

※ キャッシュを使用しないオプションをつけていますが必要なければ外してしまっても問題ありません。

イメージ一覧はこのように確認できます。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
revel               latest              fb1a981ee328        About an hour ago   753.7 MB
centos              7                   88f9454e60dd        2 weeks ago         223.9 MB
centos              centos7             88f9454e60dd        2 weeks ago         223.9 MB
centos              latest              88f9454e60dd        2 weeks ago         223.9 MB

ホストOS側にソースコードを格納するディレクトリを作成します。

# mkdir /root/src
# chmod 777 /root/src

イメージを元にコンテナを作成してシェルを起動し、フレームワークのサンプルを生成してみます。

# docker run -it -p 9000:9000 -v /root/src:/home/revel/gocode/src revel bash --login
$ revel new sample
$ revel run sample

ブラウザからアクセスできる事を確認します。
URLの例) http://127.0.0.1:9000

WS000010

このような画面が表示できたら一度終了して、ホスト側にソースコードが保存されている事を確認します。

# ls -al /root/src
合計 4
drwxrwxrwx  6 root root   74  3月 20 21:56 .
dr-xr-x---. 3 root root 4096  3月 20 22:19 ..
drwxr-xr-x  3 1000 1000   14  3月 20 21:56 code.google.com
drwxr-xr-x  5 1000 1000   45  3月 20 21:56 github.com
drwxr-xr-x  3 1000 1000   24  3月 20 21:56 gopkg.in
drwxrwxr-x  7 1000 1000  100  3月 20 21:56 sample # <-- これ

新たにコンテナを作成して今度は直接フレームワークを起動します。

# docker run -it -p 9000:9000 -v /root/src:/home/revel/gocode/src \
  revel bash --login -c 'revel run sample'

これで先ほどと同じようにブラウザでアクセスできるはずです。

取りあえず、イメージを作成してみて・・・
予想以上に試行錯誤したので中々大変でしたが、今後の開発に大きく影響を及ぼすような可能性を感じました。

参考サイト
» Docker上でRailsアプリケーション開発 TECHSCORE BLOG
Go – 「最速」フルスタックWebフレームワーク「revel」の紹介 – Qiita