Dockerについて
この記事は
Dockerについて、読んだことをまとめた個人的なメモです。
以下の書籍を参考にしてます。
- [プログラマーのためのDocker教科書 第一版] (https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEDocker%E6%95%99%E7%A7%91%E6%9B%B8-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96-%E9%98%BF%E4%BD%90-%E5%BF%97%E4%BF%9D/dp/479814102X)
- [Docker実践ガイド] (https://www.amazon.co.jp/Docker-%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear/dp/4844339621/ref=pd_lpo_sbs_14_img_1?_encoding=UTF8&psc=1&refRID=A60B8Q54Q6XPSG7FXPR0)
また、次のような知識をまとめてます。
- コンテナとは
- Dockerとは
- Dockerの概要
- Dockerを支える仕組み
- Dockerのメリット
- docker-compese
コンテナとは
仮想化技術の一つです。ホストOSに論理的な区画を作って、アプリケーションやライブラリーの実行環境を閉じ込め、あたかも個別のサーバーのように使います。ホストOSのリソースを論理的に分離し、複数のコンテナで共有して使います。
この区画のことをコンテナと言いい。コンテナを実現する技術をコンテナ仮想化技術と呼びます。
コンテナはオーバーヘッドが少ないため、軽量で高速に動きます。また、アプリケーションの開発環境や実行環境をパッケージ化して、迅速に配備したり破棄することも可能です。
Dockerとは
コンテナ仮想化技術で、アプリケーションの実行と管理を行うためのオープンソースプラットフォームです。
以下のような特徴があります。
- Linux上で動作する
- GO言語で書かれている。
記事を書いている段階で、Dockerはコンテナ仮想化技術のデファクトスタンダードになっています。
DockerではOSの上にDockerデーモンと呼ばれるコンテナ管理ソフトウェアを立てて、その上にコンテナを構築します。
コンテナはアプリケーションorライブラリー/ミドルウェアやOS、ネットワークの設定などをひとまとめにしたDockerイメージから作成します。また、作成したコンテナをイメージにすることも可能です。Dockerイメージの正体はアプリケーション実行に必要なファイル群が格納されたディレクトリです。
Dockerを支える仕組み
区画化の仕組み
Dockerの区画化には、Linuxのnamespace機能を用いています。
名前を付けることで、以下のようなプロパティをコンテナに隔離しています。
- PID
- プロセスごとのID
- Network
- ネットワークディバイス、IPアドレス、ポート番号、ルーティングテーブル、フィルタリングテーブル
- UID、GID
- ユーザーID、グループID
- Mount
- マウントシステム
- UTS
- ホスト名、ドメイン名
- IPC
- プロセス間通信のオブジェクト
リソース管理の仕組み
区画化されたリソースの管理は、Linuxの cgroup
の仕組みを用いています。cgroup
はプロセスをグループピングして管理する仕組みです。cgroup
を用いてコンテナが使用できるリソースを制限することで、ホストのリソースを食い尽くすことを防いでいます。
ネットワークの仕組み
コンテナ間の通信
Dockerではコンテナごとに仮想NICが割り当てられています。この仮想NICはdocker0
と呼ばれる仮想ブリッジに接続されており、コンテナ同士の通信を行います。
なお、コンテナどうしの通信にはリンク機能が用いられます。Dockerコンテナにはエイリアスを付けることができ、リンク機能ではそのエイリアスを用いたコンテナ間の通信を可能にします。
コンテナと外部ネットワークの通信
DockerではNAPT(Network Address Port Translation)の機能を使って外部ネットワークに接続します。
NAPTはIPアドレスと、ポート番号を変換する機能で、プライベートアドレスとグローバルアドレスを透過的に変換します。
Dockerのメリット
移植性
開発環境や実行環境をパッケージ化することによって、Dockerの動作環境とDockerイメージがあればどこでも同じコンテナを作成することができます。これは開発環境の統一に役立ちます。
共有
DockerHubでは作成したDockerイメージを共有できます。また、DockerHubではOSSの公式イメージなどを使えば、比較的簡単にOSSを利用できたりします。
dokcer-compose
Dokcerコンテナは、通常一つでは完結せず、複数のコンテナの連携によって、1つのシステムを構築します。
ここで、一つ一つのコンテナを手動で設定し起動を行っていると非常に手間になることがあります。ここで登場するのがdocker-conpose
です。docker-compose
ではコンテナの一括、構築、管理、連携などを行うことができます。
終わりに(感想?)
今回はそもそもDockerとはというところから始め、Dockerが動く仕組み、メリット、Dockerコンテナを実際に構築する際のツールなどについて調べてまとめました。
開発環境の構築などでDokcerを使うならdokcer-compose
で間に合いそうですが。実際のプロダクトだと、Kubernetesなどのコンテナオーケストレーションと呼ばれるものが使われていたり、Kubernetes環境をクラウドで構築するGKE(Google Kubernetes Engine)等が利用されたりします。
機会があれば、そっちも調べてまとめてみようと思います。