簡介
在剛剛過去的2013年裡,docker無疑是營運工作的一項革命性創新,然而在有中國特色的互連網環境裡,要折騰這玩意兒還真是不方便。
且不說docker.io的官網在牆外,包括它的apt源和image index都在牆外,導致使用者增加了很多不必要折騰成本,真是中國程式員的一大悲哀啊。真不知道docker這種純技術的東西怎麼就不河蟹了……
那麼docker究竟是個什麼東西呢?
首先,你可以認為docker是一個類似虛擬機器(VM)的東西,你可以把你要發布的應用打包成一個docker image,然後部署到實際的機器上。這種機器可以是實際的伺服器,也可以是VPS或其它PaaS之類的。然後,在一個機器環境裡,你還可以同時跑幾個docker container。image和container的關係可以理解為“類”和“執行個體”的關係。而且在一個機器環境裡跑的container還可以是基於不同的image。你可以隨時把一個container打包成一個image作再次的部署。
其次,你在一個container裡作的修改也可以更新到基於同一image的其它container裡。因為可以只更新修改過的部分,類似於版本控制下的更新。事實上它也有一個類似版本管理倉庫(Repositry)的東西,有docker.io提供的官方倉庫(index.docker.io,相當於github),也可以自建(叫docker-registry)。
最後,它與VM的不同之處就在於一個字:輕。一個VM實際上包含了一套虛擬硬體,一個完整的OS,再加入應用程式。而docker container只是一個隔離的應用程式運行環境,對於應用程式來說,docker環境相當於一個完整的OS,但是實際上它是跑在宿主OS上的,一個container只包含這個應用環境與宿主機環境的差異部分,非常的輕量。
更貼切的類比應該是:類似於python的virtualenv。只不過這是一個OS層面的virtualenv。
安裝
按官方文檔的安裝說明,最好是用ubuntu 13.04及以上版本,因為需要kernel版本在3.8以上。其它發行版或低版本ubuntu也不是不行,就是略不方便。至於其它平台,請使用Vagrant虛擬機器方案。
因為我自己的案頭是12.04LTS,懶得手工升級kernel(升級方法在docker的官方文檔裡有),所以在FreeBSD伺服器上裝了個VirtualBox虛擬機器,裝了個Linux Mint 16(基於ubuntu 13.10)。以下以此為例。
首先,docker依賴aufs,還好這個Mint內建了,如果是其它發行版或是手工升級kernel的就要檢查一下了:
sudo apt-get updatesudo apt-get install linux-image-extra-`uname -r`
之後是增加docker的apt源。
加源之前先加認證:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
但是因為官方源被牆,幸好還有一個鏡像源可以用:
sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main\> /etc/apt/sources.list.d/docker.list"sudo apt-get updatesudo apt-get install lxc-docker
至此,理論上安裝就已經完成了。但是還不能正常使用……
使用
如前面所說,這樣安裝完成並不能正常使用,這又是因為可恥的大中華區域網路造成的,docker的index伺服器被牆了。
解決方案是:你需要有VPN或者一個HTTP代理(如果有SOCK5代理的話,也可以用privoxy或polipo轉成HTTP代理)。
有到國外的VPN的話,直接建立起VPN串連就可以用。以下為HTTP代理方式,先假設你已經有了一個HTTP代理:proxy_server:8118
sudo service stop dockersudo HTTP_PROXY=http://proxy_server:8118 docker -d &
現在終於可以內牛滿面地開始使用docker了,試試:
sudo docker run -i -t ubuntu /bin/bash
至於使用方法,你可以先在官方的模擬器上試一試,然後再到你的真實環境裡照樣做一次,應該就會有實際的體會了。
常用命令:
# 在官方倉庫搜尋imagedocker search [...]# 從官方倉庫下載指定imagedocker pull [image]# 從指定image裡產生一個container並在其中運行一個命令docker run [image] [cmd]# 在container裡運行互動式命令,比如shelldocker run -i -t [imag] [cmd]# 在container裡運行背景工作docker run -d [image] [cmd]# 列出最近一個運行過的container,不加-l則只列出正在啟動並執行container(比如背景工作)docker ps -l# 列出所有containerdocker ps -a# 查看container詳情docker inspect [container_id]# 刪除某個container,其中container_id不需要輸入完整,只要能保證唯一即可docker rm [container_id]# 再次運行某個containerdocker start [container_id]# 查看某個container的作業記錄docker logs [container_id]# 切換到背景工作container,注意:切換到背景工作以後無法用Ctrl-C退出docker attach [container_id]# 中止背景工作containerdocker stop [container_id]# 將container儲存為一個imagedocker commit [container_id] [image_name]# 列出當前環境中已有imagesdocker images# 將image上傳到倉庫docker push [image_name]