Docker 是 Golang 編寫的, 自 2013 年推出以來,受到越來越多的開發者的關注。如果你關注最新的技術發展,那麼你一定聽說過 Docker。不管是雲服務還是微服務(Microservices),越來越多的廠商都開始基于 Docker 作為基礎設施自動化的工具。那麼什麼是 Docker?Docker與傳統的虛拟機有什麼差別?為何要采用 Docker?如何使用 Docker?
本文,就針對上述提到的問題,來簡單介紹下 Docker。
什麼是 Docker
Docker 是開源的應用容器引擎。
Docker 可以讓你将所有應用軟體以及它的以來打包成軟體開發的标準化單元。
Docker 容器将軟體以及它運作安裝所需的一切檔案(代碼、運作時、系統工具、系統庫)打包到一起,這就保證了不管是在什麼樣的運作環境,總是能以相同的方式運作。就好像 Java 虛拟機一樣,“一次編寫,到處運作(Write once, run anywhere)”,而 Docker 是“一次建構,到處運作(Build once,run anywhere)”。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicWZwpmLyMmNwEGZmlTNlZTYlZGZ4UTN3IDO0cDZjBDM1UDMxY2YhhDO1EWNm9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpeg)
Docker 是一種“容器即服務”(Docker Containers as a Service ,簡稱 CaaS),使得開發和IT營運團隊可以對于應用的建構、釋出、運作更加靈活和可控。
概括的說:Docker 是為開發人員和系統管理者用于建構、釋出、并運作分布式應用程式的開放式平台。該平台由 Docker 引擎(一個便攜、輕巧的運作時和打包工具) 和 Docker Hub (一個共享應用程式和自動化工作流的雲服務)等組成。Docker 可以使應用程式從元件迅速組裝并消除了開發、品質保證和生産環境之間的摩擦問題。這樣一來,IT部門可以更快地釋出,而這些應用程式不管是運作在筆記本電腦、資料中心的虛拟機,還是任何的雲,其運作過程和結果都是一緻的。
我們再來看下 Docker 的 Logo 。很明顯,這是一隻鲸魚,它托着許多集裝箱。我們可以把主控端可當做這隻鲸魚,把互相隔離的容器可看成集裝箱,每個集裝箱中都包含自己的應用程式。這 Logo 簡直的太形象了!
Docker 的優點
輕量級:所有容器在一台機器上共享同一個作業系統核心,這樣他們立即開始,并更有效地利用記憶體。Image 是從分層檔案系統的建構,這樣他們能夠共享公共檔案,使得磁盤使用率和 Image 的下載下傳更加高效。
開放:Docker 容器是基于開發的标準,允許容器運作在主流的 Linux 釋出版和 Microsoft 作業系統作為所有的基礎設施。
安全:容器使得應用程式彼此隔離,而基礎架構同時為應用程式提供了額外的保護層。
Docker 與 虛拟機的差別
容器與虛拟機有着類似的資源隔離和配置設定的優點,但不同的架構方法使容器能夠更加便攜,高效等。
虛拟機的架構
每個虛拟機都包括應用程式、必要的二進制檔案和庫以及一個完整的客戶作業系統(Guest OS),盡管它們被分離,它們共享并利用主機的硬體資源,将近需要十幾個 GB 的大小。
容器的架構
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1
容器包括應用程式及其所有的依賴,但與其他容器共享核心。它們以獨立的使用者空間程序形式運作在主機作業系統上。他們也不依賴于任何特定的基礎設施,Docker 容器可以運作在任何計算機上,任何基礎設施和任何雲上。
Docker 的容器利用了 LXC,管理利用了 namespaces 來做權限的控制和隔離,cgroups 來進行資源的配置,并且還通過 aufs 來進一步提高檔案系統的資源使用率,而這些技術都不是 Docker 獨創。
LXC
LXC 與虛拟機的不同之處在于,它是一個作業系統級别的虛拟化環境,而不是硬體虛拟化環境。他們都做同樣的事情,但 LXC 是作業系統級别的虛拟化環境,虛拟環境有它自己的程序和網絡空間,而不是建立一個完整成熟的虛拟機。是以,一個 LXC 虛拟作業系統具有最小的資源需求,并啟動隻需幾秒鐘。
正如你可以在下圖中看到的,左側是 LXC 虛拟的 Ubuntu ,預設安裝使用 11 MB 大小。
Docker 與 Microservices 的關系
Microservices(微服務) 依賴于“基礎設施自動化”,而 Docker 正是“基礎設施自動化”的利器。可以說 Docker 的火爆,一定程度上也帶動了微服務架構的興起,而微服務的廣泛應用也促進了 Docker 繁榮。可以說兩者相輔相成。
有關微服務的介紹,可以移步至《簡述 Microservices(微服務)》。
http://www.importnew.com/24651.html為什麼要用 Docker
開發更加靈活:Docker 讓開發人員可以自由定義環境,建立和部署的應用程式更快、更容易,IT 運維人員快速應對變化也更加靈活性。
更加可控:Docker 使得開發人員儲存從基礎設施到應用的代碼,幫助 IT 運維人管理擁有标準的、安全的、可擴充的操作環境。
高可移植性:Docker 允許自由選擇,可以是從筆記本電腦到一個團隊,從私人基礎設施到公共雲提供商。
這樣,你可以專注于開發應用,其他的繁瑣事交給 Docker 去做吧。
如何使用 Docker
這可真是一個大話題,如果完整闡述足夠寫一本書了。好在我們的目的是做入門普及,是以我們就簡單講一下 Docker 的安裝、基本使用和常用指令。
Docker安裝
建議在linux環境下安裝Docker,window環境搭建比較複雜且容易出錯,使用Centos7+yum來安裝Docker環境很友善。
Docker 軟體包已經包括在預設的 CentOS-Extras 軟體源裡。是以想要安裝 docker,隻需要運作下面的 yum 指令:
yum install docker
安裝完成後,使用下面的指令來啟動 docker 服務,并将其設定為開機啟動:
service docker start
chkconfig docker on
LCTT 譯注:此處采用了舊式的 sysv 文法,如采用CentOS 7中支援的新式 systemd 文法,如下:
測試
docker version
輸入上述指令,傳回docker的版本相關資訊,證明docker安裝成功。
Hello World
下面,我們通過最簡單的 image 檔案"hello world",感受一下 Docker。
因為國内連接配接 Docker 的官方倉庫很慢,是以我們在日常使用中會使用Docker 中國加速器。通過 Docker 官方鏡像加速,中國區使用者能夠快速通路最流行的 Docker 鏡像。該鏡像托管于中國大陸,本地使用者現在将會享受到更快的下載下傳速度和更強的穩定性,進而能夠更靈活地開發和傳遞 Docker 化應用。
Docker 中國官方鏡像加速可通過 registry.docker-cn.com通路。該鏡像庫隻包含流行的公有鏡像,私有鏡像仍需要從美國鏡像庫中拉取。
修改系統中docker對應的配置檔案即可,如下:
vi /etc/docker/daemon.json
添加後
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"live-restore": true
}
運作下面的指令,将 image 檔案從倉庫抓取到本地。
docker pull library/hello-world
上面代碼中,docker image pull是抓取 image 檔案的指令。library/hello-world是 image 檔案在倉庫裡面的位置,其中library是 image 檔案所在的組,hello-world是 image 檔案的名字。
抓取成功以後,就可以在本機看到這個 image 檔案了。
docker images
顯示結果
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest f2a91732366c 3 months ago 1.848 kB
現在,運作這個 image 檔案。
docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
輸出這段提示以後,hello world就會停止運作,容器自動終止。有些容器不會自動終止,因為提供的是服務,比如Mysql鏡像等。
常用指令
除過以上我們使用的Docker指令外,Docker還有一些其它常用的指令。
拉取docker鏡像
docker pull image_name
檢視主控端上的鏡像,Docker鏡像儲存在/var/lib/docker目錄下:
删除鏡像
docker rmi docker.io/tomcat:7.0.77-jre7 或者 docker rmi b39c68b7af30
檢視目前有哪些容器正在運作
docker ps
檢視所有容器
docker ps -a
啟動、停止、重新開機容器指令:
docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id
背景啟動一個容器後,如果想進入到這個容器,可以使用attach指令:
docker attach container_name/container_id
删除容器的指令
docker rm container_name/container_id
檢視目前系統Docker資訊
docker info
從Docker hub上下載下傳某個鏡像:
docker pull centos:latest
執行docker pull centos會将Centos這個倉庫下面的所有鏡像下載下傳到本地repository。