自宅サーバーにこそDockerを!

シェアする

私は自宅サーバーを運営しているのですが、自宅サーバーだとサーバーを何台も持つわけにはいかず、複数サービスを運営していたりするとサーバーがごちゃごちゃしてしまいますよね。

あれ…このサービスのファイルってどこにあるんだっけ?このポート何が使ってるんだっけ?みたいな感じです。サービス間の連携などが入ってくるともうお手上げです。

サービスごとにサーバーを分けられればもっとスッキリするだろうと思い、仮想化技術を調べてみるものの、なんだか業務用すぎて高いし難しそう…

そんなときに出会ったのがDockerです。Dockerは仮想マシンよりも簡単にそして効率的に扱うことができ、かつ、環境を分けることができるのでスッキリします。まさに私のような自宅サーバーerにはピッタリです。

今回はDockerを自宅サーバーに導入してみましたので、その構成などを軽くご紹介します。

スポンサーリンク

Dockerについて

Dockerというのはコンテナ化ツールです。コンテナというのは、ホストOSや他のコンテナから隔離された環境です。隔離された環境というと仮想マシンなどが浮かぶかと思いますが、コンテナは仮想マシンよりは隔離性が強くなく、その分オーバーヘッドが少ないです。

もちろん、コンテナが仮想マシンよりすべての面で優れているというわけではありませんし、コンテナ技術と仮想化技術は分けて考えるべきだと言う人もいます。また、比較的枯れていない技術なので安定性の面で信用できないとする人もいます。

実際、ネットで検索すると、「Dockerは不安定」、「本番環境に使用するべきではない」などと出てきます。

確かに、昔のDockerは不安定なところがあったと聞きますが、最近ではかなり改善されており、また、時代の流れがコンテナ技術に傾いているといることから個人レベルでは積極的にDockerの利用を考えてみてもいいのではないかと思います。

コンテナ化のメリットとしては、仮想化とだいぶ被るところがあるのですが、個人的には環境を綺麗に保てる点、マシンの移行がしやすい点が非常に魅力的に感じます。

Docker化の目的

これは前の章と少し被るのですが、私がなぜ自宅サーバーの各サービスをDocker化しようとしているのかについて話をさせてください。

私のような個人がDocker化を進める目的として一番大きいのは、前に挙げた2つ、すなわち、「環境の分離」「移行の容易さ」だと思います。

環境については、冒頭で話したとおりです。個人でやるような自宅サーバーですと一台のサーバーにいくつものサービス(例えば、ブログとメールとゲームサーバーと…など)を担当させてしまうことが多いですよね。

多くのサービスはインストール時(yumなど)に前提もインストールしてしまいます。pythonなどですね。そうすると、他のサービスに影響を与えたり、いたるところにゴミを残していってしまいます。

環境を分離することで、その環境ごとに必要な前提を取ってくることができるので、変な競合をすることなどはありません。

また、サービス間の連携も容易です。後ほど紹介しますが、コンテナをまとめて起動/終了したりコンテナ間の通信を用意にするdocker-composeというものがあります。各サービスごとにコンテナを作ることで、依存関係がはっきりし、またサービス同士の干渉も少なくなります。

次に、移行の容易さについて説明します。私は今、全てのサービス(ブログやゲームサーバーなど)を1つの自宅サーバーで動かしており1、他のマシンやVPSなどは使っていないのですが、将来的には使う可能性がありますし、障害発生時などは応急的にVPSを利用することもあるかもしれません。

その際に、各サービスをDocker化しておけば、コピーするファイルが明確になり、また移行先の環境でもほぼ同じ動作が保証されます。

具体的に言うと、dockerfile(構成をテキストで表したファイル)とボリュームデータ(永続化したいデータ、例えばブログの記事や画像など)、そしていくつかの設定ファイル(例えば、nginxのリバースプロキシ設定など)を移行すればいいということになります。

また、VPS同士の移動も容易です。特定のVPS業者などに縛られないのは大きなメリットになるでしょう。

