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コンテナ内で動かす際はフォアグラウンドで動かしていないと
コンテナ自体が即座に終了してしまうらしい
以下の記事が参考になりました
実際に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環境を作っていきたい