Windows 10 Hyper-Vユーザに送るDockerの解説


この記事は?

Dockerの勉強を始めて1週間、Hyper-Vしか知らない同僚にDocker教えてくれと言われたので書きました。
せっかく勉強したのでQiitaで公開してみます。
誤り指摘やアドバイスがあれば、コメントをお願いします。

環境

  • Windows10 version.1709
  • Docker version 17.12.0-ce, build c97c6d6

用語説明

  • Dockerイメージ
    仮想ディスク(=.vhdx)。後述するDockerレジストリでDockerイメージを共有することができる。
    Dockerを使って何か作業する時のベースとなる。

  • Dockerコンテナ
    Dockerイメージから差分ディスクを作って起動した仮想PC。
    1つのイメージから複数のDockerコンテナを作ることができ、それぞれの同時実行も可能。

  • Dockerレジストリ
    仮想ディスクを共有するための共有フォルダ。
    Docker Hubという公式レジストリもあり、公式イメージとして、CentOSやUbuntuといったLinuxディストリビューションやNginxやHttpd、redisといったアプリケーション単位のイメージがある。
    自分で作ったイメージをアップロードすることもできる。
    オンプレミスなサーバとしても立てることができるらしい。

  • Dockerfile
    Dockerイメージを作るためのソースコード。
    無理やりHyper-Vでいうと仮想PC作成後に実行するためのスクリプトファイルみたいもの。
    Hyper-Vで例えると、イメージから仮想ディスクを複製→VM起動→スクリプト実行→シャットダウンまでを一括で行って、新しい仮想ディスク(=Dockerイメージ)を作ることができる。

FAQ

  • 要するにDockerって仮想PCみたいなもの?
    →仮想PCのようにも使えますが、どちらかというとアプリケーション単位でコンテナを作るほうが良いようです。
    そういう意味では、OSの機能まで含めてサイドバイサイドでアプリケーションを実行できるプラットフォームと呼ぶべきでしょうか。

  • Windows on Dockerは?
    →できるようですが、まずはDocker入門としてここでは扱いません。
    タスクバーのDockerアイコンを右クリックすると「Switch to Windows Containers」というメニューがありますので、あとは自分でググってください。
    個人的にはWindows on Dockerはもう少し様子見です。

コマンド体系

他にあるけど、基本ということで。

使ってみる

事前準備

  1. Windows10を用意します。
  2. Hyper-Vを有効化します。
  3. Docker for Windowsをインストールします。 (Chocolateyパッケージもあったけど、インストール失敗しました(2018-02-13現在)。)
  4. Dockerのアカウント作成とログイン・・・は不要だったはず。

CentOSでbashを起動して、後始末まで

できるだけゴミを残さないようにがんばってみる。

1.公式イメージをダウンロードする

Docker HubからCentOSのDockerイメージをダウンロードします。

C:\Users\user> docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Pull complete
Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
Status: Downloaded newer image for centos:latest

2. ローカルのイメージの一覧

ローカルに保存済みのイメージ一覧を表示させます。
先ほどPullしたcentosがあります。

C:\Users\user>docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        5 weeks ago         207MB

3.コンテナを作って起動

pullしたイメージをベースにコンテナを作って起動します。
起動するプロセス(/bin/bash)も引数に指定します。
-it はインタラクティブに操作する場合に指定します。

C:\Users\user> docker run -it centos /bin/bash

4. 適当に触る

bashが起動するので、適当に触ります。
ほぼ空のCentOSなので本当に基本的なコマンドしか使えませんが。
終了は、コンテナが終了しちゃいますが、exitで抜けます。
「Ctrl+p」→「Ctrl+q」で終了せずに抜けることもできます。

[root@051c55f61ce6 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@051c55f61ce6 /]# ping -c 2 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.024 ms

--- localhost ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1033ms
rtt min/avg/max/mdev = 0.020/0.022/0.024/0.002 ms
[root@051c55f61ce6 /]# exit
exit

5. コンテナ一覧

ローカルにあるコンテナ一覧を表示します。
先ほど起動したcentosのbashがあります。
-aをつけると終了済みのコンテナも表示、無しだと稼働中コンテナだけ表示されます。
CONTAINER ID (コンテナID)は重要なのではじめの数文字を覚えておきます。

C:\Users\user>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                   PORTS               NAMES
051c55f61ce6        centos              "/bin/bash"         3 hours ago          Exited (0) 3 hours ago                       clever_leavitt

6. コンテナ削除

お試しで作っただけなのでコンテナは削除します。
引数はコンテナIDを指定しますが、他と識別できる初めの数文字で良いようです。

C:\Users\user>docker rm 05
05

C:\Users\user>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

7. イメージ削除

使わずに残しておくとディスクを圧迫するので、不要なイメージは削除します。
後で使うなら削除しなくても良いですが。

C:\Users\user>docker image rm centos
Untagged: centos:latest
Untagged: centos@sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
Deleted: sha256:ff426288ea903fcf8d91aca97460c613348f7a27195606b45f19ae91776ca23d
Deleted: sha256:e15afa4858b655f8a5da4c4a41e05b908229f6fab8543434db79207478511ff7

C:\Users\user>docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Dockerコンテナをサービスとして使う

上の例では、インタラクティブに操作していて、仮想PCのように使っていますが、
Dockerコンテナはサービスとしてバックエンドで起動するほうが一般的なようです。

ポイントは、「docker run -it 」ではなく「docker run -d」を使用します。

チュートリアル的に何か書こうと思いましたが、良い記事があったので、こちらを参考にしてください。