[Docker] 在 Mac 上使用原生的 Docker for Mac 操作 container
Docker 的演進算蠻快速的,從一開始在 Mac 上可以用 boot2docker,
後來用 Docker Machine 取代了 boot2docker,
而最近 Docker 推出了 Docker for Mac/Windows 的 Beta 版,
最大的好處就是不再需要 VirtualBox 來建立一個 VM,才能使用 container 了~
1. 移除已安裝的 Docker Machine
根據 Docker for Mac vs. Docker Toolbox 的說明,
其實 Docker for Mac 和 Docker Machine 是可以並存的,
不過既然有原生版本的 Docker,實在不想再留著 Docker Machine 做出來的 VM…
先用 docker-machine ls 看一下 Docker Machine 建立出來的 VM:
testuser@localhost ~ $ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
default virtualbox Stopped
dev virtualbox Stopped
接著用 docker-machine rm 將所有的 VM 都砍掉:
testuser@localhost ~ $ docker-machine rm dev Successfully removed dev testuser@localhost ~ $ docker-machine rm default Successfully removed default
都砍完了之後,就可以將 Docker Machine 移掉了,
這邊要看你原本 Docker Machine 是如何安裝的,用相對應的移除方式,
像我當初是用 Homebrew Cask 安裝 dockertoolbox,
因此同樣用 brew cask zap 來移除掉它:
brew cask zap dockertoolbox
2. 安裝 Docker for Mac
因為之前有在 Docker Hub 上註冊會員,同時也有登記成為 Docker for Mac 的 Beta tester,
因此這次的 Private Beta Test 就有收到通知,
可以到 Docker for Mac and Docker for Windows 網頁,
點選 Get Docker for Mac 連結來下載 Docker.dmg 安裝~
在 Docker.dmg 上點兩下開啟安裝程式,首先將 Docker.app 拖移到 Applications 目錄下:
接著輸入一個測試序號,測試序號會附在 Beta test 的通知信上,
不知道序號的人… 可能可以點 I don’t have a token 看看 (我沒試過),
如果不能用的話,就還是去登記成為 Docker Beta tester 吧:
接著會需要輸入 Mac 管理者的密碼來允許 Docker 做一些系統設定:
最後就安裝完成囉:
安裝好 Docker for Mac 之後,可以在 /usr/local/bin 下面,
看到新建立出來的 docker, docker-compose, docker-machine 這幾個 symbolic link,
都指向剛剛裝好的 Docker for Mac:
lrwxr-xr-x 1 testuser staff 68 May 20 19:32 docker@ -> /Users/testuser/Library/Group Containers/group.com.docker/bin/docker lrwxr-xr-x 1 testuser staff 76 May 20 19:32 docker-compose@ -> /Users/testuser/Library/Group Containers/group.com.docker/bin/docker-compose lrwxr-xr-x 1 testuser staff 76 May 20 19:32 docker-machine@ -> /Users/testuser/Library/Group Containers/group.com.docker/bin/docker-machine
3. 在 Terminal 中執行 Docker 指令
立刻執行一個 Docker 指令試試吧~
用 ubuntu 這個映像檔做出一個 container,並在裡面執行 echo “Hello World”,
很順利的成功了,而且 Docker for Mac 不像 Docker Machine 要先設定好環境變數,
可以直接執行 docker 指令,這點方便許多:
testuser@localhost ~ $ docker run -it ubuntu echo "Hello World" Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 6d28225f8d96: Pull complete 166102ec41af: Pull complete d09bfba2bd6a: Pull complete c80dad39a6c0: Pull complete a3ed95caeb02: Pull complete Digest: sha256:5718d664299eb1db14d87db7bfa6945b28879a67b74f36da3e34f5914866b71c Status: Downloaded newer image for ubuntu:latest Hello World
4. 查看 Docker for Mac 產生出來的 syslog
Docker for Mac 安裝好之後,會在上方常駐列上,
出現一個 Docker for Mac 的圖示,點下它可以看到下面的視窗:
點下 Logs 的話,會教你怎麼看 Docker 吐出來的 syslog:
下面是我節錄部分在我 Mac 上關於 Docker 的 syslog,可以看到它提供了不少資訊,
像是版本、啟動了哪些 process、建立了什麼 socket,
而且也看到它執行了 com.docker.hyperkit 這個參數列看起來很像 QEMU 的東東:
testuser@localhost ~ $ syslog -k Sender Docker May 20 16:41:43 localhost Docker[20381] <Notice>: Application version: 1.11.1-beta12 (7528) May 20 16:41:43 localhost Docker[20381] <Notice>: OSX Version: Version 10.11.5 (Build 15F34) May 20 16:42:30 localhost Docker[20381] <Notice>: privileged installation of com.docker.vmnetd successful May 20 16:42:30 localhost Docker[20445] <Notice>: com.docker.vmnetd starting May 20 16:42:32 localhost Docker[20450] <Notice>: Starting com.docker.db, com.docker.osxfs, com.docker.slirp, com.docker.osx.hyperkit.linux, com.docker.driver.amd64-linux May 20 16:42:32 localhost Docker[20450] <Notice>: Start com.docker.db (pid 20463) May 20 16:42:32 localhost Docker[20450] <Notice>: Start com.docker.osxfs (pid 20464) May 20 16:42:32 localhost Docker[20450] <Notice>: Start com.docker.slirp (pid 20466) May 20 16:42:32 localhost Docker[20450] <Notice>: Start com.docker.osx.hyperkit.linux (pid 20467) May 20 16:42:32 localhost Docker[20450] <Notice>: Start com.docker.driver.amd64-linux (pid 20468) May 20 16:42:32 localhost Docker[20467] <Notice>: API server starting May 20 16:42:32 localhost Docker[20467] <Notice>: socket path is: /Users/testuser/Library/Containers/com.docker.docker/Data/s20 May 20 16:42:35 localhost Docker[20468] <Notice>: hypervisor: native May 20 16:42:35 localhost Docker[20468] <Notice>: filesystem: osxfs May 20 16:42:35 localhost Docker[20464] <Notice>: Using protocol TwoThousand msize 16384 May 20 16:42:35 localhost Docker[20468] <Notice>: Hypervisor: native; BootProtocol: direct; UefiBootDisk: /Users/testuser/UefiBoot.qcow2 May 20 16:42:35 localhost Docker[20468] <Notice>: Launching: /Applications/Docker.app/Contents/MacOS/com.docker.hyperkit -A -m 2G -c 2 -u -s 0:0,hostbridge -s 31,lpc -s 2:0,virtio-ipc,uuid=ff9d03c6-7ab5-45aa-8f47-528fd862ada0,path=/Users/testuser/Library/Containers/com.docker.docker/Data/s50,macfile=/Users/testuser/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/mac.0 -s 3,virtio-blk,file:///Users/testuser/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2,format=qcow -s 4,virtio-9p,path=/Users/testuser/Library/Containers/com.docker.docker/Data/s40,tag=db -s 5,virtio-rnd -s 6,virtio-9p,path=/Users/testuser/Library/Containers/com.docker.docker/Data/s51,tag=port -s 7,virtio-sock,guest_cid=3,path=/Users/testuser/Library/Containers/com.docker.docker/Data,guest_forwards=2376;1525 -l com1,autopty=/Users/testuser/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty,log=/Users/testuser/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/console-ring -f kexec,/Applications/Docker.app/Contents/Resources/moby/vmlinuz64,/Applications/Docker.app/Contents/Resources/moby/initrd.img,earlyprintk=serial console=ttyS0 com.docker.driverDir="/Users/testuser/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux", com.docker.database="com.docker.driver.amd64-linux" -F /Users/testuser/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/hypervisor.pid May 20 16:42:35 localhost Docker[20473] <Notice>: Starting xhyve May 20 19:33:37 localhost Docker[908] <Notice>: osxfs tracing: OFF May 20 19:33:57 localhost Docker[913] <Notice>: Docker is responding May 20 19:33:57 localhost Docker[912] <Notice>: VM has started at 2016-05-20 19:33:57 +0800 CST May 20 19:33:57 localhost Docker[802] <Notice>: dockerState = running
Log 上也提到了 xhyve 這個字眼,依照文件上的說明,
Docker for Mac 現在不需要在 VirtualBox 的 VM 裡跑 container 了,
但是是改用 xhyve 這個在 OS X 上的一個較輕量的 VM 軟體,
所以應該還是算是在 VM 裡跑 container 吧~
5. 設定 Docker for Mac
點下 Docker for Mac 圖示 > Settings,可以調整 Docker 是否要自動執行與更新:
進階設定這邊可以調整配置給 container 用的 CPU 和記憶體數量:
不過有點好奇的是,用 xhyve 建立出來的 VM 硬碟空間是不是有限制呢?
這個問題在 FAQ 裡並沒有提到 (對 xhyve 著墨不多),
會考慮這個問題是在想說,如果建立了一堆 container,勢必會占據掉 VM 的空間,
如果因為 VM 的硬碟空間限制,導致不能建立更多的 container 的話,就有點尷尬了…
不過這問題等遇到了再來查查看也不遲 😛
6. 使用 Kitematic 管理 Docker container
點下 Docker for Mac 圖示 > Dashboard,會出現安裝 Kitematic 的詢問視窗:
如果按下 Download Kitematic 按鈕的話,會下載一個 Kitematic-Mac.zip,
要自行解壓縮到 /Applications 目錄下去~
sudo unzip ~/Downloads/Kitematic-Mac.zip -d /Applications
執行剛安裝好的 Kitematic,可以發現它是一個 GUI 版的 Docker container 管理程式,
在左邊的 Container 列表中列出了目前我有的 container,
如果按一下 +NEW 按鈕,就可以在右邊的 Docker Hub 列表中搜尋想要的映像檔:
點一下左邊的某一個 container,就可以做一些操作,
基本上就是用 docker 指令可以做到的動作的 GUI 版本,
像是查看 log、啟動或停止 container、以及做一些設定等等:
目前使用 Docker for Mac 感覺相當不錯,減少了需要執行 VirtualBox VM 這個動作,
覺得變得輕量方便許多,這樣在 Mac 上應用 Docker 技術也變得更可行囉~^^