我们在测试多服务器容器时,需要多个主机相互配合,每个主机上需要独立安装 Docker 以及独立启动容器。
docker-machine 工具可以让我们在一台主机上启动多个虚拟机,每个虚拟机就类似于一台独立的主机。
docker-machine 对这个虚拟过程做了优化,使其部署、管理 Docker 速度更快、体验更好。
docker-machine 不仅可以管理本地主机上的虚拟机,也可以管理云服务器上的虚拟机。
Docker Engine 负责本地主机守护进程与容器之间的通信。
Docker CLI 为用户提供了向 Docker Engine 下达指令的方式。
Docker Engine 和 CLI 的这种配合就是我们通常使用的单机 Docker。
Docker Machine 可以在本地主机上启动多个虚拟主机,每个虚拟主机都可以部署一个属于自己的单机 Docker 。
如果说 Docker CLI 是管理容器的工具,那么 docker-machine 就是管理部署了 Docker 的虚拟机的工具。
Docker Machine 可以启动、检查、停止和重启这些虚拟主机,可以升级虚拟机的 Docker,还可以让宿主机的 Docker 客户端与虚拟机的 Docker 守护程序通信。
安装:
$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
chmod +x /usr/local/bin/docker-machine
测试:
$ docker-machine version
虚拟机只是 Docker Machine 实现多个 Docker 服务的一种方式,使用虚拟机方式时需要在宿主机上额外安装 virtualbox 软件包。
此外,Docker Machine 也可以配置使用云服务器厂商提供的接口在云服务器上启动多个 Docker 进程实例。
创建测试虚拟机(使用 --driver 指定虚拟机驱动类型,此处使用宿主机上的 VirtualBox 工具):
$ docker-machine create --driver virtualbox test
Running pre-create checks...
Error with pre-create check: "VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path"
提示宿主机未安装 VirtualBox 软件包。下面在 Deepin 系统中安装 VirtualBox:
# 添加 VirtualBox 源
$ echo "deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian buster contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
# 添加 Oracle 公钥
$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
$ sudo apt update
$ sudo apt install virtualbox
# sudo apt install virtualbox-6.1
再次创建测试虚拟机:
$ docker-machine stop test
$ docker-machine rm -y test
$ docker-machine create --driver virtualbox test
Running pre-create checks...
(test) Image cache directory does not exist, creating it at /home/barwe/.docker/machine/cache...
(test) No default Boot2Docker ISO found locally, downloading the latest release...
(test) Latest release for github.com/boot2docker/boot2docker is v19.03.12
(test) Downloading /home/barwe/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v19.03.12/boot2docker.iso...
(test) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(test) Copying /home/barwe/.docker/machine/cache/boot2docker.iso to /home/barwe/.docker/machine/machines/test/boot2docker.iso...
(test) Creating VirtualBox VM...
(test) Creating SSH key...
(test) Starting the VM...
(test) Check network to re-create if needed...
(test) Found a new host-only adapter: "vboxnet0"
Error creating machine: Error in driver during machine creation: Error setting up host only network on machine start: /bin/VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.99.1 --netmask 255.255.255.0 failed:
VBoxManage: error: Code E_ACCESSDENIED (0x80070005) - Access denied (extended info not available)
VBoxManage: error: Context: "EnableStaticIPConfig(Bstr(pszIp).raw(), Bstr(pszNetmask).raw())" at line 252 of file VBoxManageHostonly.cpp
到这里,VirtualBox 创建了网络 vboxnet0,但是在配置该网络时报错。
上述命名尝试为网络 vboxnet0 分配 IP 192.168.99.1/24 但是失败了。
按官方文档的说法,Linux 中默认只有 192.168.56.0/21 范围内的 IP 才能分配给虚拟网络适配器。
所我们 docker-machine 创建虚拟机时手动指定虚拟机网卡的 IP 地址:
# docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.56.100/21" test
$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.56.101/21" dev
Running pre-create checks...
Creating machine...
(dev) Copying /home/barwe/.docker/machine/cache/boot2docker.iso to /home/barwe/.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) Found a new host-only adapter: "vboxnet0"
(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
见上述信息即虚拟机启动成功。
虚拟机重启时会在该子网内重新分配 IP 地址。
最后删除测试虚拟机和网卡(如果有必要的话):
$ docker-machine stop <VM_NAME>
$ docker-machine rm -y <VM_NAME>
$ vboxmanage hostonlyif remove <NETWORK_ADAPTER_NAME>
需要用到的命令:
Docker Machine
- 虚拟机列表:
docker-machine ls
- 停止虚拟机:
docker-machine stop test
- 删除虚拟机:
docker-machine rm -y test
- 进入虚拟机:
docker-machine ssh test
VirtualBox
- 列出所有网络适配器:
vboxmanage list hostonlyifs
- 删除指定网络适配器:
vboxmanage hostonlyif remove vboxnet0
手动创建虚拟网卡
创建 VirtualBox 的 Host-Only 网络适配器
$ vboxmanage hostonlyif create 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% Interface 'vboxnet0' was successfully created
配置网络适配器属性(子网 192.168.56.0/21)
$ vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.101 --netmask 255.255.248.0
docker-machine 在使用 virtualbox 作为驱动时,就相当于在 virtualbox 外面又包了一层。
使用 Docker Machine 启动多个虚拟机:
docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.56.1/21" --virtualbox-hostonly-nicpromisc "allow-all" m0
docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.56.1/21" --virtualbox-hostonly-nicpromisc "allow-all" c0
docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.56.1/21" --virtualbox-hostonly-nicpromisc "allow-all" c1
docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.56.1/21" --virtualbox-hostonly-nicpromisc "allow-all" c2
--virtualbox-hostonly-cidr
相当于子网 192.168.56.0/21 的虚拟路由器的 IP 地址,一个 Swarm 集群中的主机应该处于同一个路由器(局域网)下。
启动结果如下:
虚拟机 | 角色 | IP | hostname |
---|---|---|---|
m0 | Master | 192.168.56.102 | m0 |
c0 | Worker | 192.168.56.103 | c0 |
c1 | Worker | 192.168.56.104 | c1 |
c2 | Worker | - | c2 |
评论区