04/17/2018, 11:33 PM GMT+9

自宅サーバーでこそDockerは輝く

私は自宅サーバーを運営しているのですが、自宅サーバーだとサーバーを何台も持つわけにはいかず、複数サービスを運営していたりするとサーバーがごちゃごちゃしてしまいますよね。あれ…このサービスのファイルってどこにあるんだっけ?このポート何が使ってるんだっけ?といったように。サービス間の連携などが入ってくるともうお手上げです。

サービスごとにサーバーを分けられればもっとスッキリするだろうと思い、仮想化技術を調べてみるものの、なんだか業務用すぎて値段も高いし難しそう…。そもそもOSレベルでの分離をするほど大げさな話ではないのです。ただ単に、1つのマシンで複数のサービスを共存させるときに依存関係などをうまく整理する方法が欲しいのです。

そんなときに出会ったのがDockerでした。DockerはOSよりも浅い階層で環境を分離するコンテナツールです。Dockerは仮想マシンよりも簡単にそして効率的に環境の分離が可能なのでスッキリします。まさに私のような自宅サーバーer にはピッタリでした。

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

Docker について

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

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

実際、ネットで検索すると、「Docker は不安定」、「本番環境に使用するべきではない」などと出てきます。確かに、昔の Docker は不安定なところがあったと聞きますが、最近ではかなり改善されており、また、時代の流れがコンテナ技術に傾いているといることから個人レベルでは積極的に Docker の利用を考えてみてもいいのではないかと思います。

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

Docker 化の目的

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

環境については、冒頭で話したとおりです。個人でやるような自宅サーバーですと一台のサーバーにいくつものサービス(例えば、ブログとメールとゲームサーバーと…など)を担当させてしまうことが多いですよね。多くのサービスはインストール時に前提もインストールしてしまいます。python などですね。そうすると、他のサービスに影響を与えたり、いたるところにゴミを残していってしまいます。

しかし、環境を分離することで、その環境ごとに必要な前提を取ってくることができるので、変な競合をすることなどはありません。。また、そのサービスが動くために必要な環境を宣言的に記述することができます。

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

次に、移行の容易さについて説明します。私は今(記事執筆時点)、全てのサービス(ブログやゲームサーバーなど)を 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 というシンプルなコマンドで完了できます。これは実質的に、2 つのコンテナ(wordpress と mysql)をまとめて扱っているようなものです。コンテナ間に依存関係もつけることができます。

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

他の Web サービスの場合

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

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

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

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

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

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

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

まとめ

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

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


Cosnomi
Cosnomi

コンピュータ(Web, 機械学習など)が好きな医学部生

Twitter / GitHub