Docker-Machine

Docker Machine是简化的Docker安装的命令行工具,通过命令行即可在相应的平台上(目前支持在本机运行virtualbox虚拟主机,Hyper-V虚拟主机,VMware虚拟主机,AWS EC2,Azure,DigitalOcean,Google等公有云主机)安装Docker。(好比在你机器上装个虚拟机,老外帮你准备好了专门的ISO,docker 都帮你弄好了)

本篇主要涉及Docker-Machine创建虚拟Docker主机、创建私有镜像仓库,利用Docker-Machine在虚拟主机中使用compose启动Nginx负载均衡、设置IP转发在windows中访问。

安装

使用如下命令,或者直接到对应github下载,授予可执行权限,保证最后拷贝到环境变量相关目录里(/usr/local/bin/)即可。

1
2
3
curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
chmod +x /tmp/docker-machine && \
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

Docker Machine安装参考文档

创建Docker主机

首先我们需要安装virtualbox 官方下载地址点我。选择对应版本的rpm下载包,通过ftp方式拷贝到服务器,进行yum install <包名> -y 安装即可。同时,oracle也告诉我们存在其他方法 参考地址,如下

1
2
3
wget   http://yum.oracle.com/public-yum-ol7.repo
然后把下载下来的文件拷贝到/etc/yum.repos.d中
yum install VirtualBox-5.2

创建Docker主机安装virtualbox参考地址
完成可以执行 docker-machine create --driver=virtualbox vbox-test 创建。
执行该命令,他首先检查 /home/xugz/.docker/machine/cache 是否存在,没有则创建文件夹;然后寻找该文件夹下是否有 boot2docker.iso文件(一个基于Tiny Core Linux的系统,里面Docker啥的都帮你搞定了),另外会默认会创建一个虚拟网卡 (vboxnet0)。所以如果太慢,我们可以去boot2docker.iso对应gitHub下载地址手工下载用ftp传到目标服务器再执行创建。

常用命令

查看列表 docker-machine ls
查看IP地址 docker-machine ip 虚拟机名称
停止和开启 docker-machine stop/start 虚拟机名称
查看环境变量 docker-machine env vbox-test
 如果我们要操作machine里面的docker环境变量 ,可以不用进入到虚拟机
 使用eval命令(可以读取一连串的参数,然后按照参数特性来执行)
 此时我们执行 eval $(docker-machine env vbox-test)
 这时我们本机的docker客户端就连接了vbox-test的docker服务端
 切换回来使用命令 eval $(docker-machine env -u)
SSH的方式连接到虚拟机 docker-machine ssh 虚拟机名称

移植主机镜像到虚拟机

创建私有镜像库

1
2
3
4
5
6
7
docker pull registry  # docker pull一个官方镜像 专门处理私有镜像的提交和拉取
docker run -d -p 5000:5000 --name registry registry # 运行镜像生成新容器
docker tag centos:httpd localhost:5000/web # 给本地centos:httpd 镜像打标签,命名为localhost:5000/web
docker push localhost:5000/web # 提交镜像
docker tag centos:nginx localhost:5000/nginx
docker push localhost:5000/nginx
docker rmi localhost:5000/web # 提交完成后, 可以删除刚才创建的标签

查看仓库目录
注意以下的命令要保证registry容器正在运行
可以利用API的方式 查看私有仓库中的目录 curl http://localhost:5000/v2/_catalog 参考文档
同步镜像
最后使用命令 docker-machine ssh vbox-test 进入
docker pull 192.168.99.1:5000/nginx 将私有镜像库中的Nginx下载到虚拟机里 主机的IP:端口

修改镜像名使用tag命令 docker tag <原镜像名称> <新的镜像名> 完成后再把原镜像删除即可。我也不知道为什么官方没有rename命令,非得整这么麻烦。等我学会Go语言,就来本地尝试下。

利用Docker-Machine在虚拟主机中使用compose启动Nginx负载均衡

