原文:https://docs.docker.com/engine/getstarted-voting-app/node-setup/
部署voting app的第一步,是为集群节点(swarm nodes)创建 Docker machines。我们可以在不同的实体PC、虚拟机或者云服务器上创建这些 Docker化 的主机。
在本例中,我们使用Docker Machine来创建两个虚拟机(virtual machines)在同一个系统上(See Docker Machine Overview to learn more.)。
创建 manager 和 worker 虚拟机
使用 docker machine 创建一个本地的 virtual machine
docker-machine create --driver hyperv <HOSTNAME>
这里使用的是 windows 里的 hyperv 创建的虚拟机
创建过程中出现一个
Error creating machine: Error in driver during machine creation: exit status 1
解决方案:
- 按照链接https://docs.docker.com/machine/drivers/hyper-v/的说明,配置系统。
- 首先在Hyperv管理工具里面,创建一个新的虚拟交换机,并使用外部链接(如果不指定,默认链接到系统的DockerNAT上,它是在docker安装时候创建的,用于 docker for windows 的,不是给我们使用的)
- 然后将创建的新虚拟机,主动链接到该交换机上
- 重启
- 注意: 360安全卫士可能导致失败,出现IP无法获得的情况
下面是一个创建的例子:
PS
C:\WINDOWS\system32> docker
-machine
create
-d
hyperv -
-hyperv
-virtual
-switch
"Primary Virtual Switch"
-
-hyperv
-disk
-size
"5000"
-
-hyperv
-memory
"512"
manager
Running pre
-create
checks...
Creating machine...
(manager1) Copying C:\Users\Vicky\.docker\machine\cache\boot2docker.iso to C:\Users\Vicky\.docker\machine\machines\manag
er1\boot2docker.iso...
(manager1) Creating SSH key...
(manager1) Creating VM...
(manager1) Using switch
"Primary Virtual Switch"
(manager1) Creating VHD
(manager1) Starting VM...
(manager1) 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\Doc
ker\Docker\Resources\bin\docker
-machine
.exe env manager1
PS
C:\WINDOWS\system32>
验证虚拟机的IP地址
使用命令 docker-machine ls
来验证。
PS
C:\Users\Administrator> docker
-machine
ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
manager - hyperv Running tcp://192.168.0.9:2376 v1.13.1
worker - hyperv Running tcp://192.168.0.10:2376 v1.13.1
这样就有了 两个 docker化 的虚拟机,每一个都独自运行一个 Docker Engine。可以通过 Docker CLI 通信,并且可以配置为集群节点(Swarm nodes)。
与虚拟机交互
下面讲述两种与创建的虚拟机交互的方式:
通过pre-configured shell来管理虚拟机
我们可以使用 docker-machine 命令,在shell中设置虚拟机的环境变量。这样,我们在本地shell上的 Docker 命令,就会在对应的虚拟机上运行。
1. 运行 docker-machine env manager 命令,获得环境变量
PS
C:\Users\Administrator> docker
-machine
env manager
$Env
:DOCKER_TLS_VERIFY =
"1"
$Env
:DOCKER_HOST =
"tcp://192.168.0.9:2376"
$Env
:DOCKER_CERT_PATH =
"C:\Users\Administrator\.docker\machine\machines\manager"
$Env
:DOCKER_MACHINE_NAME =
"manager"
$Env
:COMPOSE_CONVERT_WINDOWS_PATHS =
"true"
# Run this command to configure your shell:
# & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env manager | Invoke-Expression
2. 使用最后一行的命令
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env manager | Invoke-Expression
将shell连接到 manager 虚拟机。
3。 再次运行 docker-machine ls 命令:
PS
C:\Users\Administrator> docker
-machine
ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
manager * hyperv Running tcp://192.168.0.9:2376 v1.13.1
worker - hyperv Running tcp://192.168.0.10:2376 v1.13.1
可以发现,manager后面出现一个星号,表示的当前,shell已经连接到了 manager 虚拟机。这样,在shell中运行的命令,将会在 manager 虚拟机上执行。(可以用同样的方法,连接到 worker 虚拟机,一个shell可以同时连接多个虚拟机进行操作)
使用 ssh 登录虚拟机
可以使用命令 docker-machine ssh <MACHINE-NAME> 来登录到某台虚拟机上.
PS
C:\Users\Administrator> docker
-machine
ssh manager
## .
## ## ## ==
## ## ## ## ## ===
/
""
""
""
""
""
""
""
""
"\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
|
‘_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ ‘
__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.13.1, build HEAD : b7f6033 - Wed Feb 8 20:31:48 UTC 2017
Docker version 1.13.1, build 092cba3
[email protected]:~$
What’s next?
我们将会用这两个 Docker machines创建一个集群(swarm)。