どのようにDocker化を進めていくのか

では、具体的にどのようにDocker化を進めていくのかについて説明します。今回は「Wordpressの場合」と「その他のWebサービスの場合」(自作Webアプリなど)をご紹介したいと思います。

WordPressの場合

例えば、このブログ(WordPress)の場合は公式イメージが公開されています。

(参考) https://hub.docker.com/_/wordpress/

公式イメージでないものは、そのイメージが悪意のあるものではないか検討・検証する必要がありますが、今回は公式イメージなのでそのまま持ってきちゃいましょう。

そして、このWordpressのコンテナを動かすためにはMySQLのコンテナも必要です。MySQLにも公式イメージがあります。これらを連携させなければなりません。

連携させるときにはコンテナ起動時に –link オプションをつけてやります。また、自動(再)起動をするにはrestart alwaysにする必要があります。

サービスを起動するたびにこのように多くのオプションがついたコマンドを打つのはおそらくDockerの思想的にあまり合わないということで、docker-composeというものがあります。これを用いることで、コンテナ連携などの設定をdocker-compose up -dというシンプルなコマンドで完了できます。

docker-composeではdocker-compose.ymlというファイルにそのような設定を書いていきます。

Example stack.yml for wordpress:

(引用: https://hub.docker.com/_/wordpress/ より)

これは実質的に、2つのコンテナ(wordpressとmysql)をまとめて扱っているようなものです。コンテナ間に依存関係もつけることができます。

このように、Dockerを扱う上ではwordpressとmysqlを同じコンテナに入れるのではなく、2つのコンテナに分けてそれらを連携させる方法が推奨されています。こうすることで、サービスがより小さい単位に分割されるので見通しが良くなります。

他のWebサービスの場合

自作のサービスの場合、もちろんDockerHubに公式のイメージどころか非公式のイメージも転がっていないので、自分でイメージを作ってあげる必要があります。

イメージを作るにはdockerfileというファイルを記述するのが一般的です。構成管理ツールを使うのと似た感じではないでしょうか。2

ベースのイメージ(CentOSやAlpine Linuxなど)を指定し、その上に依存関係のあるもの(pythonやそのモジュールなど)を入れ、自分の書いたスクリプトファイルをコンテナ内にコピーし、最後に起動するためのコマンドを書きます。基本的にシェルとその他の少しのコマンドなのであまり苦労することはないと思います。

また、WebサービスとなるとDBへのアクセスが必要ですよね。さらに、他の自作Webサービスとの連携が必要かもしれません。そこで、DBアクセスはすべてAPIを通して行う方針にしたほうが良いかと思います。

というわけで、Docker化を進めていくにあたって、「メインのスクリプトを動かすコンテナ」→「APIを動かすコンテナ」→「DBを動かすコンテナ」の3つのコンテナを用意することになります。(矢印は依存関係を表す)

自作のWebアプリとなると、手順もそれぞれ変わってくるので追加のコンテナも必要かもしれません。が、それを話しているとキリがないというのと、そろそろこの記事も長くなってきたので、今回はここまでとしたいと思います。

実際、Dockerって難しいものではないので、普通に自作Webアプリをデプロイできる人ならDockerを少し学ぶだけでできると思います。気分次第で、自作WebアプリのDocker化みたいな記事も書くかもしれません。

まとめ

  • Dockerは環境を隔離することで、サーバーを綺麗に保ち移行作業を容易にできる
  • WordPressのDocker化は公式イメージを使えば良い
  • 独自のWebサービスもDocker化できる

最後までご覧いただきありがとうございました。

  1. これは執筆時点での話です。7月中旬からConoHaのVPSに一部サービスを移動しました。Dockerコンテナを移してnginxとポートの設定をするだけだったのでとても簡単でした。
  2. といいつつ、執筆時点では構成管理ツールを使ったことがありません。いずれ手を出してみたいです。
スポンサーリンク

シェアする

フォローする