はじめに
株式会社マイスター・ギルド新規事業部のヒツジーです。
弊社新規事業部では、新規サービスの立ち上げを目指して
日々、アイディアの検証やプロトタイプの作成などを行っています!
技術の進歩は目覚ましいので、置いてかれないように新しい技術のキャッチアップにもいそしんでいます!
本記事では、普段使っているDockerについて調べた内容を共有したいと思います。
環境構築を非常に楽にしてくれる便利なツール、Docker。
今日も使うよ、Docker。
ありがとう、Docker。
。
。
。
で、君、結局何者なん??コンテナって何?
そんな疑問を解消すべく、調査の旅に出かけました。
Dockerとは
コンテナについて説明する前にDockerについて説明します。
Dockerの概要
Dockerは、アプリケーションをすばやく構築、テスト、デプロイできるソフトウェアプラットフォームです。
インフラ関係やDevOps界隈で注目されています。
Dockerでできるようになること
- Dockerfileやdocker-compose.ymlというコード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる
- 作成した環境を配布しやすくなる
- スクラップ&ビルドが容易にできる
Dockerがなかった頃には環境構築に半日〜丸一日かかっていたりしましたが、ファイルを共有してもらうことで数分で終わらせることができるようになりました。
一度Dockerfileやdocker-compose.ymlを作成してしまえば、開発メンバーは爆速で環境構築を完了させることができます。
また、これらファイルがあれば、何度でも開発環境をスクラップ&ビルドできるので、何か失敗しても破棄してまた作り直せばいいやといろいろ試すことがしやすくなりました。
ちなみに新規事業部のプロト開発でもDockerを使っています!↓
Dockerの内部構成(Dockerクライアント、Dockerデーモン、コンテナレジストリ)
Dockerとは、以下で述べるDockerエンジンのことを指すことが多いです。
Dockerエンジンは主にDockerクライアントとDockerデーモンで構成される、クライアント・サーバー型のアプリであり、
クライアントからサーバーのAPIへアクセスすることでさまざまな操作を行えます。
以下の図のように、
docker run
, docker pull
などのコマンドを叩くことでサーバー側のインターフェースにHTTPリクエストを投げることができます。
一般的なWebアプリと同じような構成なのでわかりやすいですね。
サーバーであるDockerデーモンはDockerクライアントからの要求に応じてDockerオブジェクトを管理するコンポーネントです。
レジストリからイメージをダウンロード・アップロードしたり、イメージをビルドしたり、コンテナを起動したりできます。
コンテナレジストリはコンテナイメージを保管するためのコンポーネントです。
WebアプリでいうDBに該当します。
パブリックなコンテナレジストリにはDocker Hubがあります。
自分専用のコンテナレジストリを構築することも可能です。
余談ですが、以下のようなDockerデーモンに接続できないよってエラーの意味が昔はわからなかったですが、勉強した今では「なんだDockerのサーバーが立ち上がってないだけか」と理解できるようになりました。
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Dockerコンテナとは?
いよいよ本題になりますが、Dockerコンテナとはなんなのでしょうか?
Dockerデーモンでイメージをビルドして、コンテナを起動できることはわかりましたが、コンテナが一体何者かがまだわかっていません。
結論
「OS上で動いている他のプロセスから隔離されたプロセス」
です!
要するにコンテナはプロセス!
プロセスとは?
そもそもプロセスが何か理解していないと、Dockerのことはわからないみたいですね。ここでプロセスについて説明しておきます。
プロセスとはざっくり言うと 「実行中のプログラム」 のことです。
psコマンドで確認できるあれ↓です。
OSがこれらのプロセスをほぼ同時に処理していると思えるような速度で切り替えながら処理しています。
↓のようなイメージです。
これら動いているプロセスから隔離されたプロセスがコンテナと呼ばれています。
時間軸 -->
ID21565: ---- ---- -- --
ID23282: --- ------- --
ID53178: ------ ------------
基本的に1コンテナ=1プロセス
コンテナは本質的にはプロセスと同じで、1コンテナ1プロセスです。
1コンテナでどこまでの処理をさせるべきかは、1プロセスでさせるべき処理と同じと考えられます。
Webサービスの開発環境で複数のコンテナを起動しているのはこのためです。(例えばですが、PHPとMySQLの2コンテナを立ち上げたりしますよね)
プロセスを隔離する技術
プロセスを隔離する要素技術として、名前空間(Namespace)があります。
(コンテナの要素技術には隔離以外にも、ハードウェアリソースの制限と権限の制約がありますが、今回は割愛させていただきます。)
ファイルシステムの隔離
ファイルシステムはOSの機能の1つであり、データを「ファイル」という単位で読み書きすることができます。
ファイルシステムは、プロセスの実行に必要となるさまざまなファイル(プログラムや設定など)を含んでおり、プロセスが正しく動作するための環境を提供します。
通常のプロセスは、OSのファイルシステムを他のプロセスと共有するのに対し、コンテナはそのコンテナ専用の独立したファイルシステムを使用します。
名前空間(Namespace)とは
名前空間はプロセスが参照するPID(プロセスID)番号空間やマウントポイントなど、カーネルリソースを他のプロセスと隔離し、独立したOS環境のように見せる機能です。
名前空間はリソースのラッパーであり、名前空間の内部プロセスに対して、外部のプロセスから 隔離されているように見せる 仕組みです。
実際は、内側から外側を見えなくするだけであり、空間というよりもむしろフィルターとしての役割を果たしています。
内から外が見えなくなるので、外はないのと同然ということができます。
名前空間とコンテナ
名前空間の実態は特殊なフラグを指定して実行されるプロセスであり、このプロセスの子プロセスが名前空間のメンバーとなります。
コンテナを実行するとき、Dockerデーモンは最初にそのコンテナ専用の名前空間となるプロセスを作成し、次に名前空間のメンバーとしてコンテナに含まれるプロセスを実行します。
この手順がコンテナを実行する度に行われることであり、それぞれのコンテナに専用の名前空間が作成されるため、コンテナは他のコンテナから隔離されます。
まとめ
- コンテナは隔離されたプロセス
- プロセスの隔離には名前空間の技術を用いる
- コンテナの立ち上げ(プロセスの隔離)などをユーザーが操作しやすいようにしてくれたアプリケーションがDocker
ということがわかりました。
Dockerってすごいですね!
これからもDockerを使っていきたいと思います。
めぇ〜
(間違いありましたら、コメントにてご指摘いただけると幸いです)
参考
プロセスについて
Dockerについて
コンテナ仮想化技術(プロセスの隔離)について