#目的
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]
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を作成して下記の要領で設定したよ
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;
こんな感じよ!
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
。。。はいここで、よく考えたら 1コンテナ1プロセスに違反しているし、
実際動かすときにもそうした方が良さそうと思いましてですね、、、
はい。phpは一旦保留!w
適当な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使う訳よ〜
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
じゃぁね〜バイバーイ