LoginSignup
3
0

More than 3 years have passed since last update.

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

Posted at

目的

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を作成して下記の要領で設定したよ

/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;

こんな感じよ!

/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

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

はい。phpは一旦保留!w

適当な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使う訳よ〜

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

じゃぁね〜バイバーイ

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0