DockerコンテナとしてproxyサーバとコンテンツサーバをNginxで構築

#目的
NginxとDockerの理解をちょっとでも深めたい！

#概要
- nginxのプロキシの仕方を実際に構築
- Dockerコンテナとしてフロントのnginxとバックエンドのnginxを分離

#手順
##nginxのテンプレイメージ作成
centos7上で動くnginxの元イメージ作成して、コンテンツとしても
プロキシサーバとしても使い回すよ！

###centosイメージを取得
下記コマンドでチェックしてcentosってやつをpullしまっすー
`$ docker search centos`

###nginxをインストール
bash起動してそこに仮想コンソールを繋いでインストール作業するよ
`$ docker run -it #イメージ名# bash`

nginxがレポジトリが標準でないので追加する。
`# vi /etc/yum.repos.d/nginx.repo`


```nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```

nginxをインストール
`# yum -y install nginx`
バージョンの確認
` # nginx -v`
自動起動設定
` # systemctl enable nginx`
起動
` # systemctl start nginx`


ところが。。。

nginx起動で下記出力が発生
``Failed to get D-Bus connection: Operation not permitted``

dockerでsystemctlを使うためには一工夫必要だが、
わざわざそうさせる必要はないため直接起動させる。
`# /usr/sbin/nginx`

一旦このイメージを保存する

``ctrl+p ctrl+q で抜ける。
 # docker commit $(docker ps -l -q) #イメージ名#``
※exitで抜けちゃうと、シェルが終了しちゃってコミットできないから注意!

そしたら最後に、さっき作ったdockerイメージから
「proxy用」、「サーバ用」のimageを作ろう！
`$ docker tag #さっき作ったイメージ名# #新しいイメージ名#`


##proxyサーバ構築

そして、ここからそれぞれのnginxを設定していくよ！
まずは、proxyに値するnginxサーバに
さっきの docker run ホゲホゲ bash の要領で入る

ほいでserver.confを作成して下記の要領で設定したよ

```nginx:/etc/nginx/conf.d/server.conf

server{
  server_name tstngx;

  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  location /example/ {
    proxy_pass http://tstngx/example/;
  }
}
```

超シンプルww　適当すぎー！
ちなみにここのproxy_passで指定しているtstngxは
後で、docker-compose.ymlで定義しているコンテナの名前ね

同じbridgeネットワークに所属しているコンテナ同士は
お互いのコンテナ名を指定するとアクセスできるよ！
これ重要ポイント！テストに出るから！ノートにメモしておくこと！ww

たーだー？
dockerコンテナとしてnginx起動するためには一工夫必要でござるよ

Dockerコンテナとして動かす場合は
プロセスはフォアグラウンドで動作させる必要があリマス！

つまり、下記設定をnginx.confに入れる
`daemon off;`

こんな感じよ！

```nginx:/etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

daemon off;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
```

そして、下記で起動しようとすると、、、
`# /usr/sbin/nginx`

upstreamのtstngx(バックエンド)がないと怒られますwww

ということで次！！！！

##コンテンツサーバ構築
さぁ、今度は実際にWEBコンテンツを配るサーバの構築ですね
ついでだから、phpコンテンツでもおいちゃおっかな

ということで

下記を参考にpfp-fpmをインストール
https://qiita.com/noraworld/items/fd491a77af9d4e1ccffa

下記でデーモンとして起動可能
/usr/sbin/php-fpm -D

。。。はいここで、よく考えたら　１コンテナ１プロセスに違反しているし、
実際動かすときにもそうした方が良さそうと思いましてですね、、、

はい。phpは一旦保留！w

適当なHTMLコンテンツファイル作成するよ

```html:/usr/share/nginx/html/example/test.html
Hello! This is example/content
```

デーモン起動もOFFっとく事も忘れないようにね

この段階で直接アクセスできることを確認!
ちなみに確認するときは下記のように、ポートフォワードもした上で
起動してアクセスしよう

`# docker run -it -p 80:80 #イメージ名# /usr/sbin/nginx`

他設定ファイルはいじらないよ！



##docker-compose.yml作成
はいそして、docker-compose.ymlを作成する訳だが、
まず、今回起動するコンポーネントは下記三つよ！

- proxyサーバ
- コンテンツサーバ
- bridgeネットワーク

全部いちいち手で起動するのめんどくさいでしょ〜？
そこで、docker-compose使う訳よ〜

```yml:docker-compose.yml

version: '2'
# proxy
services: 

  proxy:
    image: nginx-proxy:develop
    container_name: nginx-proxy
    entrypoint: /usr/sbin/nginx
    depends_on:
     - "tstngx"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./certs:/etc/nginx/certs
    networks:
      - proxy_net

  tstngx:
    image: cent_ngx:master
    entrypoint: /usr/sbin/nginx
    container_name : tstngx
    networks:
      - proxy_net

networks:
  proxy_net:
    driver: bridge
```
※ネットワーク名はディレクトリ名が追加された形で実際は作られる

entrypointは起動するときにどのプロセスを立ち上げておくかの設定ね!

そんで、depends_onは依存関係にあるコンテナを選ぶ！
そうすると、nginx-proxyサーバはcent_ngxというコンテンツサーバが起動した後に
起動してくる形になるよ！

そして、networksの設定〜
これでお互いをつなぐ、bridgeネットワークを作るよ〜
初期で作成されているbridgeと書いてあるネットワークは名前解決機能がないので
使っちゃダメダメ！

はい、起動！
`$ docker-compose up -d`

はい、確認！

```
$ docker container ls
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                      NAMES
4cef2a99d147        nginx-proxy:develop   "/usr/sbin/nginx"   3 hours ago         Up 3 hours          0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-proxy
a6377fc1ecb4        cent_ngx:master       "/usr/sbin/nginx"   3 hours ago         Up 3 hours          80/tcp                                     tstngx
```

良さげ良さげー！

あとは自分のPCのhostsに下記行を追加して〜
`127.0.0.1  tstngx`

はい。下にアクセス！
`http://tstngx/example/test.html`


。。。OKじゃん？w


はい終わり！

#感想
普段運用業務ばっかだから、まぁこういうのをちょいちょいやって行くと
いい感じに、nginxとかdockerの知識ついていいかも
dockerとか今後新たに環境構築するときとかに役立ちそうだしね

特に社内向けWEBサーバ作るときとかめちゃ便利そうじゃん〜？？？

今度は上でやったphp-fpmとの接続や
超重要なDBへの接続部分もやっていこうか〜

#余談
今日の昼食った中華が辛い＋量が多すぎて胃もたれ中ですw
まじお腹ゆるゆる〜

まぁいいや、MHFやろwww

あ、質問あったらください。

とはいえ内容もすごい人からすれば、鼻くそみたいなもんだと思うので
完全に初学者向け(自分自身もそのレベル)ですね。

難しい質問とかわかんないのでご了承くださいw

あと、文章とかテキトーすぎるのはご愛嬌という事でw


じゃぁね〜バイバーイ