这里我们也想使用compose进行容器统一管理,之前我们在宿主机中安装了compose(位置在:/usr/local/bin/docker-compose)我们可以直接拷贝就行了。

拷贝compose 到虚拟主机

利用scp命令 参考文档
我们进入宿主机执行 docker-machine scp /usr/local/bin/docker-compose vbox-test:/home/docker/.local/bin
 /home/docker/.local/bin 是虚拟机用户的一个环境变量 (也可以自己设置)
把我们之前做的compose配置文件拷贝过去 docker-machine scp -r mycompose vbox-test:/home/docker/(如果是文件夹,则要加入-r 进行递归操作)。然后修改docker-compose.yml镜像配置改为虚拟主机自己的。
我们的compose里面有个映射文件,也就是把主机的文件映射到容器。那么是否我们也需要 把网站文件给拷贝到 虚拟机里面呢?
答案是不需要,我们可以使用 mount命令来完成。

映射文件挂载到虚拟主机

mount命令参考文档
官方提醒我们,需要依赖使用sshfs将目录从虚拟机挂载到本地主机。SSHFS可以利用SFTP的方式把远程文件映射到本机 。
在宿主机的安装sshfs,安装如下依赖

1
2
yum install -y epel-release
yum install -y fuse-sshfs

首先在虚拟机里创建一个文件夹叫做 nginx docker-machine ssh vbox-test mkdir nginx
主机上也创建一个文件夹 (空的),叫做 vbox-nginx。
挂载使用命令 docker-machine mount vbox-test:/home/docker/nginx /home/xugz/mnginx 需要注意不在挂载点目录执行
取消挂载使用命令 docker-machine mount -u vbox-test:/home/docker/nginx /home/xugz/mnginx

把本地主机之前的nginx文件夹里面的文件,拷贝到mnginx里面。进入nginx文件夹使用命令cp . /home/xugz/mnginx -r
对应修改docker-compose.yml中对应文件挂载的配置。我们以后只要在宿主机修改文件就可以了。
接下来我们就可以利用 docker-compose up -d 在我们的虚拟机中启动容器了。

外部访问 IP转发

在虚拟主机中使用curl localhost:9090访问
在宿主机中使用 curl $(docker-machine ip vbox-test):9090访问
在windows里访问使用VBoxManage(我们上面虚了好几层了哦~
简单说一下virtualbox的几个命令 文档点我
VBoxManage list vms 列出当前的所有虚拟机
VBoxManage controlvm 可以用来修改正在运行的虚拟机状态
存在参数语法: natpf<1-N> [<name>],tcp|udp,[<hostip>],<hostport>,[<guestip>], <guestport>
譬如VBoxManage controlvm "vbox-test" natpf1 "mynat1,tcp,,9090,,9090" 这代表把vbox-test这个虚拟机的tcp端口(IP不限制)转发到 宿主机的9090端口。执行完成后我们就可以使用 宿主机IP:9090端口访问
VBoxManage controlvm "vbox-test" natpf1 delete mynat1 删掉规则,这样外部就不能访问了

常见问题

http: server gave HTTP response to HTTPS client

因为docker为了安全,需要https 。但是我们可以让其不需要。
如果我们在主机里,那么要修改的是/etc/docker/daemon.json。在machine里也是一样的,那么要在/etc/docker下面 手动创建daemon.json文件(默认是木有的),添加如下内容

1
2
3
{
"insecure-registries":["192.168.99.1:5000"]
}

修改完成需要重启虚拟机主机 docker-machine restart 虚拟机名称

## This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory 如果是在VMware中的Linux,需要在关机状态的虚拟机进行配置: 虚拟机>设置>处理器中勾选虚拟化 Intel VT-x/EPT 或 AMD-V/RVI(V)

本文标题:Docker-Machine

文章作者:xugz

发布时间:2019年11月28日 - 15:40

最后更新:2021年09月11日 - 16:16

原始链接:https://xlline.github.io/2019/11/28/Docker-Machine/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。