Dockerセットアップ 第5弾
docker-knowledgeをNginx経由に変更
1.完成形のdocker-compose.ymlファイルの内容を確認
- 以下の
docker-compose.yml
を元に準備する。
version: '3' #swarm-mode対応http://docs.docker.jp/engine/swarm/index.html services: app: image: koda/docker-knowledge:latest #コンテナ名を明示的に指定する container_name: docker-knowledge volumes: - /usr/local/etc/knowledge/webapps:/usr/local/tomcat/webapps ports: - 8080:8080 restart: always tty: true #dbが起動してからappが起動する. depends_on: - db proxy: image: nginx:latest #コンテナ名を明示的に指定する container_name: reverse-proxy volumes: - /usr/local/etc/knowledge/html:/usr/share/nginx/html - /usr/local/etc/knowledge/nginx/conf.d/:/etc/nginx/conf.d ports: - 80:80 restart: always tty: true db: image: postgres:latest #コンテナ名を明示的に指定する container_name: postgres #コンテナの環境変数を追加する。 #build オプションと合わせて指定すると、build中は enviroment で指定した #環境変数は見えないことに注意。 #build に変数を渡す場合は args オプションで指定する。 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=admin123 - POSTGRES_DB=docker_knowledge volumes: - /usr/local/etc/knowledge/postgres/data:/var/lib/postgresql/data restart: always tty: true
2.docker-knowledgeのパスを「/knowledge」に変更
- docker-knowledgeをそのままインストールすると以下のURLになる。
http://<グローバルIP>/open.knowledge/list
- 上記のURLを以下のように変更させる
http://<グローバルIP>/knowledge/open.knowledge/list
3.docker-knowledgeの「warファイル」を「knowledge.war」も増やす
- docker-knowledgeの以下のパスに
ROOT.war
がある。
/usr/local/tomcat/webapps/ROOT.war
- 上記の
ROOT.war
ファイルをコピーしknowledge.war
リネームする
cp /usr/local/tomcat/webapps/ROOT.war /usr/local/tomcat/webapps/knowledge.war
やり方
- 1.下記のコマンドでdocker-knowledgeのコンテナに入る。
docker-compose exec app bash
- 2.下記のコマンドを実行し
knowledge.war
を作成する。
cp /usr/local/tomcat/webapps/ROOT.war /usr/local/tomcat/webapps/knowledge.war
- 3.tomcatを停止して、起動させ反映させる。
/tomcat/bin/catalina.sh stop /tomcat/bin/catalina.sh run
但し、このやり方だとコンテナを再構築した際に再設定が必要
以下の方法がオススメ
- 1.ホストに
knowledge
のフォルダを作成
#knowledgeフォルダを作成 mkdir /usr/local/etc/knowledge
- 2.コンテナからに
webapps
のフォルダごとホスト側へ転送 Dockerのファイル転送について
docker cp docker-knowledge:/usr/local/tomcat/webapps ./
- 3.転送した
webapps
フォルダをホストのknowwledge
フォルダへ移動
mv ./webapps /usr/local/etc/knowledge
- 4.docker-composeの
docker-compose.yml
のapp
のvolumes
を以下のように設定しマウントさせる。
#サービス名「app」のvolumes volumes: - /usr/local/etc/knowledge/webapps:/usr/local/tomcat/webapps
- 5.上記1から4を設定すると以下のコマンドでコンテナ再起動しても設定は消えない
docker-compose -f [ymlファイル名] up -d
4.Nginxコンテナにリバースプロキシの設定を行う
- 1.ホストに
nginx/conf.d
のフォルダを作成
#nginxフォルダを作成 mkdir /usr/local/etc/knowledge/nginx #次にconf.dフォルダを作成 mkdir /usr/local/etc/knowledge/conf.d
- ホストの
conf.d
フォルダに移動しdefault.conf(nginx.conf)
を作成しconfの中身を以下のように記述し設定する。
server { listen 80; server_name localhost; map $http_upgrade $connection_upgrade { default upgrade; '' close; } location / { root /usr/share/nginx/html; index index.html index.htm; } location /knowledge { proxy_pass http://xx.xx.xx.xx:8080/knowledge; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_redirect http:// https://; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ /\.ht { deny all; } }
default.conf(nginx.conf)
の以下の部分がdocker-knowledge
とリバースプロキシ設定部分
location /knowledge { proxy_pass http://xx.xx.xx.xx:8080/knowledge; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_redirect http:// https://; }
default.conf(nginx.conf)
作成後、docker-composeのdocker-compose.yml
のproxy
のconf.d
フォルダをホストのconf.d
フォルダとマウントさせる。
#サービス名「proxy」のvolumes volumes: - /usr/local/etc/knowledge/nginx/conf.d/:/etc/nginx/conf.d
- 変更後、以下のコマンドでdocker-composeを起動させコンテナを再起動し反映させる。
docker-compose -f docker-compose.yml up -d
Dockerのファイル転送について
ホスト(ローカル)からコンテナへ転送方法
docker cp [オプション] ローカル・パス|- コンテナ名:パス docker cp /tmp/local_file.php container_test1:/tmp/local_copy_file.php
※コピー先にファイルを指定しない場合には新しく作成されます。
コンテナからホスト(ローカル)へ転送方法
docker cp [オプション] コンテナ名:パス ローカル・パス|- docker cp container_test1:/tmp/container_file.php /tmp/container_copy_file.php
Nginxのproxy設定について
proxy_http_versionについて
- HTTPプロトコルバージョンを指定します。
- webソケットに必要な
keep-aliveはバージョン1.1以降
で利用可能ですがデフォルトでは1.0なので明示的に指定する
必要があります。
※下記の「proxy_set_header Upgrade」や 「proxy_set_header Connection」も1.1以降でのみ利用可能なヘッダ設定です。
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgradeについて
- プロトコルスイッチという仕組みで通信プロトコルをHTTP/1.1からwebsocketに変更します。
- プロコルスイッチはHTTP/1.1から利用可能になった仕組みです。 先ほどの公式の記事に記載があります。
proxy_set_header Upgrade $http_upgrade;
- 詳細
- ここで紹介しているUpgradeと次のConnectionは、Hop-by-hopヘッダと呼ばれる特殊なヘッダ情報です。通常のEnd-to-endヘッダは情報を最終的な宛先に届けるために使用するのに対し、Hop-by-hopヘッダは(存在する場合は)プロキシに対して値を渡すために使用されます。
proxy_set_header Connection upgrade|closeについて
- 送信先にコネクションを維持するか否かを伝えるためのヘッダーです。
- $http_upgradeの値に応じて設定済みの、「upgrade」あるいは「close」を設定
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $hostについて
- 設定を入れないとnginxによるリバースプロキシでは、HTTPのHostヘッダが
nginxにより書き換えられてバックエンドのサーバ
に伝わる。 - これを防ぐため、以下の設定を行い、
バックエンドのサーバ
にも、nginxにアクセスされた時と同様のHostヘッダを付与させるよう
に出来る。
proxy_set_header Host $host;
proxy_cache_bypassについて
- キャッシュ(した値)を使わないレスポンスを定義。
- `stringに指定した値($http_upgradeなどの値)'すべてが空、あるいは0の時はレスポンスに対してキャッシュを使わない
proxy_cache_bypass <string> #記載例: proxy_cache_bypass $http_upgrade;
おまけ1 proxy_no_cacheについて
- キャッシュに取らないレスポンスを定義。
proxy_cache_bypass
と同様に`stringに指定した値($http_upgradeなどの値)'すべてが空、あるいは0の時はレスポンスに対してキャッシュを使わない
proxy_no_cache <string> #記載例: proxy_no_cache $http_upgrade;
おまけ2 proxy_cache_keyについて
- キャッシュするキーを指定。
proxy_cache_key <string> #記載例: proxy_cache_key $scheme$proxy_host$request_uri;
おまけ3 proxy_cache_validにつて
- キャッシュされたレスポンスのうち、ステータスコードを指定してその対象の有効時間を制限する。
- デフォルトだとレスポンスがキャッシュされる時間は無制限。キャッシュのファイルストレージ超過時に使用されていないものから削除される。
- すべてのステータスコードを指定する場合はコードの代わりに
any
を指定する。
proxy_cache_valid [code ...] time #記載例: #以下の記述例だと、200と302コードのレスポンスはキャッシュの中では10分間有効になる。 proxy_cache_valid 200 302 10m;
proxy_redirectについて
- 以下の設定を行うとリダイレクトの際、
http
をhttps
へ変換して行うことが出来る。
proxy_redirect http:// https://;
参考サイト
Qiitaライクのknowledgeをdocker-composeで楽々導入って記事をQiitaであげる暴挙 - Qiita
Docker を使ってデータの永続化をせずにマストドンをデプロイしてしまったときの対処法 - Qiita
DockerでNginxイメージを利用し、リバースプロキシを構築してみる - Qiita
実践編ーDockerを使ってnginxでリバースプロキシを立ててみる - Qiita
NginxのリバースプロキシでWebソケットを通す際の設定 - Qiita
proxy_cache_bypassの説明など - Qiita