BETA

プログラマのためのDocker教科書 まとめ(2章)

投稿日:2018-12-30
最終更新:2018-12-30

この記事は、プログラマのためのDocker教科書を読んでひたすらまとめていく記事です!

なにか参考になればと思っております。
(何卒優しい目で見てやってください。)
(逐一、コメント的なの突っ込んでいくスタイルなので、そこもよろしくおねがいします。)

第2章 コンテナ技術とDockerの概要

目次

  • 2.1 コンテナ技術の概要
  • 2.2 Dockerの概要
  • 2.3 Dockerの機能
  • 2.4 Dockerが動く仕組み

2.1 コンテナ技術の概要

コンテナとは?
ホストOS上に論理的な区画(=コンテナ)を作り、アプリケーションを動作させるのに必要なライブラリやアプリケーションなどを1つにまとめ、あたかも個別のサーバのように使うことができるようにしたもの

【通常の場合】
物理サーバ(=物理的実体としてのサーバコンピュータそのもの)上にインストールしたホストOSでは、1つのOS上で動く複数のアプリケーションは、同じシステムリソースを使う。データを格納するディレクトリは共有、サーバに設定された同じIPアドレスで通信する。

【コンテナの場合】
アプリケーションの実行に必要なモジュールにまとめられるため、OSやディレクトリ、IPアドレスなどのシステムリソースを、個々のアプリケーションがあたかも占有しているかのように見せることができる。

2.2 Dockerの概要
Dockerとは
アプリケーションの実行に必要な環境を一つのイメージにまとめ、そのイメージを使って様々な環境でアプリケーション実行環境を構築、運用するためのプラットフォーム

「イメージってなんだ?」

イメージ
=> アプリケーションの実行に必要になるプログラム本体、ライブラリ、ミドルウェアやOS、ネットワークの設定を一つにまとめたDockerコンテナを作成する際に必要となるファイルシステム

プログラマにとってのDocker
継続的デリバリーが行われる開発において、開発環境では動くが、ステージング環境やプロダクション環境では動かないといったことが起こるのを防ぐために、これらのインフラ環境をコンテナで管理する。このように、インフラ環境をコンテナで管理することによって、環境のちがいでアプリケーションが動かなくなる可能性を最小限にし、かつ変化に強いシステム構築が可能になる。

「Dockerさん、素敵すぎるじゃないですか」

2.3 Dockerの機能
Dockerの機能は大きく分けると3つ

  1. Dockerイメージをつくる機能(=build)
  2. Dockerイメージを共有する機能(=ship)
  3. Dockerコンテナを動かす機能(=run)

不覚にも、2は聞いたこともなかった。
・Dockerイメージをつくる機能(=build)
Dockerイメージは、Dockerコマンドでも作れるし、Dockerfileを作成し自動で作成することもできる。継続的インテーグレーション/デリバリーの観点からDockerfileを使って、管理するのが望ましい。

・Dockerイメージを共有する機能(=ship)
DockerのイメージはDockerレジストリで共有できる。公式のイメージもあれば、個人が作成したイメージをDocker Hubで自由に公開、共有できる。要件に合うものがあればダウンロードして使うこともできる。

・Dockerコンテナを動かす機能(=run)
Dockerはlinux上でコンテナ単位でサーバを動かす。このコンテナの元がDockerイメージで、それがあれば、Dockerがインストールされていればどこでもコンテナを起動できる。
Dockerは、1つのLinuxカーネルを複数のコンテナで共有している。コンテナ内で動作するプロセスを1つのグループとして管理し、グループごとにファイルシステムやホスト名、ネットワークなどを割り当てている。

プロダクション環境では、すべてのDockerコンテナを1台の物理サーバで動かすことはまれで、トラフィックの増減、可用性、信用性を考慮し複数の物理サーバからなる分散環境を構築することになる。

「トラフィックの増減、可用性、信用性に応じて分散させることで柔軟なつくりになるのか」

2.4 Dockerが動く仕組み
コンテナを区画化する技術は、Linuxカーネルのnamespaceという機能を使っている。

