はじめに
一連のDocker概要記事の大きな目的は以下の2点です。
社内用に適当に書いた資料ですが何かの役に立つかもしれないのでこちらにも投稿しておこうかなっていう記事です。
- Dockerについての情報を、教育目線でまとめることでDockerに対する理解を深めること。
- 社内のDocker普及を目的として、ざっくりとした概要を社内のドキュメント環境に設置しておくこと。
今回の記事について
前記事で概要に触れたので、アーキテクチャについてもう少し深く触れていきます。
凡そはdocker-docs-jpに則りつつ、ほしい情報などを継ぎ足していく形になっています。
設計思想
アプリケーションをインフラから分離し、アプリケーションを管理するようにインフラを扱えるようにします。コードの移動をより速く、テストを速く、デプロイを速くし、コードの記述とコードの実行におけるサイクルを短くします。
コンテナはこれを実現するための機能の一つで、あらゆるアプリケーションをコンテナ内で安全に分離して実行します。
アーキテクチャ
Docker はクライアント・サーバ型のアーキテクチャです。とはいえ、クライアントとサーバは同一OS上で稼働させることも可能です。
クライアントサイド
ユーザがDockerの管理に利用します。コマンドを受け付けるとDockerホスト上のEngineデーモンに処理を依頼します。
サーバサイド
前述したDockerホストに当たります。DockerのEngineデーモンが稼働しており、ホスト内に存在するDockerイメージの管理・Dockerコンテナの管理を行います。
DockerEngineの構成要素
Dockerイメージ
前述しましたが、Dockerコンテナの基盤となる、読み込み専用のテンプレートです。Dockerコンテナの作成時に読み込まれ、差分を管理することでディスクコストを削減しています。
このイメージはレイヤをOverlayすることで積み重ねて構成されており、前述したaufsによってUnionMountされることで単一のストレージとして動作するように見せかけています。
Dockerイメージを更新する際はこのレイヤを新しく構築する(Commit)ことで行われ、その他のコンテナを更新する際もこのレイヤを適用することで行われるため非常に高速です。
Dockerレジストリ
Dockerイメージを保管します。パブリックもしくはプライベートに保管されたイメージの管理をしており、アップロードやダウンロードが可能です。
パブリックなDockerレジストリとして Docker Hub が利用可能です。または自身で構築したレジストリも利用できます。
Dockerコンテナ
アプリケーションの実行に必要な全てを持つ、Dockerイメージから構築された一つのプラットフォームです。Dockerクライアントによって開始停止・移動削除などが可能です。
コンテナにはOS、ユーザが追加したファイル、メタデータを含んでいます。
イメージのランタイム・インスタンス(runtime instance;実行状態にあるモノ)です。言い換えれば、イメージからメモリ内に展開し、実際に実行する何かです。
Dockerコンテナの実行
Dockerクライアントにて以下のコマンドを実行しましょう。
$ docker run -i -t ubuntu /bin/bash
runオプションによってコンテナの起動命令を発行しています。
最後の /bin/bash
で起動したコンテナ内でBashの起動を指示しています。
リソースの管理
DockerはLinuxシステムに於けるcgroupという機能によってコンテナ毎のリソースを管理します。cgroup により、ユーザーは、CPU 時間、システムメモリー、ネットワーク帯域幅などのリソースやそれらのリソースの組み合わせを、システム上で実行中のユーザー定義タスクグループ (プロセス) の間で割り当てることができるようになります。
RedHat