最近在研究虛擬化,容器和大數據,所以從Docker入手,下面介紹一下在Windows下怎么玩轉Docker。
Docker本身在Windows下有兩個(gè)軟件,一個(gè)就是Docker,另一個(gè)是Docker Toolbox。這里我選擇的是Docker Toolbox,為什么呢?參見(jiàn)官方文檔:
https://blog.docker.com/2015/08/docker-toolbox/
首先我們從官網(wǎng)下載最新版的Windows Docker Toolbox。安裝后會(huì )安裝一個(gè)VirtualBox虛擬機,一個(gè)Kitematic,這是GUI管理Docker的工具,沒(méi)有發(fā)布正式版,不推薦使用,另外還有就是我們在命令行下用到的docker-machine和docker命令了。
安裝完成Toolbox后會(huì )有一個(gè)Docker Quickstart Terminal的快捷方式,雙擊運行如果報錯,那可能是因為你已經(jīng)安裝了Hyper-v,所以VirtualBox無(wú)法用64位的虛擬機。需要卸載Hyper-v。
運行后會(huì )在Virtualbox中創(chuàng )建一個(gè)叫做default的虛擬機,然后很有可能會(huì )卡在waiting for an IP的命令下,然后就死活不動(dòng)了。我的做法是徹底放棄Docker Quickstart Terminal,根本不用這玩意兒,關(guān)掉,我們用PowerShell進(jìn)行虛擬機的管理。
打開(kāi)PowerShell,輸入:
docker-machine ls
我們可以看到我們當前的Docker虛擬機的狀態(tài)。如果什么都沒(méi)有的話(huà),那么我們可以使用以下命令創(chuàng )建一個(gè)Docker虛擬機。
docker-machine create --driver=virtualbox default
創(chuàng )建完畢后,我們在用docker-machine ls確認我們的Docker虛擬機在運行中。
然后使用以下命令獲得虛擬機的環(huán)境變量:
docker-machine env default
然后再輸入:
docker-machine env default | Invoke-Expression
這樣我們就把當前的PowerShell和虛擬機里面的Docker Linux建立的連接,接下來(lái)就可以在PowerShell中使用docker命令了。
比如我們要查看當前有哪些鏡像:
docker images
當前有哪些容器:
docker ps –a
其他各種docker命令我就不在這里累述了。
默認情況下,docker-machine創(chuàng )建的虛擬機文件,是保存在C盤(pán)的C:\Users\用戶(hù)名\.docker\machine\machines\default 目錄下的,如果下載和使用的鏡像過(guò)多,那么必然導致該文件夾膨脹過(guò)大,如果C盤(pán)比較吃緊,那么我們就得考慮把該虛擬機移到另一個(gè)盤(pán)上。具體操作如下:
1.使用docker-machine stop default停掉Docker的虛擬機。
2.打開(kāi)VirtualBox,選擇“管理”菜單下的“虛擬介質(zhì)管理”,我們可以看到Docker虛擬機用的虛擬硬盤(pán)的文件disk。
3.選中“disk”,然后點(diǎn)擊菜單中的“復制”命令,根據向導,把當前的disk復制到另一個(gè)盤(pán)上面去。
4.回到VirtualBox主界面,右鍵“default”這個(gè)虛擬機,選擇“設置”命令,在彈出的窗口中選擇“存儲”選項。
5.把disk從“控制器SATA”中刪除,然后重新添加我們剛才復制到另外一個(gè)磁盤(pán)上的那個(gè)文件。
這是我設置好后的界面,可以看到我在步驟3復制的時(shí)候,復制到E:\VirtualBox\default\dockerdisk.vdi文件去了。
6.確定,回到PowerShell,我們使用docker-machine start default就可以啟動(dòng)新地址的Docker虛擬機了。確保新磁盤(pán)的虛擬機沒(méi)有問(wèn)題。就可以把C盤(pán)那個(gè)disk文件刪除了。
【注意:不要在Window中直接去復制粘貼disk文件,這樣會(huì )在步驟5的時(shí)候報錯的,報錯的內容如下,所以一定要在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\用戶(hù)名\.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的話(huà)就特別慢,為此,我們可以給Docker配置國內的加速地址。我看了一下,DaoCloud和阿里云的鏡像加速還不錯,另外還有網(wǎng)易的蜂巢。選一個(gè)就行了。以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后就可以用國內的鏡像來(lái)加速下載了。
試一下下載一個(gè)mysql看看快不快:
docker pull mysql
下載完鏡像,我們運行一個(gè)容器:
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123 mysql:latest
接下來(lái)我們打開(kāi)windows下的mysql客戶(hù)端,服務(wù)器地址填docker虛擬機的IP地址,通過(guò)docker-machine env可以看到,我這里是192.168.99.100,然后用戶(hù)名root,密碼123,這樣我們就可以連接到docker容器里面的mysql了。
【注意,Docker容器是在VirtualBox的虛擬機里面,不是在Windows里面,所以不能用127.0.0.1訪(fǎng)問(wèn)】
聯(lián)系客服