ホーム
記事一覧
プライバシーポリシー
免責事項
お問い合わせ

【Docker】Webサーバ(Nginx)をDockerに移行してみる

2019-03-24

はじめに

今回は、現在ホストサーバ上にインストールされている Nginx の Docker 移行に挑戦してみたいと思います。
移行に挑戦する理由は、Docker を使ってみたかったからというのが大きい。

最初に少し謝罪しておくと、最終的に Docker 移行はしませんでした。

そこら辺も踏まえて本記事では語って行きたいと思います。

現在の状況

現在のこのブログの環境は以下のようになっている。

  • 開発環境
    • MacBook Air (mac os)
    • AWS EC2 (CentOs7)
  • 本番環境
    • さくら VPS (CentOs7)
  • Web サーバ
    • Nginx (1.14.2)

配信しているのは静的ページのみでアプリケーションは実装されていない。
単純に Nginx で静的ページの配信をしている状況だ。

なぜ Docker か

Docker のメリットには以下のようなものがあげられると考えている。

  • インフラとアプリケーションをセットで構築するため環境差異に伴うエラーの排除
  • アプリケーションやミドルウェアのポータビリティ性の向上
  • 構成管理のしやすさ

このブログの場合だと 2、3 番目が Docker 導入で得られるメリットだと思う。
今のサイトは、Nginx の設定ファイルと Hugo のディレクトリは git で管理しているが、他の構成管理は行なっていない。
仮に、さくらの VPS から乗り換えたい場合、もう一度すべてをインストールし、再構築しなければならない。

なにかトラブルがあった時のためにも Docker で管理して再現性を確保しておくのはありだと思った。

Docker 導入

サーバは現在稼働中なので、AWS EC2 上でいろいろ試してみる。

まずは Docker を導入する。

yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum list docker-ce.x86_64 --showduplicates | sort -r
yum install docker-ce

これで Docker の利用準備完了。
Docker を起動してみる。

systemctl start docker

試しに Nginx のイメージを pull してみる

docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx

しかし、上記コマンドを実行したところ以下のようなエラーが発生

Got permission denied while trying to connect to the Docker daemon socket

以下のサイトに解消法と注意事項がのっていた
「Got permission denied while trying to connect to the Docker daemon socket」への対応

sudo gpasswd -a username docker

ログインしているユーザ名をusername部分にいれてをグループ docker に追加。
記事にあるとおりコマンド実行後、一度ログアウトするとエラーが消えた。

本番環境を Docker コンテナで再現

作業用フォルダを EC2 上に作成し、そこで作業を行う。

mkdir docker-work

そこに本番で使用している Nginx の設定ファイルをおいておく。

とりあえず、設定ファイルのマウントなしで動作確認する。

docker container run -itd --name nginx -p 80:80 nginx

ちなみに-tオプションはコンテナの標準出力をホストの標準出力につなげることができ、-iはホストの入力をコンテナの標準出力につなげることができる。
-dでは、コンテナがフォアグラウンドではなくバックグラウンドで動作する。
-pではコンテナ内のポートをホスト側のポートにポートフォワードしている。

問題なく動作していれば、EC2 の IP アドレスにブラウザからアクセスすると以下のような画面がでる。

Nginx は問題なく動作していることは確認できた。
次はローカルのファイルをマウントして表示できるかチェック。
チェック用にsamp/index.htmlHELLOW WORLD作成した。

docker container run -v /home/centos/hoge/samp:/usr/share/nginx/html -itd -p 80:80 --name nginx nginx

-vオプションでマウント可能。Nginx の公開用ディレクトリにマウントする。

ちゃんとマウントできてる(白くてわかりづらいがブラウザ画面です)。

次は、いよいよ実際の環境の再現試みる。

本番で使用している設定ファイルをマウントして Docker 起動。
しかし、ここで問題発生。

どうやら証明書がないと起動しないようだ。
本番環境ではLet's Encryptを使って ssl の証明書を発行している。 加えて、cronで更新を自動化している。
これを Docker でやろうとすると少々めんどうだ。

調べてみると、方法はいくつかあるようだ。 https-portalnginx-proxyなど。

挫折ポイント

上記イメージを docker-compose で実行するのが一番綺麗なやり方だと思う。
しかし、どうも納得いかない。

納得できなかったのはhttps-portalnginx-proxyこのあたりの動作内容をいまいち理解できなかったからだ。
また、これらをコンテナ化して運用することで、今後運用が楽になる気があまりしてない。
というのも、実際に運用することを考えると、ログや証明書、配信するコンテンツは外でマウントして使用することになる。
そうなると、真にポータリビリティ性が確保されるか疑問が残る。

仮に新しい環境で同一環境を作りたいとなった場合、コンテナのマウントに合わせたディレクトリ構築を行なって運用することになるだろう。
これは果たして楽になったと言えるのだろうか?
スクリプトにまとめて実行した方が楽なのでは?

これが一番の挫折ポイントかな。
導入や設定の労力に対する見返りがどうも少ない気がして。。。

まとめ

正直、勉強不足感が否めない。
結果的に Docker の導入は見送ったが、自分が Docker の良さを理解できていないだけの可能性が十分にある。
もしくは、作り込みが少ないサービスにおいては、Docker を導入するまでもないのかも。
もっと複雑なサービスだったら Docker を使うと便利かなとは思う。

どちらにせよ、もっと勉強せねば。

以下は、今回の Docker 勉強で使ったコマンドなどだ。


docker-compose

docker-compose は複数のコンテナを動かすためのものだ。
これを使えば複数コンテナをまとめて扱うことができる。
以下のサイトがかなりわかりやすくまとまっている。

参考
docker-compose を使うと複数コンテナの管理が便利に

Docker コマンドまとめ

  • 実行中の Docker コンテナに入る

    docker container exec -it [コンテナ名] /bin/sh
  • 実行中の Docker コンテナの停止

    docker container stop [コンテナ名]
  • コンテナの削除

    docker container rm [コンテナ名]
  • 停止・削除までやってくれる

    docker container rm -f [コンテナ名]
  • image の削除

    docker image prune

参考