Dockerでいろいろなサーバーを動かしてみる 2020年4月版

"最近会社で聞かれて答えたことをまとめる"ために、テスト用のサーバーを作っていたりします。

[Oracle 11g XE](https://qiita.com/szly/items/4b610f51a3172c04f5d2)や[Oracle 18c XE](https://qiita.com/szly/items/e75bfa2ccde3ef205512)もその一環です。

そんなテスト用のサーバーを作る時に"docker"は便利です。最近動かした、そんなサーバーたちをまとめてみました。

単に公式公開されたものを"docker run"するだけのものもあれば、"docker build"+"docker run"しているものもあります。

"docker build"しているものについて、レイヤー構造を意識したDockerfileになっていません。不勉強ということでご容赦ください。

安易なパスワードが固定的に書いてあったりします。動作を確認するときだけ稼働させるテスト用サーバーという点、SSHトンネル経由でしか接続しないので通信路がSSHで保護されている点、dockerホストのSSHログイン認証で保護されている点、などの事情を考えてのことですので、突っ込みはご遠慮ください。

# 動かしてみたサーバーたち

## Oracle 18c XE

[先日記事にしたもの](https://qiita.com/szly/items/e75bfa2ccde3ef205512)です。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

これも[公式](https://hub.docker.com/_/postgres/)から提供されています。Oracleよりもお手軽で、環境変数にパスワードをセットする程度の手軽さで構築できます。

```
docker run -d --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 postgres
```

## pgAdmin4

これも[公式](https://hub.docker.com/r/dpage/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](https://www.vector.co.jp/soft/win95/net/se255028.html)をメールサーバーに見立てていました。ローカルで起動して、メモリ上にメールを溜め込み、POPで吐き出すテスト用サーバーです。

しかし、これだと他の人に環境構築を説明するときに困ったことがありました。Thunderbirdを使っている人に使ってもらおうとしたら、メール接続設定が大変でした。Thunderbirdはメールアドレスなどから接続先サーバーを自動設定する＆設定保存時にバリデーションがかかります。そのため、うまく設定するためのコツがいろいろと必要でした。

MailCatcherは、受信メールをPOPで取りに行く必要なく、Webメールのように参照するスタイルです。そのため、Thunderbirdなどの設定は不要です。Webブラウザで接続するだけでよい、というのは説明がしやすいです。

さらに、MailCatcherをdocker化した[pocari/mailcatcher](https://qiita.com/pocari/items/de0436c39ffc65647cf0)を使わせてもらうだけで充分です。

## 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"を付けるだけ](http://www.unixuser.org/~euske/doc/openssh/book/appendix.html#openssh-options-sshd)にしてあります。

"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勉強し始めたばかりなのでわかっていないことも多いと思います。しかし精進あるのみです。