初心者でもDockerのうれしいことが分かってしまう!!

オウルです。
前回の続きになります。
Kubernetesを理解する上で、Dockerの基礎知識が必要となります。僕がDockerの知識ゼロのまま、勢いでKubernetesに突撃した結果・・・撃沈です。当然です、KubernetesはDockerありきですからね。この実体験からKunernetesをはじめてみたいという方は、Dockerの基礎だけでも知っているとよいかと思います。僕のように分からないことが分からないを回避するためにも、またKubernetes ⇒ Docker ⇒ Kubernetesの調べ方(機能・役割なのか)もスムーズになります。
DockerはLinuxコンテナの技術を使用したコンテナ型仮想化技術です
アジェンダ
  • Linuxコンテナとは
  • Dockerイメージとは
  • Dockerコンテナとは
  • Dockerのうれしいこと
Linuxコンテナとは
Linuxコンテナとは、Linux上で起動する各プロセスをコンテナのように壁を作り隔離した状態で起動することです。
この隔離を実現するためにLinuxカーネルの名前空間cgroupの役割を知ることが重要になります。ではLinuxカーネルの名前空間とcgroupって一体何でしょうか。
前空間、cgroupって何?
名前空間
Cgroup
プロセスのcgroup名前空間を分離するために、ルートディレクトリを扱う(Linux 4.6~)
IPC
System Vプロセス間通信(IPC:Inter Process Communication)とPOSIXメッセージキューを分離(Linux 3.0~)
Network
ネットワークデバイス、ルーティングテーブル、ファイアウォールルール、ポート等を分離(Linux 3.0~)
Mount
マウントポイント、ファイルシステムを分離(Linux 3.8~)
PID
実行するプロセスIDの分離(Linux 3.8~)
User
ユーザID(UID)とグループID(GID)の分離(Linux 3.8~)
UTS
ホスト名(unameおよびhostnameコマンドで取得できる名前)の分離(Linux 3.0~)
『コンテナ・ベース・オーケストレーション』(翔泳社)より引用
cgroups
リソースの管理とリソースの集計/追跡を行います。これはLinuxカーネルの機能であり、プロセスの集まりに対し、リソース使用を制限/割り当て/分離します。
『コンテナ・ベース・オーケストレーション』(翔泳社)より引用
まり
Linuxカーネルの名前空間でプロセスを分離、cgroups(コントロールグループ)を使用してDockerコンテナを動作させるホストCPUメモリネットワークディスクI/Oなどのシステムリソースを制御するということです。
じゃ、この制御を具体的にどこにどのように設定するの?という疑問はKubernetesでのコンテナデプロイで取り上げたいと思います。ここではコンテナをデプロイするときのマニフェストファイル(yamlファイル)にリソースを指定することができる、でとどめておきます。
Dockerイメージとは
DockerイメージとはDockerコンテナ作成時に必要となるファイル群の総称であり、読み込み専用(read-only)のテンプレートです。
Docukerイメージはイメージレイヤのスタックです。この複数のイメージレイヤの集合体(積み重ね)を1つのファイルシステムとして見えるようにします。
※黒ファイル:実体ファイル
※白ファイル:レイヤを通して見えるファイル
nginxをdocker pull(レジストリからDockerイメージを取得)
「Pull complete」はイメージレイヤごとに並列でダウンロードしています。
ではDockerfileを見てDockerイメージからコンテナをデプロイするイメージを掴んでみましょう。
ockerfileとは
Dockerfileは、Dockerイメージをアセンブルするためにコマンドラインで呼び出すことができるテキストドキュメント(Dockerイメージ構成ファイル)です。
分かりやすくいうとパブリックに公開されているDockerイメージ(Docuker Hub)に僕(ユーザー)が必要なパッケージやアプリケーション、ツール等を含めてオリジナルDockerイメージを作成する場合に、このDockerfileを使用します。次のDockerfileを見てみましょう。
ockerfileを見る
このDockerfileは、Visual Studio 2017でASP.NET CoreプロジェクトのDockerを有効化した時に自動生成されるDockerfileです。
(1)ASP.NET Core2.0をベースイメージとして使用します。どのDockerイメージもベースイメージを指定する必要があります。
●Alpineのベースイメージ
僕は、このベースイメージで初めてAlpineというLinuxディストリビューションを知ります。このAlpineは、セキュリティ・シンプルさ・リソース効率を重視するパワーユーザー向けに設計されているみたいです。すごく軽量です。
※nginxの[TAG]1.15.6-alpineのDockerイメージはベースイメージにalpine:3.8を使用しています。
(2)作業ディレクトリを変更します。
(3)コンソールに出力します。
※RUNはコマンドを実行します。
(4)80ポートで公開します。
(5)ASP.NET Coreのビルドイメージとして使用します。
(6)コピーします。
※COPYは、指定したファイル・ディレクトリをコンテナ内にコピーします。
(7)プロジェクトの依存関係とツールを復元します。
※dotnet restoreは.Net Core 2.0のコマンドです。
(8)ホスティング システムへの展開のため、アプリケーションとその依存関係をフォルダーにパックします。
※dotnet publishは.Net Core 2.0のコマンドです。
(9)–from=publishで直前のイメージを参照してコピーします。
(10)コンテナを実行するときの引数としてエントリーポイントに渡します。
ockerRegistryとは
DockerRegistryにはパブリックプライベートの考え方があります。
  • パブリック
