Docker Desktop for Windowsを使ってみる。

Docker Desktop for Windows を使ってみます。
ダウンロードは Docker Desktop for Windowsのページからできますが、まずユーザ登録が必要です。
Docker Desktop for Windows is Docker designed to run on Windows 10. It is a native Windows application that provides an easy-to-use development environment for building, shipping, and running dockerized apps. Docker Desktop for Windows uses Windows-native Hyper-V virtualization and networking and is the fastest and most reliable way to develop Docker apps on Windows. Docker Desktop for Windows supports running both Linux and Windows Docker containers.
Docker Desktop for Windows は Windows 10 で動作するように設計された Docker です。ネイティブな Windows アプリケーションで、ドッカライズされたアプリをビルド、シップ、起動するための簡単に使える開発環境です。Docker Desktop for Windows は Windows のネイティブ Hyper-V 仮想化およびネットワーキングを利用していて、Windows 上での Dockerアプリを開発する最も速く信頼性の高い方法です。Docker Desktop for Windows は Linux と Windows 両方の Docker コンテナをサポートします。

Docker には2種類あるようで、Stable channel は4ヶ月毎の更新で、使用統計データを Docker に送るか送らないかを選べます。Edge channel は不安定なこともあるかもしれないけれど頻繁にバグ修正などが行われますが、使用統計データを Docker に送ります。
試しに使ってみるだけなので、ここでは Stable channel を選びます。
インストールが終わるとログアウトを求められます。ここでは再起動までは不要のようです。
再度ログオンすると、次のようなダイアログが表示されます。
「Hyper-V を有効化するけどいいですか?自動的に再起動しますけど。あと VirtualBox は動かなくなりますけど」とのこと。ここは「OK」します。
当然、自動的に再起動します。おそらく Windows コンポーネントの Hyper-V を有効にしてるんでしょう。
確認したらやっぱりそうでした。
デスクトップに "Docker Desktop" アイコンができています。
なんかクジラが荷物運んでます。
が、クジラをクリックしても何も起こらないので、まずは初心に戻って Get started with Docker for Windowsを読んでみます。
Docker is a full development platform for creating containerized apps, and Docker Desktop for Windows is the best way to get started with Docker on Windows.
Docker はコンテナ化されたアプリを作成するフル開発プラットフォームで、Docker Desktop for Windows は Windows 上で Docker を始める上でベストな方法です。
だそうです。

それでは早速コマンドプロンプトを起動して、docker --version を入力します。
$ docker --version
Docker version 18.09.2, build 6247962
次に、hello-world を pull します。
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
pull だというのにコマンドは run のようですが、Docker Hub からなにやらダウンロードしてきました。
再度 dcoker run hello-world すると、上のメッセージの "Hello from Docker!" 以降が表示されました。どうやらそれがアプリの実行結果のようです。でもカレントディレクトリには hello-world はありません。

ちょっとディレクトリを調べてみると、%USERPROFILE%\AppData\Local\Docker にログファイルが、%USERPROFILE%\AppData\Roaming\Docker にはいくつかの .json ファイルがあります。また、\ProgramData\DockerDesktopにもファイルがあります。が、どうにも hello-world は見つかりません。

検索してみると、Forum に回答がありました。
C:\Users\Public\Documents\Hyper-V\Virtual hard disks に保存されているとのことです。
このイメージの保存場所を変更するには、「Hyper-V マネージャー」から行うのがよいようですが、とりあえずおいておきます。

Docker Hub を検索したら、ArchLinux があったので、これを使ってみます。
$ docker run archlinux/base
Unable to find image 'archlinux/base:latest' locally
latest: Pulling from archlinux/base
f3e37ac93b0e: Pull complete
Digest: sha256:f9496957524a239cf60cd0adb0a84ae633c0b712364988cd113e4fc66cdb8b7e
Status: Downloaded newer image for archlinux/base:latest

$ docker run archlinux/base
…何も起こりません。実はどうやらこれだけだと、仮想環境を起動してすぐに終わっている、ようです。以下のようにすることで、/bin/bash が起動します。
$ docker run -it archlinux/base /bin/bash
[root@95b5542f9322 /]# uname -a
Linux 95b5542f9322 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 GNU/Linux
ここで pacman を使ってみると、ちゃんと使えました。
さらに Get started with Docker for Windows に沿って進めると、今度は Nginx を走らせようとしています。
$ docker run --detach --publish 80:80 --name webserver nginx
docker run --help すると、--detach は「コンテナをバックグラウンドで走らせ、IDを表示する」、--publish 80:80 は「指定されたポートをホストに開放する」、--name webserver は「コンテナに名前をつける」だそうです。
対象的に、--attach というオプションがあって、これは STDIN/STDOUT/STDERR をコンテナにアタッチするという指示のようですから、--detach はその逆かもしれません。--publish の "80:80" は、コンテナ内のポート 80 をコンテナ外のポート 80 と接続する、というイメージです。
--name webserver で "webserver" という名前をつけていますが、これはコンテナを停止するときに利用できます。docker container stop webserver でバッググラウンドの Nginx が止まります。
また、コンテナの削除は docker container rm webserver で "webserver" コンテナが削除されます。ただしイメージ "nginx" は残ります。イメージを削除するのは docker rmi nginx です。ただし、そのイメージを参照しているコンテナがあると削除できません。なので docker container ls --all で停止しているコンテナも含めてすべて確認します。
"run" コマンドではコンテナを新規に作成しますが、すでにあるコンテナを開始するには docker container start とします。必要に応じて "-i" (interactive)オプションを指定します。

以上を踏まえると、Windows 上では動作できない uWSGI などは、Docker 上の Linux で動作させてしまえば、あとは TCP ポートを開けてやることで通信できる、ということになります。ただ、設定ファイルなどはイメージ内にあるのでシームレスにアクセスできないという点は面倒そうです。逆にローカルドライブはコンテナ内の Linux からマウントすることでアクセスできるようです。

コンテナ内から Docker を proxy してホスト PC から外部にアクセスできるので、モデルとしては、
Nginx (Windows) <-> uWSGI (Docker) <-> MariaDB (Windows)
などということもできそうです。

が、冷静に考えると、uWSGI を動かすために数百 MB のディスク領域と大量のメモリが必要です。これは開発用とかテスト用ならまだしも、本番ということなら「なんで Linux でやらないの?」ということになりますね、確実に。しかもコンテナの中で変更されたファイルは、履歴管理がやっかいです。これは相当分が悪いと、少なくとも自分的には考えてしまいます。

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...