「コンテナ」が理解できればDockerは理解できたも同然です。しかし「コンテナ」の概念や仕組みが難しい。
・コンテナって何?
・コンテナはどうやって動いてる?
・コンテナの特徴とは?
・コンテナを使うと何が嬉しいのか?
第1回では、このような疑問を解決してDockerの仕組みや全体像を学びましょう。
・コンテナの概要
・コンテナの仕組み
・コンテナが動作する環境
・コンテナの特徴
コンテナとは?
まず最初にDockerとコンテナの概要・仕組みを解説します。
Dockerとは?
Dockerとは「アプリケーションやデータを隔離する」仕組みです。通常、サーバではApache、MySQL、Pythonのようなアプリケーションが動いています。
こうしたアプリケーションやデータを、独立した環境に隔離するものがDockerです。
隔離されている1つずつが「コンテナ」で、コンテナは1つのマシンのような疑似環境として動作します。
1つずつがマシンのような擬似環境で動く。
コンテナとは?
コンテナとは独立した物置(コンテナ)に、アプリケーション一式が入ったもの。とイメージしてください。このコンテナを扱える仕組みがDockerです。
Dockerを使うためにはDocker Engineというソフトウェアをインストールすることで、コンテナを作成したり動かしたり出来るようになります。
Dockerを使うためにはDockerEngineが必要。
コンテナはイメージから作られる
コンテナはイメージと呼ばれるコンテナの素(テンプレート)から生成されます。
イメージはアプリケーション毎に用意されていて、
・ApacheのイメージからApacheコンテナを作成
・MySQLのイメージからMySQLコンテナを作成
のように作られます。また、1つのイメージから複数のコンテナを作成することもできます。
また、通常では「イメージ」はDocker Hubから取得します。
イメージはアプリケーションごとに用意されている。
DockerはLinux上で動作する
DockerはLinux上で動作するアプリケーションです。そのため、コンテナに入れるアプリケーションもLinux用のアプリケーションである必要があります。
WindowsやMacでもDockerは動作しますが、その場合もWindowsやMacにLinux環境を作り、その上にDockerをインストールすることになります。
つまり、DockerはLinux上で動くものだ。と覚えておいてください。
WindowsやMacでも、Linuxで動作することになる。
Dockerの仕組み
通常ではDockerとコンテナは、次の図のような構成になっています。実際はもう少し複雑ですが、今はこの図の理解で大丈夫です。
通常は、物理マシンの上にLinuxOSがあり、その上にアプリケーションやデータがあります。
Dockerを使う場合はOSの上にDocker Engineがあり、Docker Engineの上でコンテナが動作します。
アプリケーションやデータはコンテナの中に入ります。
「OSの周辺部分」が入っている
コンテナの中身は何が入っているのでしょうか?もちろんアプリケーションやデータは入っていますが、アプリケーションやデータ以外でコンテナに必ず入っているものがあります。
それが「LinuxOSの周辺部分」です。
LinuxOSの周辺部分とは
「LinuxOSの周辺部分」とは何?って思いますよね。
まずは、OSの役割と仕組みをざっくり解説します。
OSとは簡単に言うと、プログラムなどの命令をハードウェアに伝える役割を担っています。
そして、OSは「カーネル」と呼ばれるコアの部分と、「周辺部分」で構成されています。
プログラムが実行されると「周辺部分」がプログラムから連絡を受け取って「カーネル」に伝えます。そして、「カーネル」がハードウェアを制御します。
Dockerの場合、コンテナは完全に独立・分離されているため、コンテナはLinuxOSの「周辺部分」へデータを送ることは出来ません。
ではどうしているか?
実はコンテナ内に「LinuxOSの周辺部分」が入っているのです。
コンテナ内のプログラムは、コンテナ内の「LinuxOSの周辺部分」を通して、カーネルに伝える仕組みとなっています。
コンテナにLinuxOSをまるごと入れてしまえばいいじゃないか?と思いますよね?
この「周辺部分」だけをコンテナに入れることで、Dockerの特徴である「軽量」につながっているんです。
「周辺部分」があることでカーネルと通信できる。
LinuxOSをまるごと入れる必要はないため、コンテナは軽量
コンテナを使う目的
コンテナとは「アプリケーションやデータを隔離する仕組み」です。この「隔離する仕組み」の目的は何でしょうか?
結論から言ってしまうと「隔離する仕組み」のおかげで、システム開発における次の2つの問題を解決するためにコンテナを使用します。
①アプリケーション間の環境依存の問題
②開発環境の違いによる環境依存の問題
コンテナはアプリ間の環境依存を解決する
Linuxでよくある問題のひとつが、アプリが使うライブラリや設定ファイルの環境依存の問題。
この問題がDockerで解決できます。
一般的に、アプリはライブラリや設定ファイルを共有していることが多いです。
そのため、1つのアプリをアップデートした時、他のアプリへ影響を与えてしまいます。
例えば、アプリAとアプリBの2つがあって、どちらも「ライブラリXYZ」を使用していたとします。
アプリAは「ライブラリXYZ」Ver1.0で動く仕様。
アプリBは「ライブラリXYZ」Ver2.0で動く仕様。
のような場合、「ライブラリXYZ」をVer2.0へアップデートするとどうなるでしょうか?
・・・
結果はアプリAは正常に動作できなくなってしまいます。
こうしたアプリごとの依存関係の問題を解決するための手段として「コンテナ」があるのです。
それぞれのコンテナでアプリに依存するライブラリや設定ファイルを隔離できるため、環境依存の問題が解決されます。
アプリに依存するファイルが隔離されるため、環境依存の問題が解決できる。
コンテナは開発環境の違いを解決する
システム開発の現場でよく起こる問題として、開発環境の差異がアプリの動作に影響を与えることがあります。
これは、複数人で開発を行う場合、各開発メンバーごとのマシンの開発環境が違うことにより、ある人は開発対象のアプリが動かなかったり、アプリの動作が人によって違うということが、往々にして起こります。
また、開発メンバー間だけの問題ならば、設定を合わせてもらって対応も可能ですが、本番環境で問題が発生してしまうと致命的です。システム開発経験者ならば、あるあるの問題ではないでしょうか?
こうした環境依存の問題をコンテナで解決できます。アプリケーションをコンテナで開発しておけば、そのコンテナは、どの環境でも同じように動作します。
コンテナは軽量なので、配布も簡単です。開発メンバーで同じコンテナを使えば、メンバー全員が同じ環境で開発を行うことができるようになります。
コンテナを使うことで開発環境・本番環境の物理的な違いを気にする必要はない。
Dockerの使いどころ
次にDockerがどんなことに役立つのかを考えてみます。
メンバー全員に同じ開発環境を提供できる
コンテナを使うことで、開発メンバー全員が同じ開発環境を使えるようになります。
本番環境のサーバでコンテナを作成し、そのコンテナを開発メンバーへ配布するだけです。
複数のプロジェクトに参加している場合は、プロジェクトごとにコンテナを作り、プロジェクトごとに開発環境を分けることが可能になります。
また、コンテナは開発環境から本番環境へ移行する際の環境差異の問題も発生しません。
1台で複数のサーバを安全に稼働できる
Dockerのコンテナは完全に隔離されています。
ということは、複数のサービス、アプリケーション、DBを運用している場合、それぞれをコンテナとして運用することで、お互いに影響し合うことはなく安全に運用することが出来るようになります。
また、通常ではApacheなどのWebサーバーは、1台のサーバマシンに1つのWebサーバしか立てることは出来ません。
しかしDockerでは、Apacheのコンテナを複数起動することができるため、複数のWebサービスを1台のサーママシンで稼働することが出来ます。
大変便利で、サーバマシンの節約にもなります。
新バージョンの実験に使う
使用するアプリケーション、ライブラリ、OSの新しいバージョンが出た場合は、開発環境のコンテナで試してから、本番環境へ移すといったことが簡単にできるようになります。
新バージョンで問題が発生しても、コンテナを削除すればよいだけなので、被害は発生しません。
ホストマシンや他のコンテナへの影響はない。
アプリケーションのセットアップが簡単
Docker Hubで多くのアプリケーションのイメージが公開されています。
Ubuntu、Python、MySQL、Apache、Nginx、WordPress、・・・
これらのアプリケーションはDockerコマンドを実行するだけでインストール&起動ができます。
以下は、DockerコマンドでUbuntuコンテナを起動した例です。即座に起動できることがわかります。
また、DockerHubでは、アプリケーションは各バージョンごとのイメージが用意されています。
Ubuntuの20.04を使いたい!といった場合も簡単に希望のバージョンを使うことができます。
まとめ、Dockerのメリット・デメリット
最後にまとめとして、Dockerの特徴とDockerのメリット・デメリットを整理します。
Dockerの特徴
コンテナは独立・隔離されている
この独立・隔離されることで、アプリケーション間の影響しあうことなく安全に動作します。
軽量
コンテナは、Linuxカーネルを内包する必要がないためとても軽量です。
DockerはLinux上で動作する
DockerはLinux上で動作するため、コンテナの中もLinuxアプリケーションが入ります。
Dockerのメリット
環境依存の問題を解決できる
コンテナにより隔離されているため、アプリケーション間の依存問題、開発環境の差異による依存の問題が解決されます。
コンテナの配布が簡単
コンテナは軽量なので、配布することが簡単です。
開発メンバー間、開発環境と本番環境など、コンテナを自由に配布することが可能となります。
1台のマシンに複数のサーバを立てることができる
コンテナ隔離により、1台の物理サーバーに多くのアプリケーションを安全に搭載できます。
Dockerのデメリット
Linuxのみ対応
DockerはLinux上で動作します。WindowsやMacやUNIXには対応していません。
ホストマシン故障の影響が大
ホストマシンが故障すると、ホストマシン上のコンテナ全てに影響します。
複数台のサーバで仮想化している環境に比べて、Dockerは物理的なマシンの故障による影響は大きいため対策は必要です。