"最近会社で聞かれて答えたことをまとめる"ために、テスト用のサーバーを作っていたりします。
Oracle 11g XEやOracle 18c XEもその一環です。
そんなテスト用のサーバーを作る時に"docker"は便利です。最近動かした、そんなサーバーたちをまとめてみました。
単に公式公開されたものを"docker run"するだけのものもあれば、"docker build"+"docker run"しているものもあります。
"docker build"しているものについて、レイヤー構造を意識したDockerfileになっていません。不勉強ということでご容赦ください。
安易なパスワードが固定的に書いてあったりします。動作を確認するときだけ稼働させるテスト用サーバーという点、SSHトンネル経由でしか接続しないので通信路がSSHで保護されている点、dockerホストのSSHログイン認証で保護されている点、などの事情を考えてのことですので、突っ込みはご遠慮ください。
動かしてみたサーバーたち
Oracle 18c XE
先日記事にしたものです。1時間以内に構築完了できる程度の手軽さでセットアップできるものでした。
Oracle 11g XE
試してみたところ、"18c XE"同様、こちらも簡単にできました。手順の中で"18c XE"から以下を変えたくらいです。
- 使用するZIPファイルが"oracle-xe-11.2.0-1.0.x86_64.rpm.zip"です。
- unzipに渡すファイルパスが"docker-images-master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/*"です。
- コンテナ起動時の引数に"--shm-size=1g"が必要です。
- インストール先が"/u01/app"なので、alertログファイルは"/u01/app/oracle/diag/rdbms/xe/XE/trace/alert_XE.log"に格納されます。
- sqlplusはパスが通っているからフルパスではなく"sqlplus"だけで実行可能です。
SqlPlus ( Oracle Instant Client )
以下の感じで構築が可能です。以下は18cですが19cも同様です。
curl -s https://github.com/oracle/docker-images/archive/master.zip | awk 'BEGIN {FS="\""} {print $2}' | xargs curl -s -o docker-images-master.zip
unzip -j docker-images-master.zip docker-images-master/OracleInstantClient/dockerfiles/18/Dockerfile
docker build --pull -t oracle/instantclient:18 .
実行は以下の感じです。19cも同様です。"LANG="指定は文字化けを回避するためのものです。本当は18cには"LANG="は不要ですが、19cは指定しないと文字化けするようです。
LANG= docker run -ti --rm --name=sqlplus19 oracle/instantclient:18 sqlplus TEST/TEST@127.0.0.1/XE
Postgres
これも公式から提供されています。Oracleよりもお手軽で、環境変数にパスワードをセットする程度の手軽さで構築できます。
docker run -d --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 postgres
pgAdmin4
これも公式から提供されています。
docker run -d --name pgadmin4 -e 'PGADMIN_DEFAULT_EMAIL=user@example.com' -e 'PGADMIN_DEFAULT_PASSWORD=password' -p 10080:80 dpage/pgadmin4
pocari/mailcatcher
今までメール送信をテストするとき、WindowsではSimpleMailServerをメールサーバーに見立てていました。ローカルで起動して、メモリ上にメールを溜め込み、POPで吐き出すテスト用サーバーです。
しかし、これだと他の人に環境構築を説明するときに困ったことがありました。Thunderbirdを使っている人に使ってもらおうとしたら、メール接続設定が大変でした。Thunderbirdはメールアドレスなどから接続先サーバーを自動設定する&設定保存時にバリデーションがかかります。そのため、うまく設定するためのコツがいろいろと必要でした。
MailCatcherは、受信メールをPOPで取りに行く必要なく、Webメールのように参照するスタイルです。そのため、Thunderbirdなどの設定は不要です。Webブラウザで接続するだけでよい、というのは説明がしやすいです。
さらに、MailCatcherをdocker化したpocari/mailcatcherを使わせてもらうだけで充分です。
Subversion server
当初は"elleflorio/svn-server"を使おうとした記憶があります。しかし、ユーザー登録は固定的でいいとか、むしろ認証なしでもいいとか、多彩な機能がいらないと思うところがあって、最小機能を"docker build"することにしました。
参考にしたサイトがあったはずです。どこだったか忘れてしまいました。
- 想定接続方法 : svn://localhost/ (認証なし)
- docker build -t my/svn-server .
- docker run -d --name svn-server -p 3690:3690 my/cvs-server
Dockerfileは下に載せてあります。これはいい感じに小さくできたと思っています。
FROM alpine
RUN apk add subversion sed
RUN mkdir -p /var/svn/repos
RUN svnadmin create /var/svn/repos
RUN chmod -R 755 /var/svn
RUN svn mkdir file://localhost/var/svn/repos/trunk -m "create"
RUN svn mkdir file://localhost/var/svn/repos/branches -m "create"
RUN svn mkdir file://localhost/var/svn/repos/tags -m "create"
RUN svn copy file://localhost/var/svn/repos/trunk file://localhost/var/svn/repos/tags/release-1.1 -m "Release 1.0"
RUN /bin/sed -i -e 's/^# anon-access = read.*/anon-access=write/' /var/svn/repos/conf/svnserve.conf
CMD [ "/usr/bin/svnserve", "--daemon", "--foreground", "-r", "/var/svn/repos" ]
CVS server
ええ。あのCVS serverです。そろそろ使わなくてよくなるのではないかと思っています。しかし、まだ動いています。質問されることも滅多にないだろうと思っています。ただ、いざという時のために作っておきます。
- 想定接続方法 : extssh:linuser @ 127.0.0.1:10022/home/cvsroot/ (Eclipse)
- docker build -t my/cvs-server .
- docker run -d --name cvs-server -p 10022:22 my/cvs-server
Dockerfileは下に載せてあります。セットアップの容易さから、pserverではなくsshd+cvsでいくことにしました。もう少しDockerfileやimageを小さくできればと思っています。
フォアグラウンド起動できないプログラムをdockerで起動するときに"&& tail -f /dev/null &"なんてのを付けるテクニックがあります。なるほどと思いつつ、"sshd"は"フォアグラウンド起動できるプログラム"なので、ここでは単に"-D"を付けるだけにしてあります。
"dockerにsshdを入れる"記事を見ると、しばしば"/sbin/init"とか"supervisor"とか"tail -f /dev/null"とか見かけます。"/usr/sbin/sshd -D"とかも一つの方法だということを投じておきます。
FROM debian
RUN apt-get update && apt-get -y install cvs apache2-utils openssh-server
RUN groupadd cvs
RUN useradd -G cvs -m linuser
RUN echo linuser:linuser | chpasswd
RUN mkdir /home/cvsroot
RUN cvs -d /home/cvsroot init
RUN chmod 644 /home/cvsroot/CVSROOT/config
RUN htpasswd -nb linuser linuser > /home/cvsroot/CVSROOT/passwd
RUN chmod 644 /home/cvsroot/CVSROOT/passwd
RUN mkdir /home/cvsroot/test
RUN chgrp -R cvs /home/cvsroot
RUN chmod -R g+w /home/cvsroot
RUN /etc/init.d/ssh start && /etc/init.d/ssh stop
CMD [ "/usr/sbin/sshd", "-D" ]
まとめ
半分はdockerの勉強を兼ねています。使ってみないとわからない部分、実際にDockerfileを書いてみないとわからない部分というのがあります。まだdocker勉強し始めたばかりなのでわかっていないことも多いと思います。しかし精進あるのみです。