Docker

2017年11月 5日 (日)

Dataloader+MariaDB Connector/JのDockerイメージを作りました

これから少しずつSalesforce関連の情報をBlogに残していきたいと思います。今回はこれだけ見ると何の意味もなさそうですが、これから先の記事のベースになるDataloaderとMariaDB(MySQL互換DB)とやり取りをするために、必要な Connectorをまとめたコンテナを作成してDockerHubにおいておきました。
DockerHubのURL : https://hub.docker.com/r/okazakiyuji/dataloader/
Dockerfileは
FROM centos
MAINTAINER okazakiyuji <zaki@mbf.nifty.com>
RUN localedef -f UTF-8 -i ja_JP /usr/lib/locale/ja_JP.UTF-8
RUN yum -y update && \
    yum -y install git svn java-1.8.0-openjdk maven unzip mysql && \
    yum clean all
# Build Dataloader
WORKDIR /tmp
ADD https://github.com/forcedotcom/dataloader/archive/master.zip ./
ENV DL_VER 40.0.0
ENV DL_BIN_DIR /root/dl/bin
RUN mkdir -p $DL_BIN_DIR
RUN unzip master.zip && \
    cd ./dataloader-master && \
    mvn clean package -DskipTests && \
    mv target/dataloader-$DL_VER-uber.jar $DL_BIN_DIR && \
    cp license.txt $DL_BIN_DIR/dataloader-license.txt && \
    cd .. && rm -r ./dataloader-master ./master.zip
# Install mysql connector
ENV MYSQL_CON_VER 2.1.0
ADD https://downloads.mariadb.com/Connectors/java/connector-java-$MYSQL_CON_VER/mariadb-java-client-$MYSQL_CON_VER.jar $DL_BIN_DIR/
# Copy scripts
WORKDIR $DL_BIN_DIR
ADD encript.sh ./
ADD process.sh ./
RUN chmod a+x encript.sh process.sh
ENV DATALOADER_CLASSPATH $DL_BIN_DIR/mariadb-java-client-$MYSQL_CON_VER.jar:$DL_BIN_DIR/dataloader-$DL_VER-uber.jar
ENV PATH $PATH:$DL_BIN_DIR
Dockerfileの先頭で
FROM:okazakiyuji/dataloader
のように指定していただければ使えます。といっても難しいと思うので、次は、このコンテナを使用して、SalesforceからMariaDBへのバックアップについての記事を書きます。

| | コメント (0) | トラックバック (0)

2017年8月27日 (日)

Dockerでkanon(Trac)を動かしてみた2 - イメージの作成

前の記事で、多くの人は必要ない部分としてイメージの作成については触れていなかったので、ここで解説します。素人なので、間違っているところもあると思うので、お気づきの点は教えてください。
まずはファイルを取得します。
$ hg clone https://bitbucket.org/okazakiyuji/kanon
$ cd kanon
$ hg update org
リポジトリのファイル(ゴミもあります)の一覧です。
(1) Dockerfile
イメージを作成するためのファイル
(2) docker-entrypoint.sh
runで実行するときに起動するスクリプト
(3) kanon-setup
修正してあるインストーラ
(4) pkglist.rhel6
yumでインストールするパッケージ、ビルドの初期に実行したいのでKanonから抜き出した
(5) pluginlist
インストールするプラグインのURL
上書きするファイルの(3),(5)の修正内容
・元のKanonConductorでうまくインストールできない場所を修正する
 プラグインのインストール元をhttp->httpsに変更(3),(5)
・コンテナ化のために必要なこと
 インストールの初期の質問はなしにする(3)
 Maven, Jenkinsは無効に(3)
 SELinuxの無効化もしない(3)
 SampleProjectはインストールしない(3)
 サービスは動かさない(3)
残りの二つのファイルはデータの永続化のための処理が入っています。内容の説明はファイル内のコメントでご勘弁を
(1) Dockerfile
$ cat Dockerfile
FROM centos:6
MAINTAINER okazakiyuji <zaki@mbf.nifty.com>
# ロケールの設定
RUN localedef -f UTF-8 -i ja_JP /usr/lib/locale/ja_JP.UTF-8
# パッケージのインストール kanon-setupのものも先にインストールする
ADD pkglist.rhel6 /tmp/
RUN yum -y update && \
    yum -y install mercurial `cat /tmp/pkglist.rhel6` subversion-python && \
    yum clean all
