提醒:
本篇是在 Windows 10 家用版的 cmd shell 下操作
平常我們講的 "Docker" 指的是 Docker Engine,
是由下面所組成的 client-server application:
Docker Machine 是用來設定和管理 Dockerized 主機 (帶有 Docker Engine 的主機) 的工具,通常會在你的 local 主機安裝。裡面包含的指令:
docker-machine
docker
可以使用 Docker Machine 在你本地的 Mac 或 Windows、公司網路、資料中心或雲端供應商 (例如:Azure、AWS … 等) 上快速建置 Docker 主機
而那些 Dockerized 主機可被稱為 "machines"
docker-machine -v
查看目前 Docker Machine 的版本
$ docker-machine -v
docker-machine version 0.13.0, build 9ba6da9
像我沒有在本地端上安裝 Docker Daemon (因為 Host 的 OS 是 Windows 家用版,不能安裝 Docker for Windows,只能安裝 Docker Toolbox) ,所以不管執行任何 docker
指令都會出現下面錯誤:
$ docker ps
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.36/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
執行 docker version
指令
不會顯示 Server 的部分:
$ docker version
Client:
Version: 18.02.0-ce
API version: 1.36
Go version: go1.9.4
Git commit: fc4de447b5
Built: Mon Feb 12 19:03:38 2018
OS/Arch: windows/amd64
Experimental: false
Orchestrator: swarm
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.36/version: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
docker-machine create
建立新的 Docker Machine
-d
,--driver
:設定建立 Docker Machine 的 driver,Docker 官方支援多種 driver,包括 AWS、Azure、GCE … 等,詳情請參考官方的 Machine drivers | Docker Documentation 文件以 VirtualBox 為例:
$ docker-machine create -d [driver] [machine-name]
$ docker-machine create -d virtualbox dev
Running pre-create checks...
Creating machine...
(dev) Copying C:\Users\Titan\.docker\machine\cache\boot2docker.iso to C:\Users\Titan\.docker\machine\machines\dev\boot2docker.iso...
(dev) Creating VirtualBox VM...
(dev) Creating SSH key...
(dev) Starting the VM...
(dev) Check network to re-create if needed...
(dev) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(dev) Waiting for an IP...
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: docker-machine env dev
docker-machine ls
查看所有 Docker Machine 相關資訊
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v18.02.0-ce
dev - virtualbox Running tcp://192.168.99.101:2376 v18.02.0-ce
列出訊息的欄位介紹:
ACTIVE
:顯示 *
表示正在操作的 Docker Engine (使用 docker-machine env
指令最後的提示設定,將本地的 Docker Client 連接到在 VM 上執行的 Docker Engine),而顯示 -
則反之。STATE
:Docker Engine 狀態URL
:Docker Engine 所在 IPSWARM
:是否為 SWARM master or nodeDOCKER
:建立 Docker 時所安裝的 Docker 版本docker-machine env
$ docker-machine env [machine-name]
可以將該 Docker Machine 連線時所需的環境變數列出來,方便切換環境。
該指令輸出的最後有個小提示,在不同的 shell 會有不同的指令,使用那段指令可以快速地把環境變數設定在目前的環境上,也就是可以將本地的 Docker Client 連接到在 VM 上執行的 Docker Engine。
使用 cmd
的輸出結果:
$ docker-machine env default
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\Titan\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM @FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i
使用 bash
的輸出結果:
$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\Titan\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("D:\Program Files\Docker Toolbox\docker-machine.exe" env default)
執行 docker-machine env
指令輸出的最後小提示,就可以將本地的 Docker Client 連接到在 VM 上執行的 Docker Engine
$ @FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i
接著就可以看到 docker-machine ls
指令中的 ACTIVE
欄位已從 -
變成 *
,那就代表已成功連接
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v18.02.0-ce
使用 docker version
指令也可以看到 Docker server 的版本資訊:
$ docker version
Client:
Version: 18.02.0-ce
API version: 1.36
Go version: go1.9.4
Git commit: fc4de447b5
Built: Mon Feb 12 19:03:38 2018
OS/Arch: windows/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.02.0-ce
API version: 1.36 (minimum version 1.12)
Go version: go1.9.3
Git commit: fc4de44
Built: Wed Feb 7 21:20:09 2018
OS/Arch: linux/amd64
Experimental: false
docker-machine ssh
連線到指定的 Docker Machine
$ docker-machine ssh [machine-name]
docker-machine ip
查詢指定 Docker Machine 的 IP
$ docker-machine ip [machine-name]
$ docker-machine ip default
192.168.99.100
docker-machine start
執行 Docker Machine
$ docker-machine start [machine-name]
$ docker-machine start default
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...
Machine "default" 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 ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Running tcp://192.168.99.100:2376 v18.02.0-ce
docker-machine restart
重新啟動 Docker Machine
$ docker-machine restart [machine-name]
$ docker-machine restart default
Restarting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...
Waiting for SSH to be available...
Detecting the provisioner...
Restarted machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
docker-machine rm
刪除 Docker Machine
$ docker-machine rm [machine-name]
$ docker-machine rm dev
About to remove dev
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed dev