Docker for Macでおこなっていることのまとめ
※随時更新
今回は、最近Docker for Macを使い初めて以前のDocker ToolBoxを使った構築とどう違うのか整理したいと思い、Dockerの仕組みも含めてまとめてみた。
Dockerのアーキテクチャ
Docker for Macでインストールしているもの
Docker for Macでは、Docker Engine、Docker Compose、Docker Machineがインストールされます。では、それぞれがどのようなものなのかを説明していきます。
Docker Engine
Docker Engineとは、3つの主な構成要素を持つクライアント・サーバ型アプリケーションです。
1. Docker デーモン
Dockerデーモンとは、Dockerイメージ、Dockerコンテナ、Dockerネットワーク、DockerボリュームなどDockerの構成要素の管理者的な位置づけです。そのため、Dockerオブジェクトを作成・管理します。Dockerオブジェクトには、イメージ、コンテナ、ネットワーク、データ・ボリュームなどが含まれます。
2. REST API
インターフェースを規定する REST API は、プログラムがデーモンと通信に使うものであり、何をするか指示するものです
3. コマンドライン・インターフェース(CLI)クライアント
アーキテクチャの図でいうクライアントのことで、ユーザがDocker(Docker デーモン)とやりとりするためのものです。CLI は Docker REST API のスクリプトもしくは直接 CLI コマンドを使い、Docker デーモンを制御または対話します
Docker Compose
Docker Compose とは、複数のコンテナを使う Docker アプリケーションを、定義・実行するツールです。
Docker Composeを使用するための3つのステップ
- アプリケーションの環境を Dockerfile ファイルで定義する
- アプリケーションを構成する各サービスを
docker-compose.yml
ファイルで定義します - 最後に、
docker-compose up
を実行することで定義したアプリケーション全部が起動・実行される
Docker Machine
Docker Machine は仮想マシン上に Docker Engine をインストールするツールであり、 docker-machine
コマンドを使ってホストを管理します。
また、docker-machine
コマンドで、管理ホスト(Dockerホスト)の起動(start)、調査(inspect)、停止(stop)、再起動(restart)ができます。
どのような時に使用するのか?
- Mac や Windows 上で Docker を実行したい
- リモート・システム上に Docker ホストをプロビジョンしたい
※ Docker for Macからは不要に?
Dockerは、Linuxカーネルの機能である「名前空間、コントロール・グループ、ユニオン・ファイル・システム」を使用しています。そのため、Linux環境でないと動きません。
しかし、Docker for Macでは、Macにデフォルトで入っている仮想化ツール「HyperKit」を使ってMacで仮想マシンを立ち上げ、Linuxを起動しています。それによって、Mac上にDockerホストを作成しています。
Docker for Macが出る前は、Docker ToolboxをインストールしてDocker Machineを使ってVM上にDockerホストを作していました。それが、Docker for Macになることで不要となったのか?ここは、ちょっと確証がないです...
Dockerの処理内容・流れ
docker run
コマンドでコンテナ起動した際の処理内容・流れ
-
イメージ取得
まずローカルホストにイメージがないか確認して、なければDocker Hubからダウンロードする -
新しいコンテナ作成
Dockerがイメージを入手したあと、それを使ってコンテナを作成する -
ファイルシステムを割り当て、読み書き可能なレイヤをマウント
コンテナを新しいファイルシステム上に作成し、読み込み可能な(イメージの)レイヤをイメージに追加する -
ネットワークとブリッジインターフェースの割り当て
Docker コンテナがローカルホストと通信できるようにするため、ネットワーク・インターフェースを作成する -
IP アドレスを設定
プールされている範囲内で利用可能な IP アドレスを探して(コンテナに)追加する -
指定したプロセスを実行
アプリケーションを実行し、そして -
アプリケーションの出力を収集・表示
コンテナに接続し、アプリケーションを実行したことによる標準入力・標準出力・エラーを記録・表示する
※ ブリッジインターフェース
複数のインタフェースを1つの仮想インタフェースに収容し、収容したインタフェース間でブリッジング(2つのネットワークを1つの大きなネットワークにすること)を行う機能です。
※ ネットワーク・インターフェース
プロトコルで実現/実装されている機能を呼び出すための仕様のこと
※ プール
必要なくなった資源を回収してすぐに再利用できるように一時的に貯めておく仕組みや保管領域のこと
参考
http://docs.docker.jp/engine/understanding-docker.html
http://www.memotansu.jp/2016/08/docker/377/