Dockerって?
今日はDockerについて話したいと思います。
Dockerについて
そもそもDockerってなんぞ?という話ですが、
Dockerはコンテナ仮想化技術を核としたオープンプラットフォームになります。
といってもよくわからないですね。
そうもそもVirtual Boxとかをつかった仮想化技術と何が違うの?
という話でもあります。
そこで、Dockerの最大の特徴であるコンテナ仮想化技術に関して話してから
Virtual Boxを使った仮想化との比較を話そうと思います。
コンテナとは?
Dockerとコンテナをセットで聞くことが多いと思います。
開発現場の事情から話始めると背景がわかりやすいかと思います。
よく見かけていた環境
DBだけ共有サーバを使っていたりすることがある。
本番: 環境で用意された環境
アプリケーションとDBは別々のサーバを用意していることが多いはず
本番はWindowsサーバとかあったりもしますが、
私はLinux環境だったことが多かったです。
開発者は開発したあとに本番にデプロイしてリリースされることになります。
この過程にコストをかけないために様々な手段を講じていることが
多いのではないでしょうか?
また、開発環境とのOSの違いから生まれる動作の違いとかに悩まされたり
しなかったでしょうか?
ホストOSとは切り離した環境を用意して、開発をするために仮想化技術を使うと
考えられたわけです。
ホストOSとの隔離手段を「OSレベルの仮想化」といいます。
この種類の1つとして、
カーネルをホストを共有してプロセスとファイルシステムを隔離することを
「コンテナ化技術」と呼ばれます。
Dockerは、コンテナを動かすためのDockerエンジンを提供しています。
開発者は、アプリケーションや設定ファイル情報をまとめたDockerコンテンを
Dockerイメージとして固めます。
本番はDockerエンジンを使えるようにすればDockerイメージを
置くだけで反映されるようになります。
Dockerコンテナを図にすると
てな感じです。
開発環境でPythonなどをいれたAPIやフロント用のコンテナは
Linuxのコマンドが使えます。
上の図では使えないように見えますが、仕組みとしては下図のようになります。
コンテナ内のプロセスは、
コンテナ内のコマンドやライブラリを参照してホストOSの
カーネルを使用します。
コンテナ内のコマンドやライブラリがLinuxのものになっているので
コンテナ内でLinuxのコマンドが利用できるようになっています。
ただし、使用できないコマンドは存在しています。
たとえば、viコマンドが使えません。
コンテナ内はゲストOSとまでは言えませんが、近しいものが入っています。
今回、私が作ったDocker環境をまとめると以下のようになります。
こうしてみるとDcokerにかなり助けられましたね。
Dockerなしでやるとすべてホスト機の中に
インストールする必要がありますから・・・・
仮想化マシンとの違いは?
こうしてみると仮想化マシンとの違いが気になるところです。
最大の違いはゲストOSの有無です。
DockerはゲストOSに近しいものが入っていますが、似て異なるものです。
何より起動の速さが全く違います。
初回のインストールも全然違かいます。
起動の速さは開発をする上では重要な問題です。
仮想環境の再起動などは、それほど多くの頻度ではないですが、
必要になります。
毎回数分もかかっていると1年間で2,3日分の稼働時間を
積もって損しているのではないでしょうか?
では、Dockerはデメリットはないのでしょうか?
当然あります。
1つは共有ディレクトリの遅さ問題です。
WindowやMacでDocker環境を構築し、ホストOSとディレクトリを共有すると
思いますが、この共有ディレクトリが原因で動作がおそくなってしまうことが
あります。
特にDB系で大量のinsertなどをすると現象が確認できるくらい起きることがあります。
2つ目はWindowsとの相性の悪さです。
WindowsでDockerを使うにはHyper-Vが必要です。
ですが、Hyper-Vを使うにはWindows Proである必要があります。
また、DockerはLinuxの利用が推奨されていることもあり、
いろいろと不整合的なことがおきることがあります。
さいごに
Dockerについて説明したした。
概要的な簡単なものですが、Dockerを知るきっかけになれたら幸いです。