# セットアップに必要な環境変数
ENV KANON_IN_CONTAINER 1
ENV MAVEN "n"
ENV JENKINS "n"
# マウントするフォルダの退避先を作成
RUN mkdir -p /tmp/save
# 上書きするファイルを/tmpにコピーする
COPY kanon-setup /tmp/kanon-setup
COPY pluginlist /tmp/pluginlist
# インストール、マウントするフォルダをコピー、いらないファイルの削除
RUN hg clone https://bitbucket.org/okamototk/kanonconductor \
        /tmp/kanonconductor && \
    cd /tmp && \
    cp kanon-setup kanonconductor/ && \
    cp pluginlist kanonconductor/ && \
    /tmp/kanonconductor/kanon-setup && \
    cd /tmp/save && \
    cp -r /var/opt/kanon ./var && \
    cp -r /etc/opt/kanon ./etc && \
    cp -r /opt/kanon/lib ./lib && \
    cd /tmp && rm -rf kanonconductor kanon-setup
# マウントする場所を明示しておく
VOLUME /opt/kanon/lib
VOLUME /etc/opt/kanon
VOLUME /var/opt/kanon
# ホストに接続するポート
EXPOSE 80
# 実行時に動くスクリプトのコピー
ADD docker-entrypoint.sh /
# 実行時に起動するファイルの指定
ENTRYPOINT ["/docker-entrypoint.sh"]
# 実行時のスクリプトに渡す引数(コマンド)
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
(2) docker-entrypoint.sh
$ cat docker-entrypoint.sh
#!/bin/bash
# マウントしたフォルダに何もない場合は初回の起動とする
if [ ! -d /var/opt/kanon/trac ] ; then
    # 初回起動時はコピーしていたファイルを戻す
    cp -r /tmp/save/lib /opt/kanon/
    cp -r /tmp/save/var/* /var/opt/kanon/
    cp -r /tmp/save/etc/* /etc/opt/kanon/
fi
if [ "$1" = '/usr/sbin/apachectl' ]; then
    # https://github.com/CentOS/CentOS-Dockerfiles/blob/master/httpd/centos6/run-httpd.sh を参照した
    rm -rf /run/httpd/*
    exec /usr/sbin/apachectl -D FOREGROUND
    exit 0
fi
# CMDで/usr/sbin/apachectl以外が指定された場合はそのままコマンドとして実行する
exec "$@"

| | コメント (0) | トラックバック (0)

Dockerでkanon(Trac)を動かしてみた

長い間他の仕事をしていて、久しぶりにサーバ管理に戻ってきました。戻ってくると、VM(仮想マシン)が山ほどあり、Kanon使っているだけなのに、無駄にリソースを消費するし、多すぎてもう管理できなくなってます(T_T)。ということで、だいぶほったらかしていた「DockerでKanonを動かす」をやってみることにしました。Dockerfileの細かい内容は知らなくても使えるので、この記事ではGithubのイメージを持ってきて試す記事になってます。
○要件
・ コンテナのなかに複数プロジェクト(kanonなら問題なし)
・ VMのなかに複数の仕切られた空間
・ Dockerのビルドでインストールまで(ほぼ)完了する
・ 実行時にプロジェクト作成/trac-admin実行できる
・ データは永続化する
・ 再起動時に自動起動
○調べて試したこと

・ コミットしないで終了して再起動すると元に戻る
データの永続化はボリュームをマウントする。 今回はデータボリュームコンテナにする
・ ビルド時にデータがある場所に、実行時に空のマウントするとデータは消える
Dockerfile内のビルドの最後で、マウントするフォルダ(/var/opt/kanon, /etc/opt/kanon, /opt/kanon/lib)を退避しておき、コンテナの起動時に動くスクリプトで、初回の一回だけデータをコピーする。
・ 複数のコンテナの起動はDocker-composeで簡単にできる
docker-compose.ymlファイル内のサービスの定義をコピーして、名前とポートとデータボリュームコンテナ名を変更するだけ。必要ならホストのFirewallはあけてください。
・ コンテナ内では一つのサービス、apacheはFOREGROUNDで
・ コンテナの自動再始動はrestart: alwaysでできる

docker-compose.ymlファイル内で指定
Kanonのコンテナを作成することは置いておいて、DockerHubから持ってきたイメージでの確認の手順です。
0. インストール
・ OSのインストール
CentOS の GNOME Desktopでインストールする,ユーザはsudo使えるように管理者にしておいた方がいいでしょう。
・ dockerのインストール
$ sudo yum update && yum -y install docker
$ sudo systemctl start docker
$ sudo systemctl enable docker
・ docker-composeのインストール
https://github.com/docker/compose/releases にインストール方法が書いてます(一応rcはやめて一つ前のものにする)
$ curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` > docker-compose
$ chmod +x ./docker-compose
$ sudo mv ./docker-compose /usr/bin/docker-compose
1. フォルダ作成して移動
$ mkdir kanon_containers
$ cd kanon_containers
2. docker-compose.ymlファイル作成
$ vi docker-compose.yml
version: '2'
services:
  kanon_1:
    # とりあえず動くように作ったコンテナを持ってくる
    image: okazakiyuji/kanon:org
    volumes: # 運用時に変更されるフォルダにデータボリュームコンテナをマウントする
      - kanon_1-var:/var/opt/kanon
      - kanon_1-etc:/etc/opt/kanon
      - kanon_1-lib:/opt/kanon/lib
    ports:
      - "8081:80"
    restart: always # 再起動時に再始動
  kanon_2: # portとデータボリュームコンテナ名を変更して二つ目のKanon
    image: okazakiyuji/kanon:org
    volumes:
      - kanon_2-var:/var/opt/kanon
      - kanon_2-etc:/etc/opt/kanon
      - kanon_2-lib:/opt/kanon/lib
    ports:
      - "8082:80" # 別のポート
    restart: always
volumes:
  kanon_1-var:
    driver: local
  kanon_1-etc:
    driver: local
  kanon_1-lib:
    driver: local
  kanon_2-var:
    driver: local
  kanon_2-etc:
    driver: local
  kanon_2-lib:
    driver: local
3. Dockerイメージを持ってくる
$ sudo docker pull okazakiyuji/kanon:org
コンテナの中身についてはあとで…
4. コンテナを起動する
$ sudo docker-compose up -d
...
コンテナ起動中
...
$ curl http://localhost:8081/trac
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Available Projects</title>
  </head>
  <body>
    <h1>Available Projects</h1>
    <ul>
    </ul>
  </body>
※ localhost:8081/tracでプロジェクトがないが、エラーは出ないことを確認
サーバの外から見えない場合はFirewallの設定を変更してください
$ curl http://localhost:8082/trac
...
※ localhost:8082/tracでプロジェクトがないが、エラーは出ないことを確認
5. プロジェクトを作成
$ sudo docker-compose exec kanon_1 /bin/bash
[root@6b47e7284acc /]# /opt/kanon/bin/kanon-create-project test1 svn default n
...
プロジェクトの作成
...
[root@6b47e7284acc /]# exit
$ sudo docker-compose exec kanon_2 /bin/bash
[root@fad824e04e58 /]# /opt/kanon/bin/kanon-create-project test2 svn default n
...
プロジェクトの作成
...
$ curl http://localhost:8081/trac
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Available Projects</title>
  </head>
  <body>
    <h1>Available Projects</h1>
    <ul>
      <li>
        <a href="/trac/test1" title="My example project">test1</a>
      </li>
    </ul>
  </body>
</html>
※ localhost:8081/tracでプロジェクトtestが追加されていることを確認
$ curl http://localhost:8082/trac
...
※ localhost:8082/tracでプロジェクトtest2が追加されていることを確認
6. 再起動してもコンテナが起動するかを確認
$ sudo reboot now
...
再起動
...
※ localhost:8081/tracでプロジェクトtestが追加されていることを確認
7. データコンテナを削除
確認後に削除したい場合は次のように
$ sudo docker-compose down
$ sudo docker volume ls
...
local               kanoncontainers_kanon_1-etc
local               kanoncontainers_kanon_1-lib
local               kanoncontainers_kanon_1-var
local               kanoncontainers_kanon_2-etc
local               kanoncontainers_kanon_2-lib
local               kanoncontainers_kanon_2-var
$ sudo docker volume rm kanoncontainers_kanon_1-etc kanoncontainers_kanon_1-lib kanoncontainers_kanon_1-var
$ sudo docker volume rm kanoncontainers_kanon_2-etc kanoncontainers_kanon_2-lib kanoncontainers_kanon_2-var
これで運用までうまくいくと思うんですが…

| | コメント (0) | トラックバック (0)