LoginSignup
32

More than 3 years have passed since last update.

posted at

updated at

Organization

Docker for Windowsの概要と導入

はじめに

ノートPCを新調したので、OSをWindows10 Proにしました。Docker for Windowsを試してみます。Dockerを使用したいだけなら、実はVirtual Boxや、WSLでも動かせます。

じゃあ、なんでProにしたのと言うと

Hyper-Vが使えると、色々できるからです。ぶっちゃけ Docker for Windows 触りたいだけです。
Dockerまわりの情報の整理と、Windowsにインストールするところまで実施します。

環境

  • OS: Windows10 Pro 64bit
    • Version: 1903
    • OS build: 18362.418

そもそもDockerってなに?

仮想化技術の一つです。仮想化とは、1つの物理サーバの上で、複数の仮想的なサーバを動かしたり、逆に複数のサーバを1つのサーバのように見せたりするものという感じです。Dockerの話をする前に少し昔話を。一昔前に流行っていたのは、完全仮想化と呼ばれる技術でした。

ハイパーバイザ型

image.png
What is a Container? | Dockerより

上記はハイパーバイザ型の完全仮想化の概要図です。サーバにOSの代わりにハイパーバイザという仮想化ソフトウェア(VMware ESXiやXenなど)を動作させます。1台のサーバの上で、複数の仮想ハードウェア(仮想マシン)を動作、更にその仮想ハードウェアにOS/アプリケーションをインストールして動作させるという仕組みでした。イメージ的にサーバの上に、小さなサーバを複数並べる感じですね。

この仕組だと、仮想ハードウェアにCPU/Memory/Storageなどを固定(可変の場合もある)で割り当てる必要があるほか、ハードウェアをエミュレートしているため処理に無駄がありました。殆どのユーザは仮想ハードウェアが必要ではなく、本当に必要なのは仮想ハードウェアで動くアプリケーションでした。

そこで出てきたのが、より軽量なコンテナ型仮想化です。

コンテナ型

image.png
What is a Container? | Dockerより

ということで、コンテナ方式(ここではDocker)ではアプリケーション部分をコンテナという単位で管理するようになりました。コンテナは独立した仮想ハードウェアとしてではなく、OSの1プロセスとして動きます...

Dockerを触り始める前までだったらこの説明だけで納得できるのですが、実際に触り始めると結構疑問が出てきます。

  • コンテナってOS含まれないはずなのに、コンテナごとにUbuntu/CentOSとか違うディストリビューション動いてない?
  • コンテナって仮想ハードウェアじゃないのに、コンテナごとにネットワークインターフェースとか持ってない?

なぜDockerではホストOSと違うOSベースのコンテナイメージが動くのか
Docker overview | Docker Documentation
Docker frequently asked questions (FAQ) | Docker Documentation

で答え合わせをすると

  • Linux kernel自体は互換性あるので、必要なファイルシステム、ライブラリがあれば他のディストリビューションも動かせる
    • コンテナ内にはディストリビューションごとに必要なファイルシステム、ライブラリだけある。
    • 各コンテナ内の処理は、ホストOSのkernelで動いてるけど、互換性のおかげでディストリビューションごとの動きを再現できている。
  • Linux kernelのnamespace/cgroupsを利用して、コンテナごとの独自設定や、ハードウェアのリソースをコンテナごとに割り当てている
    • namespace: プロセスごとに保持する情報を分ける機能。これによってコンテナごとに異なるネットワークインターフェース情報などを定義できる。
    • cgroups: プロセスごとにハードウェアリソースを割り当てる機能。コンテナごとに利用できるCPU/Memoryなどのリソースを制御する。

ということだそうです。Linux kernelすげー。

Docker for Windows

あれ、WindowsってLinuxとkernel違うからLinux用のコンテナ動かなくない?

コンテナーは、コンテナーホストとの間でカーネルを共有しているため、Windows で直接 Linuxのコンテナーを実行する方法はありません。

Linux Containers on Windows | Microsoft Docs

Oh...

image.png

Moby VM の Linux コンテナーより

はい、LinuxのコンテナはHyper-VのMoby Linux VM上で実行されます。そうなりますよね。Macもほぼこれと同じ方式っぽいですね。ちょっとわかりにくいですが、図の「Windows Container Host」はVMじゃなくてWindows10を指しているみたいですね。

Linux Containers on Windows

image.png
Moby VM の Linux コンテナーより

LCOWとよばれる方式です。こちらはWindows/Linuxでそれぞれ分かれていたDocker Demonが一つになってます。これによって、Windows/Linux間で統合されていなかったnamespaceが統合され、Windows/Linuxコンテナを同時実行できるようになるようです。また、Moby Linux VMからUtility VMと呼ばれるVMを使用しています。現状Utility VMはコンテナを起動するごとに作成されてしましますが、LinuxKitコンポーネントの恩恵によりオーバヘッドは少ないようです。

(Moby ProjectおよびLinuxKit周りの知識がないとちょっと掘り下げできなそうですね)

こちらはまだ開発段階の機能らしいので、今回は使用しません。

図解で理解できる(はず)Microsoftの仮想化技術――Windows上で稼働するLinux、動かしているのはどのテクノロジー?

Dockerのエディション

Windows 10 の windows と Linux のコンテナー | Microsoft Docs

公式ページを参考にDockerをインストール...あれ、この手順みんながよくインストールしているDocker Desktop for Windows とはちょっと違うような...ということでちょっと調べることに。

image.png

Install Docker on Windows Server 2019 – 4sysopsより

調べてみたところ

  • Dockerの基本コンポーネントに、Docker EngineとDocker Clientが存在する

image.png
Overview of Docker editions | Docker Documentationより

image.png

About Docker Enterprise | Docker Documentationより

また、Docker Enterpriseと呼ばれる製品が存在しており、Docker EnterpriseはDocker Engine EEの機能に加え、セキュリティ/オーケストレーション/デスクトップ向け機能(Docker Desktop Enterprise)なども付与されている。

Microsoftの公式でインストールしていたものはDcoker Engine EEのインストール手順1だったようです。Desktop向けのGUIや、docker-composeなどの機能も欲しかったのでDocker Desktop(Docker Engine CEを含む)をインストールすることにします。

インストール手順

Hyper-V の有効化

PowerShellを管理者権限で開き、Hyper-Vの機能を有効化します。

PS C:\Users\xxx> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

機能を有効化するために再起動します。

この操作を完了するために、今すぐコンピューターを再起動しますか?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"):

そのままEnterを押します。
再起動後、「プログラムと機能」を開いて有効化しているか確認してみます。

設定 -> アプリ -> プログラムと機能 -> Windowsの機能の有効化または無効化

image.png

有効化されていました。

Windows 10 での Hyper-V の有効化 | Microsoft Docs

Dockerのインストール

Get started with Docker for Windows | Docker Documentation

上記のリンクから Docker Desktop for Windows のインストーラーをダウンロードします。

image.png

インストーラを起動するとこの画面が開くので、「OK」ボタンを押してインストールを開始。
再起動後、PowerShellを管理者権限で開き、Dockerのバージョンを確認します。

PS C:\Users\xxx> docker --version
Docker version 19.03.4, build 9013bf5

PS C:\Users\xxx> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

問題なさそうです!

終わりに

既存の情報の整理や、気になった点を調べたりしてたせいで、あんまりDockerのコマンドなどは触れられませんでした。。。あと、Dockerのエディションは結構変更があってややこしいですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
32