DockerでのLAMP(LEMP / LNMP)環境構築を解説する 〜Nginx編〜

プログラミング
この記事は約8分で読めます。

仕事でDockerを触る必要があったのでDockerについて自分の理解を整理するためにまとめていきます。

本記事では

Nginxのみが入ったコンテナの作成方法
Nginxの構成・設定を確認方法

に触れていきます。

今回出てくる用語の説明

LAMP環境とは

Linux
Apache
MySQL
PHP

の頭文字からLAMP(ランプ)環境と呼ばれます

今回はApacheの代わりにNginxを使用するため、LNMPになります。

Nginxは Engine X と呼ばれるため LEMP(レンプ)と呼ぶこともあるようです。

Dockerとは

コンテナという仮想化環境を構築して開発環境を作ったりする技術です。

検索すればめちゃめちゃわかりやすい記事が出てくるので今回の記事では説明しません。

Nginxとは

Webサーバを作る上で必要なプログラムの一種です。

どこかからPCにアクセスがあった時にNginxによって挙動を制御します。

サーバーにとっての受付係といったところです。

受付係がいないと、お客様が来ても何も対応出来ませんよね。

受付係なので、怪しい人が入ってきたらブロックする設定も出来ますし、混雑してきたら良い感じにお客様を誘導したりも出来ます。Nginx有能ですねぇ!

ホストとゲストとは

今回少し出てくる単語、ホストとゲストの単語の違いも説明します。

ホストとゲストの関係は仮想化環境の時に出てくる単語です。

ホストはこれまで動かしてきたPCのこと、ゲストは今回新しく導入する環境のことを指します。

今回は以下のような関係で進めています。

ホスト:Mac
ゲスト:コンテナ

ホストといったらMacのこと、ゲストといったらコンテナのことだと思ってください。

DockerでNginxのコンテナを立ち上げてみる

Nginxを立ち上げてみる

$ docker run --name nginx-test -d -p 8080:80 nginx

–name によって名前をつけることができ、nameによってコンテナを参照することが出来ます

-d はデタッチド・モードのdです。デーモンという人もいます。どっちなんでしょ?🙄

-dを付けない場合、そのままログ出力がされ、プロセスを終了するタイミングでDockerも停止しますが、-dを付けることでNginxが常に立ち上がる状態にしておくことが出来ます。

-pはポートのpです。localhost:8080にアクセスすると、80番ポートに繋げますよ〜という意味となります。

最後の nginx によって 『nginxという名前のイメージを使って環境を立ち上げる』ということと意味します。イメージに関しては今回は触れません。どっかからnginxの基盤を取ってくるんだなぁと思っていてください。

ちなみに :8080 を付けることに抵抗がある人は8080:80 を 80:80 と入力すれば http://localhost でアクセス出来るコンテナになると思います。

localhost:8080にアクセスすると以下の画面になればOKです。

Nginx環境にアクセスしてみる

$ docker exec -it nginx-test bash

-it オプションは -i オプションと -t オプションの合体オプションです。

-iオプションはinteractiveのiで、ホスト側の入力をコンテナに送られます

-tオプションはttyのtで、コンテナの出力をホスト側のターミナルに出力します。

つまり -it オプションでコンテナと入出力を共有するという意味になります。

最後のbashはコンテナ内部にあるbashを使うという意味です(nginxコンテナにbashがデフォルトで入っている)

Nginxの設定を確認する

Nginxの中に入れたら設定を確認してみましょう。

Nginxの設定ファイルはコンテナ内の

/etc/nginx

の中にあります。

デフォルトのコンテナにはlessやvimは入っていないのでcatで確認してみましょう。

cat /etc/nginx/nginx.conf

よく見ると

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

というコードがあります。そこには引数に割り当てられたコードが代入されてます。

cat /etc/nginx/conf.d/default.conf

http{} の中に server{}が入るような形になります。

なお、#はコメントなので無視してもらって問題ありません。

環境によってはファイルを分離していないことがあるため異なる環境で確認する時は念頭に置くようにしましょう。

はい、ここで default.conf のここに注目↓↓

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}

locationのrootには起点のパスが、indexにはファイル名が入ってます。

ここを編集するとファイルの場所を変えたり、読み込ませるファイルを変更できそうです。

Nginxを編集してみる

実際に location に書かれている設定があっているか確認してみましょう。

vimなどの必要なプログラムをインストール

まずはNginxのコンテナにはvimなどのエディタが入っていないので入れましょう

$ apt-get update 
$ apt-get install vim

index.htmlを編集してみる

最後の1行に以下の文字列を追加しました。

<h1>\(^o^)/</h1>

無事に表示されました!

vimで文字化けしている場合は、以下の設定をしてみると良いでしょう。

$ vi ~/.vimrc
---- vi追記 ----
set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
set fileformats=unix,dos,mac

【参考】 https://qiita.com/meio/items/08143eacd174ac0f7bd5

ブラウザ側の表示が文字化けしている場合は、<head>内に

<meta http-equiv="content-type" charset="utf-8">

を追加するとうまくいくかと思います。

これでindex.htmlが読み込まれていることが確認できましたね。

default.confを編集してみる

location / {
    root   /var/www/html;
    index  index.html index.htm;
}

に変換し、

cp -r /usr/share/nginx/html /var/www/html

でファイルをコピーしたあと、一度コンテナから抜けて

$ docker restart nginx-test

で設定ファイルを再度読み込ませます。

すると、ページの内容が変わらずに表示されたと思います。

Nginxの状態を消えないようにする(Docker マウント)

ここまでで、

・NginxによってWebページの表示が制御されている
・nginx.confにWebページを表示する上で必要な情報が書いてある
・HTMLを書き換えると表示も変わってくれる

ということがわかりましたね。

次に疑問になることは以下のことです。

・編集はコンテナ内で編集しなきゃならないの?
・コンテナ内のデータはどう管理するの?

コンテナを削除するとデータはコンテナ内にあるため、丸ごと消えてしまいます

コンテナを作り直した場合、これまで編集してきたものが全てなくなってしまいます。

そのため、Dockerではマウントという方法を使い、Nginxに必要なファイルをDockerを起動しているホストPCに保存して、そこからファイルを読み込ませる仕組みが用意されています。

今回は/Library/WebServer/docker/に同じような構造でファイルを作りました。

docker xxxxx -v [ホストPCのファイルのパス]:[コンテナ内のパス]

のコマンドでコピーさせたいコンテナの位置にファイルをマウントさせます。

docker run -d -p 8081:80 --name nginx-test-2 -v /Library/WebServer/docker/etc/nginx/conf.d:/etc/nginx/conf.d -v /Library/WebServer/docker/var/www/html:/var/www/html nginx

これにより、ホストPCのファイルがコンテナのファイルにマウントされ、ホスト側でコンテナ内のファイルを管理できます。

このような管理をしておくと、コンテナを壊してもホスト側のファイルは消えないため、何度も同じ環境を作ることが出来ますね。

コンテナの構築は簡単にできる

今回はDockerでコンテナ構築の最初の部分を解説しました。

Nginxの説明から始まり、Dockerでコンテナを立ち上げ、コンテナのファイルを変更したりと多くなってしまいました。

・NginxはWebアプリケーションを作る上で必要な機能
・DockerコンテナはホストPC上にサーバーを立ち上げる仮想化環境
・コンテナにアクセスすることが出来て内部ファイルを見るとある程度仕組みがわかる
・マウントによって仮想化環境上のファイルをホストPCで管理できる

ということが分かっていただければ幸いです。

Dockerの本領はコンテナを複数連携させたり、イメージと呼ばれる環境の模型を共有することで発揮されます。

それはまたの記事で解説していこうと思います。

ここまで読んで頂きありがとうございました!

コメント

タイトルとURLをコピーしました