1. 程式人生 > >在 Mac OS X 系統裡使用 Docker

在 Mac OS X 系統裡使用 Docker

目前的 Docker實現是建立在 Linux CGroup 等技術之上,因此無法在 MacOS X上原生使用(不過都折騰libcontainer了,不久應該會很快會有原生版本了吧)。需要建立一個 Linux虛擬機器,然後在虛擬機器內的 Linux上安裝使用。為了簡化整個安裝使用,boot2docker.io提供了一個完全自包含的安裝包,它會:

  1. 檢測 Virtual Box虛擬機器軟體,如果沒有則安裝之,有則啟動執行之。
  2. 建立名為  boot2dock-vm headless vm,這個 vm 非常精簡,只提供了執行 docker所需要的基本環境,比自己從頭安裝一個 Linux省很多。
  3. Mac OS X Host上安裝 boot2docker  docker命令。
  4. Mac OS X Host上安裝 boot2docker app。這個 app 其實就打包了一個 Apple Script指令碼,
  5. 它會開啟一個系統 Terminal並啟動虛擬機器並做一些環境設定。在初次執行時會把 /usr/local/share/boot2docker/boot2docker.iso複製到 ~/.boot2docker/裡,然後呼叫boot2docker init完成初始化。

因此,在習慣使用的Terminal軟體如 iTerm2裡,自己呼叫boot2docker up也是一樣的。boot2docker啟動之後,就可以在 Mac OS X的環境裡使用 docker命令工作了,用法跟標準的 lxc-docker一樣,它知道通過ssh將工作轉發給虛擬機器裡的 docker實現。如果想要直接在虛擬機器內工作,用 boot2docker ssh就要以獲得一個執行在虛擬機器內的shell了。

在 Mac OS X下,除了 boot2docker.io外,還有一個 skitematic 也可以提供 docker環境。Skitematic實際上是在 boot2docker的基礎上又做了一層包裝並提供 GUI方式管理docker以及訪問 docker hub。Skitematic挺好用的,但是它其實是個web app,並且內部依賴http://fb.me/react-devtools,所以第一次使用需要翻牆否則介面不正常。更重要的時,它帶的 boot2docker 注意了會用 dev做為 Virtual Box虛擬機器的名稱,但是放在 Mac OS X裡的其它檔案跟獨立安裝的 boot2docker是有衝突的。

在配置好 boot2docker之後又使用Skitematic的結果是先後出現了以下2個問題:

  1. docker命令版本(1.1.8)變得比獨立安裝的 boot2docker-vm裡的(1.17)要高,訪問boot2docker-vm會報以下錯誤:
    1. FATA[0000] Error response from daemon: client and server don't have same version (client : 1.18, server: 1.17)
    1. 由於 Skitematic GUI沒有關閉VM的介面,需要File | Open Docker Command Line Console 然後 boot2docker down或得用 VirtualBox app VM管理功能關閉之,然後用 boot2docker.io的安裝包安裝取得老的 docker命令。
    2. 如果需要讓兩者都能用,可以把 1.17版本的 /usr/local/bin/docker備分到 /usr/local/bin/docker117,以後記得有 docker117為訪問 boot2dcker-vm。或者只用 boot2docker ssh取得虛擬機器上的shell工作。
  1. 來回折騰之後,boot2docker console會錯誤的嘗試用 domain socket而不是 ssh連線 boot2dock-vm,從而報下面的錯誤:
    1. FATA[0000] Gethttp:///var/run/docker.sock/v1.17/images/json: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
    2. 如果用 boot2docker app開啟 console的話,會看到:
       

bash-3.2$/usr/local/bin/boot2docker up 

Waitingfor VM and Docker daemon to start...

...........ooo

Started.

Writing/Users/pinxue/.boot2docker/certs/boot2docker-vm/ca.pem

Writing/Users/pinxue/.boot2docker/certs/boot2docker-vm/cert.pem

Writing/Users/pinxue/.boot2docker/certs/boot2docker-vm/key.pem

Toconnect the Docker client to the Docker daemon, please set:

   export DOCKER_TLS_VERIFY=1

   export DOCKER_HOST=tcp://192.168.59.103:2376

   export DOCKER_CERT_PATH=/Users/pinxue/.boot2docker/certs/boot2docker-vm

bash-3.2$$(/usr/local/bin/boot2docker shellinit)

Writing/Users/pinxue/.boot2docker/certs/boot2docker-vm/ca.pem

Writing/Users/pinxue/.boot2docker/certs/boot2docker-vm/cert.pem

Writing/Users/pinxue/.boot2docker/certs/boot2docker-vm/key.pem

bash-3.2$docker version

Clientversion: 1.5.0

ClientAPI version: 1.17

Goversion (client): go1.4.1

Gitcommit (client): a8a31ef

OS/Arch(client): darwin/amd64

Serverversion: 1.5.0

ServerAPI version: 1.17

Goversion (server): go1.4.1

Gitcommit (server): a8a31ef

bash-3.2$ 

  1. 把提示的三個 DOCKER_環境變數設定一下就好了。

使用 boot2docker時,所有的 container都在boot2docker up命令啟動的 Virtual Box VM裡,container使用的埠通過 docker -P或者 -p對映到了 VM裡的 LinuxHost上,但是在 Mac OS X裡是沒有的。從本機倒是可能用VM的ip訪問到 container,從移動裝置或其它機器上需要訪問 container時,就需要在 Mac OS X上再做一次埠對映(portmapping)。有兩個方法,在https://github.com/boot2docker/boot2docker/blob/master/doc/WORKAROUNDS.md裡有介紹:

  1. Mac OS X VM Linux之間臨時建立 ssh tunnel
    1. boot2docker ssh -vnNTL 8000:localhost:8000
  2. Virtual Box NAT埠對映能力建立永久性的對映
    1. 虛擬機器已關閉時:VBoxManage modifyvm"boot2docker-vm" --natpf1"tcp-port8000,tcp,,8000,,8000";
    2. 虛擬機器在執行時:VBoxManage controlvm"boot2docker-vm" natpf1"tcp-port8000,tcp,,8000,,8000";

** 練練手還是不錯的,不過真的挺容易把自己繞暈,開個海外的便宜 VPS 操練會更好,pull 時速度也會好很多。