Cosnomi

プログラミングをする医学生。物を作ること、自動化すること、今まで知らなかったことを知ることが好き。TypeScript書いたり、Pythonで機械学習したりなど。

Twitter / GitHub / Keybase
TOP >

自宅サーバーでこそDockerは活躍する

私は自宅サーバーを運営していますが、サーバーを何台も持つわけにはいかないので、複数サービスを1つに詰め込んでしまいます。あれ…このサービスのファイルってどこにあるんだっけ? このポート何が使ってるんだっけ? といったように段々と分からなくなってきます。

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

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

Docker について

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

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

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

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サービスとの連携が必要かもしれません。というわけで、Docker化を進めていくにあたって、「メインのスクリプトを動かすコンテナ」→「APIを動かすコンテナ」→「DBを動かすコンテナ」の3つのコンテナを用意することになります。(矢印は依存関係を表す)

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

まとめ

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

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


最後まで読んでいただきありがとうございます。コメントフォームは設置していません。訂正・意見・感想などはTwitter(@cosnomi)などへお願いします。
記事一覧へ