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 | curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \ |
创建Docker主机
首先我们需要安装virtualbox 官方下载地址点我。选择对应版本的rpm下载包,通过ftp方式拷贝到服务器,进行yum install <包名> -y
安装即可。同时,oracle也告诉我们存在其他方法 参考地址,如下
1 | wget http://yum.oracle.com/public-yum-ol7.repo |
创建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 | docker pull registry # docker pull一个官方镜像 专门处理私有镜像的提交和拉取 |
查看仓库目录
注意以下的命令要保证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 | yum install -y epel-release |
首先在虚拟机里创建一个文件夹叫做 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 | { |
修改完成需要重启虚拟机主机 docker-machine restart 虚拟机名称
。