はじめに
部署内で情報共有のためWikiを使うとよいのではないか、という話が出ました。最初はMicrosoft TeamsのWikiを使えばよくね?という話でしたが検索機能はないし、バックアップも取れないし、でとても実用にならんだろ、と、調べていくうちにGrowiがよさそうとなりました。
Qiitaでもお馴染みですね。
社内でdocker付きで用意されているUbuntu Serverに立ち上げれば、docker-composeでさくっと設定できるとたかを括っていたのですが、docker初心者にはいろいろと落とし穴が待っていたのでした。
proxyの罠
このGrowiは社内で利用するだけで社外からアクセスはしません。当然会社のproxyの内側に設置します。となると、Ubuntu Serverにツールをインストールするためにproxyを通さねばなりませんので、あれこれproxy設定が必要になります。
ここで特に悩んだのが、dockerのコンテナ内部でキックされるコマンドの場合はどうやってproxyの設定をすればいいのか、でした。(結論から言えば、Dockerfile内にそれぞれのコマンドに対して環境変数で設定する、でした)
以下の記述で、proxyサーバーは「proxy.example.co.jp:11080」だとします。
proxyのホスト名がproxy.example.co.jp、ポート番号が11080
に指定されているということです。ホスト名、ポート番号は会社のIT部門に確認してください
また、Growiのインストールは公式のdocker-composeを使う手順に従って、
/opt/growi の下にgit cloneしたものとします。
docker, docker-comose, gitなどのインストールは省略。
bash
/root/.bashrcに環境変数を設定します。
$ cat /root/.bashrc
export http_proxy="http://proxy.example.co.jp:11080"
export https_proxy="https://proxy.example.co.jp:11080"
$
apt
/etc/apt/apt.conf.d/の下に設定ファイルを追加するのが最近の流儀のようです。
ファイル名はなんでもよくて、同じ内容なら後から読み込んだファイルの内容が有効。
$ cat /etc/apt/apt.conf.d/100proxy.conf
Acquire::http::Proxy "http://proxy.example.co.jp:11080";
Acquire::https::Proxy "http://proxy.example.co.jp:11080";
git
gitコマンドで設定します。
$ sudo su
# git config --global http.proxy http://proxy.example.co.jp:11080/
# git config --global https.proxy https://proxy.example.co.jp:11080/
docker
$ sudo systemctl edit docker
でサービス設定ファイルに記載します。
[Service]
Environment = 'http_proxy=http://proxy.example.co.jp:11080/' 'https_proxy=https://proxy.example.co.jp:11080/'
設定ファイルは
/etc/systemd/system/docker.service.d以下、および
/root/.docker/config.json
に反映されるはずです。
※編集にはデフォルトだと標準エディタのnanoが起動するので、vimで編集したい時は前もって
# update-alternatives --config editor
を実行してvim.basicを選択しておきます。
Elasticsearch Plugin
これはdockerのコンテナ内部からproxyを通すことになりますので、GrowiのDockerfileに環境変数でproxyを記述します。
/opt/growiにGitHubからGrowiのソースをcloneしたとしたら、下記2つのファイルです。
/opt/growi/elasticserch/v7/Dockerfile
/opt/growi/elasticserch/v8/Dockerfile
修正するのは使用する方だけでOKです。(初めから立ち上げるならV8のみでOK)
V7の場合
/opt/growi/elasticserch/v7/Dockerfileの下記の記述を
RUN bin/elasticsearch-plugin install analysis-kuromoji
RUN bin/elasticsearch-plugin install analysis-icu
次のように書き換える。環境変数にhttp, httpsのホスト名、ポート番号をセットしてプラグインをインストールするわけですね。
RUN ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.example.co.jp -Dhttp.proxyPort=11080 -Dhttps.proxyHost=proxy.example.co.jp -Dhttps.proxyPort=11080" bin/elasticsearch-plugin install analysis-kuromoji
RUN ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.example.co.jp -Dhttp.proxyPort=11080 -Dhttps.proxyHost=proxy.example.co.jp -Dhttps.proxyPort=11080" bin/elasticsearch-plugin install analysis-icu
V8の場合
/opt/growi/elasticserch/v8/Dockerfileの書き換えで、v7ではES_JAVA_OPTSのところをCLI_JAVA_OPTSに変えて書き換える(V8で環境変数変わったのわからなくて悩んだ...)
RUN CLI_JAVA_OPTS="-Dhttp.proxyHost=proxy.example.co.jp -Dhttp.proxyPort=11080 -Dhttps.proxyHost=proxy.example.co.jp -Dhttps.proxyPort=11080" bin/elasticsearch-plugin install analysis-kuromoji
RUN CLI_JAVA_OPTS="-Dhttp.proxyHost=proxy.example.co.jp -Dhttp.proxyPort=11080 -Dhttps.proxyHost=proxy.example.co.jp -Dhttps.proxyPort=11080" bin/elasticsearch-plugin install analysis-icu
curl
これもdockerコンテナ内部からproxyを通す必要があります。
/opt/growi/Dockerfileの中に下記の記載でcurlがキックされますから、
RUN apt-get update && apt-get install -y curl \
&& curl -sL https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
| tar -xz -C /usr/local/bin
上記の行より前に下記を挿入し、環境変数を設定してからcurlが起動するようにします。
ENV http_proxy "http:proxy.example.co.jp:11080"
ENV https_proxy "http:proxy.example.co.jp:11080"
RUN apt-get update && apt-get install -y curl \
&& curl -sL https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
| tar -xz -C /usr/local/bin
以上でproxyの設定は完了です。docker-composeを起動してproxyエラーが出たら見直してください。
dockerの罠
Growiを立ち上げるためにdocker-composeを利用するのですが、そのためには当然dockerを動かす必要があります。dockerはデフォルトブリッジや内部ネットワークを設定してくれるのですが、そのアドレス範囲が172.17.0.0/16です。運悪くこのアドレスが社内ネットワークの自分の部署のIPアドレスとかぶっていたため、dockerコンテナ(Growiサーバー)へのアクセスが不安定になってしまいました。このため、dockerが使用するIPアドレスを他の範囲に変更する必要がありました。
IT部門から提供されているdockerインストール済みUbuntu Serverには「dockerの内部IPアドレスと重なる事業所があるので、その場合はxxx.xxx.0.0/16をdockerで使用するように」と注意書きがあったものの、どうやればIPアドレスを変更できるのかまでは記載されていません。問い合わせても「それは利用部門でよろしく」と丸投げです。(まあIPアドレスかぶりのリスクをアナウンスしてくれていただけでもありがたいですが。)
解決にはこちらを参考にさせていただきました。
[余談] うちのIT部門から借り受けたDocker付きUbuntu Serverは、最初から空のコンテナが一つ起動していたため、そいつを止めてコンテナを削除してイメージを消さないと、下記の設定に進めなかったような遠い記憶がありますがもはやうろ覚え(^_^;)
なんでわざわざ空コンテナ立ててたんだ、うちのIT部門
docker設定
/etc/docker/daemon.json というファイルを作って、default-address-poolsに所定のアドレス範囲を記述することで、dockerが使用する内部ネットワークのIPアドレスを変更することができます。(ここではIT部門から指定された、他と被らないアドレスである10.123.0.0/16を使用するものとします。)
まずはdockerを停止
# systemctl stop docker
/etc/docker/daemon.jsonファイルを作成
{
"default-address-pools":[
{
"base":"10.123.0.0./16",
"size":24
}
]
}
docker再起動
# systemctl daemon-reload
# systemctl restart docker
[余談]なにぶんdocker, docker-composeとも初心者なもので設定ファイルをいじる時は一度コンテナを停止させるとかdockerを停止させてからじゃないとおかしなことになる、というのを身をもって体験しました(^_^;)
- docker-composeコマンドを使う時は、docker-compose.ymlファイルの置かれたディレクトリで実行する(up, down, start, stopなどの操作の時)
- docker-compose.ymlファイルを編集する場合は #docker-compose down でコンテナを停止してから行い、コンテナを消去してから#docker-compose buildでコンテナを作り直すべし
- コンテナを作り直す時はキャッシュクリアした方が確実(#docker-comose --verbose build --no-cache)
- Dockerfileを修正したり、/etc/docker/daemon.jsonを修正したりするときは一度dockerを停止した方がいい(#systemctl stop docker)
(初心者なので間違ってたらなにとぞご容赦)
その他
以上で無事docker-composeでGrowiが起動する、、、はずなのですが、
$ cd /opt/growi
$ sudo docker-compose up -d
でElasticsearchのイメージがうまくbuildできないことがありました。その場合
$ cd /opt/growi
$ sudo su
# docker-compose up -d
のように、rootになってから起動するとすんなりと起動できるという経験をしました。記載したproxyの設定が不十分なのかもしれません。
その後またElasticsearchをうまくbuildできない現象が再発し、sudo suでrootになってもNGでしたので問題は別のところにある模様です。リポジトリ側かな??
解決したら記述を修正します。
記事中にtypoあったらごめんなさい...
補足
Growiの設定とかdocker-composeコマンドとかを補足しました。
Growi管理(docker)を習熟するため、練習用ダミーのGrowiを立てました。
Growiデータのバックアップ、リストア方法をまとめました。
参考資料
dockerコンテナに環境変数を引き渡す方法は見よう見まねで解決しましたが、わかりやすく解説していただいた記事を読むことで腹落ちしました。
Docker で環境変数をホストからコンテナに渡す方法(ホスト OS 側からゲスト OS に渡す方法各種) #docker-compose - Qiita