「ん?namespaceって?」

namespace
=>名前空間、まとまったデータに名前をつけ、分割することによって、衝突の可能性を減らし、参照をようにする概念

Linuxカーネルのnamespaceによって、以下の6つの独立した環境を構築できる。

  1. PID namespace
    PID(=Process ID)とは、各プロセスに割り当てられたユニークのID。PID namespaceは、PIDとプロセスを隔離し、namespaceが異なるプロセス同士は、互いにアクセスできない

  2. Network namespace
    Network namespaceは、ネットワークデバイス、IPアドレス、ポート番号、ルーティング、テーブル、フィルタリングテーブルなどのネットワークリソースを隔離されたnamespaceごとに独立して持つことができる。これを使うことでホストOS上で使用中のポートがあってもコンテナ内で同じ番号のポートを使えるようになる

  3. UID namespace
    UID namespaceは、UID(ユーザーID)、GID(グループID)をnamespaceごとに独立して持つことができる。namespace内とホストOS上のUID/PIDとが互いに紐付けられ、名前空間の外と中で異なるUID/PIDを持つことができる

  4. MOUNT namespace
    MOUNT namespaceは、マウント操作をするとnamespace内に隔離されたファイルシステムツリーをつくる

    マウント
    =>コンピュータに接続した機器や記憶装置をOSに認識させて、利用可能な状態にすること。

    「イメージがしづらいが、ツリー構造のファイルシステムをつくってくれるのだろう」

  5. UTS namespace
    namespaceごとにホスト名やドメイン名を独自にもつことができる。

  6. IPC namespace
    プロセス間通信(IPCオブジェクト)をnamespaceごとに独立して持つことができる。

    IPCオブジェクト
    => コンピュータの動作において、複数プロセス(の複数スレッド)間でデータをやりとりする仕組み

ここでのキーワードは、「隔離」、「独自」、「独立」
つまり、他のnamespaceは干渉できないので、セキュアでかつ影響しあわずに環境を構築できるということか!

【リソース管理の仕組み】
物理マシン上のリソースを複数のコンテナでどうさせるため、リソースをどう割り当てるかはとても大事になってくる。Dockerでは、Linuxカーネルの機能であるcontrol groups(cgroups)という機能を使っている。cgroupsはプロセス、スレッドをグループ化し、そのグループ内のプロセス、スレッドに対して管理を行う。これによって、グループごとに、ホストOSのCPUやメモリリソースに対して制限をかけることができるので、同ホストOS上で動く他のコンテナに影響を与えることを防げる。

「cgroupsってやつがよしなに、リソースを分配してくれるのか。やるね。」

【ネットワーク構成(仮想ブリッジ/仮想NIC)】
LinuxにDockerをインストールすると、サーバの物理NICがdocker0という仮想ブリッジネットワークに接続される

NIC
=> ネットワークカードのこと。コンピュータネットワーク内でコンピュータ間の通信を行うために使用されるハードウェアの1つ。

Dockerでは、Dockerコンテナと外部ネットワークが通信を行うとき、仮想ブリッジdocker0とホストOSの物理NICでパケットを転送する仕組みをNAPT(Network Address Port Translation)で実現している。

NAPT(Network Address Port Translation)
1つのIPアドレスを複数のコンピュータで共有する技術で、IPアドレスとポート番号を変換する機能のこと

Dockerでこの機能を使うときは、コンテナ起動時にコンテナ内で使っているポートを仮想ブリッジdocker0に対して開放する。

例えば、コンテナ起動時、コンテナ内部のwebサーバの80番ポートを、ホストOSの8080番ポートに転送するように設定する。そうすることで、外部のネットワークからホストOSの8080番ポートにアクセスすると、コンテナ内の80番ポートにつながる

「なるほど。いろいろみえてきたぞーーーーーーー!!!」

第2章は以上!
第1章、第2章ともに概要的な話でしたが、次からはもっとDockerの使い方に入っていきます!

ではまた!!!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@hamaの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!