概要
Windows10にDocker環境を構築したのでいろいろ試してみた
その中で今回は、Docker Machineでやったこととコマンドのまとめ
具体的には、自分のローカルマシンのHyper-V上にDocker Machineを使ってDockerの実行環境を構築
DockerとDocker Machineの関連は以下を参照
動作環境とDocker Machine環境構築方法は以下を参照
(Docker for Windowsをインストールすれば同梱されているためDocker Machineはそのまま使える)
- Windows 10 Pro 64bit
- Docker for Windows
Docker Machineとは
- ホストマシンにDockerの実行環境をコマンドで構築できる(Docker Engine をインストールしてDockerマシンを作ることができる)ツール
- 構築環境は手元のWindows、Mac等に限定されずクラウド環境にも構築できる
- クラウド環境はAmazon Web Services/Microsoft Azure/Google Compute Engine等々をサポート
- Docker Hubと連携して、自分の手元のマシンで開発環境のDockerイメージを作成、Docker Hubに保存、Docker Machineで構築したAWSのDocker実行環境に同じ開発環境を作成する。等ができるようになる
⇒つまりDockerを複数のマシン/クラウドといったマルチホスト環境で運用できるようになる
公式サイト Docker Machine
公式サイト サポート環境
およその作業時間
1時間
参考書籍
プログラマのためのDocker教科書 第7章
わかりやすくてDockerの入門書的な良本です^^
みんな購入していて売れ行き好調なのか第2版が発売されていたのでリンク更新
Docker Machine 入門(Hyper-Vの場合)
手順から構成まで大いに参考にさせて頂きました^^;
使用コマンド一覧
docker-machine create -d ドライバ名 作成するマシン名
docker-machine ls
docker-machine ssh マシン名
docker-machine scp マシン名:ダウンロードファイル 格納フォルダ
docker-machine ip マシン名
docker-machine inspect マシン名
docker-machine env マシン名
docker-machine start マシン名
docker-machine stop マシン名
docker-machine kill マシン名
docker-machine rm マシン名
事前準備
初期状態のHyper-Vでは、仮想スイッチがDockerNATしかないためIPアドレスを使った接続ができない。必要であれば、Hyper-Vの仮想スイッチを追加する
仮想スイッチ追加手順
Hyper-Vマネージャーを起動して、右側のメニューの仮想スイッチマネージャーを選択
新しい仮想ネットワークスイッチで「外部」を選択し「仮想スイッチの作成」をクリック
表示される仮想スイッチのプロパティで任意の名前を指定し、外部ネットワークで自身の環境のネットワークカードを選択後、OKをクリック
PCを再起動する
docker-machine create -d ドライバ名 作成するマシン名
Hyper-V上にVMを作成しboot2dockerイメージのインストール、SSH、仮想スイッチ、仮想ディスクの設定を一度にやってくれるコマンド
PowerShellを管理者として起動して実行する
> docker-machine create -d hyperv --hyperv-virtual-switch "VirtualSW" machine
Running pre-create checks...
Creating machine...
(machine) Copying C:\Users\user\.docker\machine\cache\boot2docker.iso to C:\Users\user\.docker\machine\machines\machin
e\boot2docker.iso...
(machine) Creating SSH key...
(machine) Creating VM...
(machine) Using switch "virtualSW"
(machine) Creating VHD
(machine) Starting VM...
(machine) Waiting for host to start...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe env machine
今回、マシン名"machine"で作成
「--hyperv-virtual-switch」はオプション。デフォルトでは一番目に見つかったものが設定されるが念のため明示的に指定
その他オプションは公式ページを参照
注意
一度createして再度同じ仮想スイッチを使って別のマシンをcreateすると以下のエラーが発生
(原因はよくわからず最初に作成したマシンを削除してやり直しても同じエラーが発生、、、)
(machine) Waiting for host to start...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Error creating machine: Error detecting OS: OS type not recognized
仮想スイッチを削除、また新しく仮想スイッチを作り直しPC再起動したら成功した
docker-machine ls
Docker Machineで管理しているマシンの一覧/状態を表示するコマンド
> docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
machine - hyperv Running tcp://192.168.0.XX:2376 v17.12.0-ce
docker-machine ssh マシン名
Docker Machineで作成したマシンにSSHで接続するコマンド
> docker-machine ssh machine
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.12.0-ce, build HEAD : 378b049 - Wed Dec 20 23:39:20 UTC 2017
Docker version 17.12.0-ce, build c97c6d6
docker-machine scp マシン名:ダウンロードファイル 格納フォルダ
Docker Machineで作成したマシンからSCPでファイルをダウンロードするコマンド
> docker-machine scp machine:/home/docker/log.log .
You must have a copy of the scp binary locally to use the scp feature
ローカル環境にscpがなかったためエラーになったが、できるはず^^;
docker-machine ip マシン名
Docker Machineで作成したマシンのIPアドレスを確認するコマンド
> docker-machine ip machine
192.168.0.XX
docker-machine inspect マシン名
Docker Machineで作成したマシンのCPUやメモリなど構成の詳細を確認するコマンド
構成情報がJSON形式で返却される
> docker-machine inspect machine
{
"ConfigVersion": 3,
"Driver": {
"IPAddress": "192.168.0.XX",
"MachineName": "machine",
"SSHUser": "docker",
"SSHPort": 22,
~~~省略~~~
"VSwitch": "virtualSW",
"DiskSize": 20000,
"MemSize": 1024,
"CPU": 1,
"MacAddr": "",
"VLanID": 0
},
~~~省略~~~
docker-machine env マシン名
通常、Dockerコマンド実行にはDockerマシンにSSHで接続後、Dockerマシン上でコマンド実行する必要がある。このコマンドは、SSH接続不要でホストマシン上で特定のDockerマシンに直接コマンド実行するために環境変数を設定するコマンド
docker-machine env と & C: から始まるコマンド2つを実行する必要がある
> docker-machine env machine
$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://192.168.0.XX:2376"
$Env:DOCKER_CERT_PATH = "C:\Users\user\.docker\machine\machines\machine"
$Env:DOCKER_MACHINE_NAME = "machine"
$Env:COMPOSE_CONVERT_WINDOWS_PATHS = "true"
# Run this command to configure your shell:
# & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env machine | Invoke-Expression
> & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env machine | Invoke-Expression
Dockerマシン上じゃなくても直接コマンド実行できるようになる
> docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
50aff78429b1: Pull complete
f6d82e297bce: Pull complete
275abb2c8a6f: Pull complete
9f15a39356d6: Pull complete
fc0342a94c89: Pull complete
Digest: sha256:ec0e4e8bf2c1178e025099eed57c566959bb408c6b478c284c1683bc4298b683
Status: Downloaded newer image for ubuntu:latest
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 00fd29ccc6f1 2 weeks ago 111MB
戻すときは-uを指定する
PS C:\WINDOWS\system32> docker-machine env -u
Remove-Item Env:\\DOCKER_TLS_VERIFY
Remove-Item Env:\\DOCKER_HOST
Remove-Item Env:\\DOCKER_CERT_PATH
Remove-Item Env:\\DOCKER_MACHINE_NAME
# Run this command to configure your shell:
# & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env -u | Invoke-Expression
> & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env -u | Invoke-Expression
docker-machine start マシン名
マシンの起動コマンド
最初はdocker-machine createでマシンがそのまま起動するが、stop/killで停止した場合に使用する
> docker-machine start machine
Starting "machine"...
(machine) Waiting for host to start...
Machine "machine" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
docker-machine stop マシン名
マシンの停止コマンド
> docker-machine stop machine
Stopping "machine"...
(machine) Waiting for host to stop...
Machine "machine" was stopped.
docker-machine kill マシン名
マシンの停止コマンド
stopで停止できない場合に使用する
> docker-machine kill machine
Killing "machine"...
(machine) Waiting for host to stop...
Machine "machine" was killed.
docker-machine rm マシン名
マシンの削除コマンド
削除確認があるので y を入力
> docker-machine rm machine
About to remove machine
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
(machine) Waiting for host to stop...
Successfully removed machine
まとめ
クラウドを含めいろいろな環境を使うマルチホスト環境がコマンドだけで簡単にできるのは大きい
また、今回の作業を通して少しずつDockerの動きが理解できてきた
今後やってみる予定のKubernetes等の理解に役立つはず