[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 技術也變得更可行囉~^^