meideru blog

情報系エンジニアのmeideruが書いているブログです。エンジニア寄りの話から日々の出来事まで色々と書いています。

Dockerのメリット・デメリット

   

最近、Dockerをガッツリ使っています。

Docker

久しぶりにウェブ開発の話です。最近、新しいウェブサービスを立ち上げるために、Docker + Nginx + PHP + Let's Encrypt で環境を構築しました。色々とわからないことが多くて調べまくりましたw今日は備忘録も兼ねて記事を書き思ました。想定している環境 Ubun...

 

Dockerを使ってみてわかったことがいくつかあります。

今日は、メリット・デメリットについて書きたいと思います。

メリット

無駄がない

Dockerは無駄がないです。

高速・小容量で動作します。理由はコンテナという最小単位で仮想環境を動かすからです。

@Dockerのイメージ図
Docker

例えば、Apache + PHP + MySQL の環境を構築するとしましょう。

ホスト型(VirtualBox等)やハイパーバイザー型(Hyper-V等)の仮想環境は、今動いているOSの上でOSを動かすので動作が低速です。

また、OSの上にOSをフルでインストールしなくてはならないので、大容量です。

一方のDockerは、Apache, PHP, MySQLという3つのコンテナを立ち上げるだけで環境を構築します。コンテナは最小単位なので無駄がありません。

一度、環境設定ファイルを書けばどこでも動作する

DockerにはDockerfileやdocker-composeという環境設定ファイルがあります。これは言わば環境の設計図のようなものです。

@docker-compose
Docker

これらのファイルには、環境をどのように構築するかを書きます。例えば、ウェブサーバーはApacheでボリュームはどこどこにマウントして…というようなことを書きます。

一度書いてしまえば、Dockerをインストールできる環境下で同じ環境を簡単に構築することができます。つまりありとあらゆるOSで同じ環境を構築できるようになります。

例えば、今はサービスを自宅の小規模サーバーで運用してるけどアクセス数が増えたからAWSやAzureのようなクラウドで運用したいといったケースであれば、そこでも同じ環境を一発で構築することができるのです。

パッケージ管理システムを汚さなくて済む

Linuxを使ったことがある人であれば、aptやyumといったパッケージ管理システムを使ったことがあると思います。

パッケージ管理システムには万が一があります。それは依存関係が崩れてパッケージ管理ソフトが汚れたときです。

例えばNginxをインストールしたいとき、「apt-get install nginx」といったコマンドを打ち込んでインストールすると思います。

実はこのとき、nginxだけをインストールしているのではなく、nginxを動かすために必要なパッケージをすべて探してインストールしてくれているのです。これが依存関係です。

nginxを運用していて万が一、依存関係のあるパッケージが破損してしまったりするとパッケージ管理ソフトでの修復は困難になり、最悪の場合はOSを再インストールしなくてはならない場合もあります。

一方、Dockerでそのようなことが起きた場合は、コンテナを捨てて、もう一度コンテナを作るだけでよいのです。

コンテナは基本的に使い捨てるものなので、壊れたら捨てるだけです。最も壊れないように運用するのがベストなんですけどねw

同じサービスを複数立ち上げられる

例えばですが、同じマシンでMySQLを2つ立ち上げたい場合、どうしますか?

MySQLで2つのデータベースを作るのではなく、同じマシンでMySQLを2つ立ち上げたい場合です。

1つは本番用で、もう1つはデバッグ用にしたいときなどです。(そもそも大きなサービスであれば本番用のマシンとデバッグ用のマシンで分けると思いますが)

aptやyumといったパッケージ管理システムでは、手間がかかりますよね。

一方、DockerであればMySQLのコンテナを2つ立ち上げるだけで良いのです。コンテナのポートはそれぞれ設定できます。

デメリット

謎の仕様がある

ちょいちょい謎の仕様があるように感じます。

ちょっと前の話なんですが、ボリュームをマウントするときに理解できない動作をしたことがありました。

公式のページで調べても原因を見つけることができませんでしたが、Qiitaで同じ症状の人を見つけました。

結局、Qiitaのページを書いた人も原因を見つけることはできず、「そういう仕様」ということで片付いてしまいました。

Dockerはまだまだ新興のツールであるせいか、理解できない仕様が少なからずあるように思います。

こういう場合は割り切りが大切です。。。

まとめ

Dockerは慣れるまでが勝負だと思います。慣れると神ツールです。

最近は、ちょっとしたテスト用の環境を作りたいというときは、Dockerで構築するようになりました。また、小規模なサービスであればDockerで立ち上げちゃうこともしばしばあります。

皆さんも素晴らしいDocker Lifeを送りましょう!

 - Linux