ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

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
docker cp docker-knowledge:/usr/local/tomcat/webapps ./
  • 3.転送したwebappsフォルダをホストのknowwledgeフォルダへ移動
mv ./webapps /usr/local/etc/knowledge
  • 4.docker-composeのdocker-compose.ymlappvolumesを以下のように設定しマウントさせる。
#サービス名「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.ymlproxyconf.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のファイル転送マニュアル

ホスト(ローカル)からコンテナへ転送方法
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ヘッダは(存在する場合は)プロキシに対して値を渡すために使用されます。

参照:HTTPプロキシでのヘッダ制御


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について

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について
  • 以下の設定を行うとリダイレクトの際、httphttpsへ変換して行うことが出来る。
proxy_redirect http:// https://;



参考サイト

Qiitaライクのknowledgeをdocker-composeで楽々導入って記事をQiitaであげる暴挙 - Qiita

Docker を使ってデータの永続化をせずにマストドンをデプロイしてしまったときの対処法 - Qiita

dockerコンテナにファイルを転送する - Qiita

DockerでNginxイメージを利用し、リバースプロキシを構築してみる - Qiita

実践編ーDockerを使ってnginxでリバースプロキシを立ててみる - Qiita

NginxのリバースプロキシでWebソケットを通す際の設定 - Qiita

NginxのWebSocket利用時の設定

proxy_cache_bypassの説明など - Qiita

NGINX コンテントのキャッシング | NGINX 日本語訳

ngx_http_proxy_module モジュール 日本語訳