最近在研究虚拟化,容器和大数据,所以从 Docker 入手,下面介绍一下在 Windows 下怎么玩转 Docker。
Docker 本身在 Windows 下有两个软件,一个就是 Docker,另一个是 Docker Toolbox。这里我选择的是 Docker Toolbox,为什么呢?参见官方文档:https://blog.docker.com/2015/08/docker-toolbox/
首先我们从官网下载最新版的 Windows Docker Toolbox。安装后会安装一个 VirtualBox 虚拟机,一个 Kitematic,这是 GUI 管理 Docker 的工具,没有发布正式版,不推荐使用,另外还有就是我们在命令行下用到的 docker-machine
和 docker
命令了。
基本使用
安装完成 Toolbox 后会有一个 Docker Quickstart Terminal 的快捷方式,双击运行如果报错,那可能是因为你已经安装了 Hyper-v,所以 VirtualBox 无法用 64 位的虚拟机。需要卸载 Hyper-v。
运行后会在 Virtualbox 中创建一个叫做 default 的虚拟机,然后很有可能会卡在 waiting for an IP 的命令下,然后就死活不动了。我的做法是彻底放弃 Docker Quickstart Terminal,根本不用这玩意儿,关掉,我们用 PowerShell 进行虚拟机的管理。
打开PowerShell,输入:docker-machine ls
我们可以看到我们当前的Docker虚拟机的状态。如果什么都没有的话,那么我们可以使用以下命令创建一个Docker虚拟机。docker-machine create --driver=virtualbox default
。
创建完毕后,我们在用 docker-machine ls
确认我们的 Docker 虚拟机在运行中。
然后使用以下命令获得虚拟机的环境变量:docker-machine env default
,然后再输入:docker-machine env default | Invoke-Expression
。
这样我们就把当前的 PowerShell 和虚拟机里面的 Docker Linux 建立的连接,接下来就可以在 PowerShell 中使用 docker 命令了。
比如我们要查看当前有哪些镜像:docker images
当前有哪些容器:docker ps –a
其他各种 docker 命令我就不在这里累述了。
Docker虚拟机文件地址修改
默认情况下,docker-machine 创建的虚拟机文件,是保存在 C 盘的 C:\Users\用户名\.docker\machine\machines\default
目录下的,如果下载和使用的镜像过多,那么必然导致该文件夹膨胀过大,如果C盘比较吃紧,那么我们就得考虑把该虚拟机移到另一个盘上。具体操作如下:
- 使用
docker-machine stop default
停掉 Docker 的虚拟机。 - 打开 VirtualBox,选择“管理”菜单下的“虚拟介质管理”,我们可以看到 Docker 虚拟机用的虚拟硬盘的文件 disk。
- 选中
disk
,然后点击菜单中的“复制”命令,根据向导,把当前的 disk 复制到另一个盘上面去。 - 回到 VirtualBox 主界面,右键“default”这个虚拟机,选择“设置”命令,在弹出的窗口中选择“存储”选项。
- 把 disk 从“控制器SATA”中删除,然后重新添加我们刚才复制到另外一个磁盘上的那个文件。
这是我设置好后的界面,可以看到我在步骤3复制的时候,复制到 E:\VirtualBox\default\dockerdisk.vdi
文件去了。
- 确定,回到 PowerShell,我们使用 docker-machine start default 就可以启动新地址的 Docker 虚拟机了。确保新磁盘的虚拟机没有问题。就可以把 C 盘那个 disk 文件删除了。
注意:不要在 Window 中直接去复制粘贴 disk 文件,这样会在步骤5的时候报错的,报错的内容如下,所以一定要在 VirtualBox 中去复制!
Failed to open the hard disk file D:\Docker\boot2docker-vm\boot2docker-vm.vmdk. Cannot register the hard disk 'D:\Docker\boot2docker-vm\boot2docker-vm.vmdk' {9a4ed2ae-40f7-4445-8615-a59dccb2905c} because a hard disk C:\Users\用户名\.docker\machine\machines\default\disk.vmdk' with UUID {9a4ed2ae-40f7-4445-8615-a59dccb2905c} already exists. Result Code: E_INVALIDARG (0x80070057) Component: VirtualBox Interface: IVirtualBox {fafa4e17-1ee2-4905-a10e-fe7c18bf5554} Callee RC: VBOX_E_OBJECT_NOT_FOUND (0x80BB0001)
镜像加速
在国内使用 Docker Hub 的话就特别慢,为此,我们可以给 Docker 配置国内的加速地址。我看了一下,DaoCloud 和阿里云的镜像加速还不错,另外还有网易的蜂巢。选一个就行了。以 DaoClound 为例,注册账号,然后在https://www.daocloud.io/mirror 就可以看到 DaoClound 提供给您的镜像加速的 URL。然后到 PowerShell 中去依次执行:
docker-machine ssh default
sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=加速地址 |g" /var/lib/boot2docker/profile
exit
docker-machine restart default
这样重启Docker后就可以用国内的镜像来加速下载了。
试一下下载一个 mysql 看看快不快:docker pull mysql
下载完镜像,我们运行一个容器:docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123 mysql:latest
接下来我们打开 windows 下的 mysql 客户端,服务器地址填 docker 虚拟机的IP地址,通过 docker-machine env
可以看到,我这里是 192.168.99.100
,然后用户名root
,密码123
,这样我们就可以连接到 docker 容器里面的 mysql 了。
注意,Docker 容器是在 VirtualBox 的虚拟机里面,不是在 Windows 里面,所以不能用127.0.0.1 访问