Docker Hubのようにインターネット上に公開されているレジストリ
  • プライベート
オリジナルアプリケーションのようにインターネット上に公開すべきでないものを保持するレジストリ
パブリッククラウドには、このDockerRegistryサービスがあります。ただDockerRegistryサービス単体では利用シーンはないです。クラウドコンテナサービス等と連携して初めて威力を発揮するサービスです。
Azure Container Registry
Azureがサービス提供しているDockerレジストリです。
Amazon Elastic Container Registry
AWSがサービス提供しているDockerレジストリです。
Container Registry
Google Cloudがサービス提供しているDockerレジストリです。
Dockerコンテナとは
当初、僕はLinuxコンテナはDockerコンテナのことを指していると思っていたのですが、違っていました。
DockerコンテナとはLinuxコンテナの技術を使用したコンテナ型仮想化技術で、Dockerはこのコンテナ型仮想化を実現するランタイムソフトウェア)の1つです。
仮想化といえばHyper-V(Windows)、VirtualBox(Oracle)、VMwareの所謂、仮想マシンがお馴染みです。前回、docker for WindowsをインストールしてHyper-V(Windows)上に環境を作成しました。その環境もDockerコンテナを動作させるLinuxOSの仮想マシンです。コンテナ型仮想化は、仮想マシンとの比較がよく取り上げられます。ここでも簡単に比較してみましょう。
ンテナと仮想マシンの比較
何を抽象化するのか
コンテナ
アプリケーション層でコードと依存ファイルをパッケージした抽象化
・仮想マシン
物理ハードウェアの抽象化
起動速度
コンテナ
単にプロセス起動のため速い
・仮想マシン
OSのブートプロセスをエミュレートするため起動がコンテナに比べて遅い
Dockerコンテナのアプリケーションから見ると独立したコンピュータで動作しているように振る舞います
イント
Dockerのイメージ自体は起動されても更新は保存されず、明示的に保存docker commit)をしなければコンテナ破棄時docker rm)に変更分が消えてしまう仕様になっています。ん!?ちょっと待ってとなりますよね。
Dockerイメージは、読み込み専用(read-only)のテンプレートではないの?となるはずです。では、Dockerコンテナを実行した時の下のイメージ図を見てください。
緑色のイメージレイヤが追加されています。DockerEngineは、Dockerコンテナ実行時にコンテナ用の読み書き可能なイメージレイヤを追加するのです。では、手を動かして確認してみましょう。
SQL Server on Linuxコンテナをデプロイして接続します。

docker runコマンドを実行して、最終行の「56aebc332ae25~」はコンテナIDです。では、このコンテナIDを指定してコンテナに接続します。
コンテナに接続しました(SQL Server on Linuxコンテナの中)。次はSQLServerに接続して「TestDB」データベースを作成します。
「exit」でSQLServerからログアウトしましょう。今度は、データベースファイルが作成されているか確認します。
作成されていますね。では「exit」で一度コンテナから抜けましょう。
では、一度SQL Server on Linuxコンテナを停止します
再度、SQL Server on Linuxコンテナを開始します。

先ほどの手順で「TestDB」が存在しているか確認して下さい。
「TestDB」ありますよね。確かに書き込めています。
停止したコンテナはスナップショットに保存され、「docker start コンテナID」で停止したdockerコンテナのスナップショットを再起動します。
※停止したコンテナは、docker ps -a で確認すると「STATUS」が「Exited」となっているはずです。
本来であればデータベースファイルの永続化、ポート公開などの必要がありますが、それはKubernetessで紹介します。
コンテナが起動されない時

コンテナのログが表示されます。この情報から原因を調査します。
docker のヘルプコマンド

コマンド一覧が表示されます。

例えばdocker runコマンドのオプションが知りたい場合
うれしいこと
動速度が速い
単にプロセス起動のため速い。
帯性
動作させたいアプリケーションコードと依存ファイルをパッケージしてDocker Imageにしておけば、別の環境のDockerエンジン上でデプロイしても、振る舞いに差異がない。
この2点言葉にすると、ものすごくシンプルです。ですが、例えばアプリケーションの起動時間を短縮することが、どれほど大変で、また違う環境になった途端に訳の分からないエラーがでてガックシする現場レベルの人間からすると、マジで?!と思ってしまう、うれしいことではないでしょうか。
Dockerの特徴は「軽量」「携帯性」「揮発性」の3つのキーワードでよく表現されます。今回は「軽量」(起動速度が速い)「携帯性」(振る舞いに差異がない)について、うれしいことを紹介しました。「揮発性」については、Kubernetesでふれていきます。
最後に書籍の紹介です(Linuxコンテナのところで引用させていただいている書籍です)。Kubernetesを知る上で必要となるDockerの基礎、パブリッククラウドのコンテナサービスの動向、その他のオーケストレーションプラットフォームなど、コンテナに関連する情報を広く知るには良い本です。この書籍から自分は、どの技術・サービスをより深めていくべきかの選択肢を知ることができます。
コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

橋本 直哉, 須江 信洋, 前佛 雅人, 境川 章一郎, 佐藤 聖規, 山田 修司, 青山 尚暉, 市川 豊, 平岡 大祐, 福田 潔, 矢野 哲朗
4,298円(12/12 00:59時点)
発売日: 2018/03/15
Amazonの情報を掲載しています


今回もお付き合いいただき、ありがとうございました。


漫画・コミックランキング

にほんブログ村 漫画ブログへ
にほんブログ村


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA