Study & Practice

北海道札幌市のプログラマによる技術とか雑記のブログ

Dockerを使ってcentosコンテナ内にnginxサーバーをたてる

前回はdockerでnginx環境を立てたので今回は一歩進めてcentosコンテナ内にnginxを立ててみようと思う

前回の記事はこちら
carametal.hatenablog.com

そして今回はこちらの記事を参考にさせていただきました
qiita.com

前回はdockerでnginxコンテナを実行するだけで良かったけど今回は
centosコンテナの中にnginxサーバーをたてるのでコンテナを実行するだけでは実現できない

centosコンテナを実行してコンテナ内に入ってコマンドを叩くだけでも良いが
Dockerを使うのであれば簡単に環境を作り直せるようにDockerfileを使っていく

結論から言うと

カレントディレクトリに以下のようなDockerfileを作り

FROM centos:8
RUN /bin/sh -c 'yum install -y nginx'
CMD ["nginx", "-g", "daemon off;"]

以下のコマンドを流すだけでcentosコンテナ内にnginxサーバーをたてることができて
http://localhost:9000/ にアクセスするとnginxのテストページが表示されるようになる

docker build -t centos-nginx .
docker container run -d --rm -p 9000:80 --name test-centos-nginx centos-nginx

せっかくなので掘り下げてみる

まずはDockerfileについて

FROM centos:8

ではFROM命令を使って使用するイメージを指定する
FROM命令はDockerfile内で一番最初に書く必要がある(コメントを除く)
今回はcentosコンテナを利用するためcentosを指定し、現在の最新版であるcentos8を使用するため
オプションでタグを指定してcentos:8とした

RUN /bin/sh -c 'yum install -y nginx'

ではRUN命令を使ってnginxをcentos内にインストールしている
RUN命令はシェル形式とexec形式と呼ばれる2つの形式があり今回使用しているのはシェル形式と呼ばれている方
/bin/sh/ -c」の部分でシェルスクリプトを実行する用のインタプリタを指定
あとに続く「yum install -y nginx」でnginxのインストールを実行している
yumはRed Had系のLinuxディストリビュージョンで使用されるパッケージ管理コマンドのひとつ
Ubuntuでいうとapt-getに当たるもの、-yオプションはインストール時の質問(yes/no)をすべれyesにしてくれる便利なオプション

RUN命令をシェル形式で実行する場合、インタプリタの指定は「/bin/sh -c」がデフォルトで設定されているため

RUN yum install -y nginx

のように省略できる。

ちなみにexec形式で今回のRUN命令を書くと以下のようになる

RUN ["/bin/sh", "-c", "yum install -y nginx"]

最後の

CMD ["nginx", "-g", "daemon off;"]

ではCMD命令を使ってnginxサーバーを起動している
RUN命令はシャル形式exec形式のどちらでも良いようだがCMD命令はexec形式が推奨されているので
exec形式を使用している
docs.docker.jp

パラメータで渡している「-g」はグローバル設定ディレクトリというものを指定するためのオプションで
daemon off;」はその引数になり、nginxがデーモンになるべきか(バックグラウンドで動くべきか)どうかを
指定している今回は「off」にしているのでnginxはフォアグラウンドで動く

なぜこんなものを指定しているのかというと
nginxを動かすだけなら「nginx」コマンドで事足りるのだが
Dockerコンテナ内で動かす際はフォアグラウンドで動かしていないと
コンテナ自体が即座に終了してしまうらしい
以下の記事が参考になりました

qiita.com

実際にDockerfileを

FROM centos:8
RUN yum install -y nginx
CMD ["nginx"]

として

docker build -t centos-nginx-damon-on .
docker container run -d --rm -p 9000:80 --name test-centos-nginx centos-nginx

のようにコマンドを流してみたところ
正常にコンテナが生成されるものの

docker container ps

で実行中のコンテナを確認してもtest-centos-nginxは一覧になく
コンテナが終了してしまったいることが確認できた

ひとまず目的である「centosコンテナ内にnginxサーバーをたてる」が達成できたので
今日はこんなところで終了

この調子でDjango+PostgreSQL環境を作っていきたい