Docker提供一種安全、可重複的環境中自動部署軟體的方式,拉開了基于與計算平台發展方式的變革序幕。如今Docker在網際網路公司使用已經非常普遍。本文用十分鐘時間,帶你快速入門Docker。
Docker是什麼?
官網首頁的介紹:
Enterprise Container Platform for High-Velocity Innovation. Securely build, share and run any application, anywhere
百度百科告訴我們:
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實作虛拟化,容器是完全使用沙箱機制,互相之間不會有任何接口。
《第一本DOCKER書》的簡介:
Docker是一個能夠把開發的應用程式自動部署到容器的開源引擎。由Docker公司(www.docker.com,前dotCloud公司,PaaS市場中的老牌供應商)的團隊編寫,基于Apache 2.0開源協定發行。
Docker的特别之處:
Docker是輕量級的虛拟化技術,啟動速度快(大多數Docker容器隻需不到1s即可完成啟動),單台硬體上可以同時跑成百上千個容器,使得快速擴充,彈性伸縮變得簡單。據說,在2016年,京東使用15萬Docker叢集來保證618高并發場景下的系統穩定。
Docker是跨平台的,支援Windows、Macos、Linux,可以做到“建構一次,到處運作”,解決開發環境和生産環境不一緻帶來的一系列問題,讓開發人員和運維人員可以更加和諧相處。
Docker是開源的,托管于GitHub。
從docker的logo聯想docker核心思想

Docker的logo是一個載着集裝箱的大鲸魚,這絕對是對Docker最形象的描述和解釋。
對比運輸業,在集裝箱出現之前,貨物無法用統一的标準方式進行搬運,比如有些貨物易碎,需要輕拿輕放,有些則不需要。于是鐵路、公路、海洋等各種運輸之間,需要大量的人力作為貨物中轉,效率極低,而且成本很高。集裝箱出現之後,解決了這個難題,任何貨物貨物都可以放到這個神奇的箱子裡,然後在公路、鐵路、海洋等所有運輸場景下,這個箱子在運輸過程中都是密封的,而且中間的中轉工作,都可以通過大型機械搞定,效率大大提升。
Docker正式借鑒了标準集裝箱的思想,将集裝箱思想運用到了軟體領域。Docker為代碼提供了一個基于容器的标準化運輸系統,可以将任何應用及其依賴的環境(如代碼、配置檔案、JDK、Tomcat等)打包成一個容器,這個容器可以在幾乎所有的作業系統運作。
鏡像是docker的基石,使用者可以基于鏡像來運作自己的容器。
鏡像的基礎是Docker的聯合檔案系統,該檔案系統是分層的,每個鏡像是一個層。由于每個層上面還以有其他層,也就是說,鏡像可以在其他鏡像(基礎鏡像)上面進行建立。借用一幅圖來幫助了解。圖檔來源于網絡,侵删。
倉庫是儲存使用者鏡像的地方,docker官方倉庫位址為 https://hub.docker.com。在Docker Hub上面有許多鏡像,包括最簡單的hello-world,MySQL等等。當然我們也可以有自己私有的倉庫。
容器為應用程式提供了隔離的運作空間。每個容器内都包含一個獨享的完整的使用者環境,并且一個容器内的運作環境變動不會影響其他容器的運作環境,可以使應用程式在幾乎任何地方以相同的方式運作。
容器是基于鏡像啟動的,容器中可以運作一個或多個程序。在建立容器程序時,指定了這個程序所需要的Namespace參數,使得容器就隻能「看」到目前 Namespace 所限定的資源、檔案、裝置、狀态,或者配置。是以說,容器是一種特殊的程序而已,容器的本質就是程序。
以CentOS 7為例,進行安裝Docker。
Docker運作在 CentOS 7上,要求作業系統為 64 位,核心版本為 3.10 及以上。
确認本機已經安裝了滿足要求的Linux核心。使用指令<code>uname -r</code>來檢查核心版本資訊。
使用指令<code>yum install -y docker</code>安裝Docker,“-y”表示不詢問,使用預設配置進行安裝。
使用下列指令:
輸入<code>docker version</code>,傳回版本資訊表明Docker安裝成功。
入門實戰怎麼能少得了經典的“Hello World”?
其實DockerHub上已經有了這個鏡像,名字叫“hello-world”。直接從DockerHub拉取鏡像,指令和Git有些相似:<code>docker pull hello-world</code>
檢視拉取到的Docker鏡像:<code>docker images</code>
運作鏡像:<code>docker run hello-world</code>。看到列印出如下的内容,代表運作成功。
docker images : 列出本地的鏡像
docker pull image_name:拉取鏡像。如果沒有指定具體的鏡像标簽,會自動拉取latest标簽的鏡像。
docker search image_name:在Docker Hub上查找鏡像
docker start container:啟動和運作容器
docker run [OPTIONS] image_name:基于鏡像建立并啟動一個容器
常用選項:
-d: 背景運作容器,并傳回容器ID;
-i: 以互動模式運作容器,通常與 -t 同時使用;
-t: 為容器重新配置設定一個僞輸入終端,通常與 -i 同時使用;
-P: 随機端口映射,容器内部端口随機映射到主機的高端口
-p: 指定端口映射,格式為:主機(宿主)端口:容器端口
docker logs container:擷取容器的日志資訊
docker attach container:進入容器
exit:退出容器
docker exec container command:在運作的容器中執行指令
docker stop container:停止容器
docker rm container:删除容器
docker save -o image_name.tar image_name:導出鏡像
docker ps:檢視正在運作的容器
docker ps -a:檢視系統中容器清單
docker top container:檢視容器内的程序
docker stop daemon_dave:停止守護容器
建構一個自己的鏡像需要兩步:
編寫Dockerfile。Dockerfile 告訴Docker如何制作鏡像以及每一步是怎樣的。
Docker執行Dockerfile中的指令的流程是這樣的:
Docker從基礎鏡像運作一個容器
執行一條指令,對容器進行修改
送出到一個新的鏡像層
Docker再基于剛才送出的鏡像運作一個新容器
執行Dockerfile中的下一條指令,知道所有指令執行完畢。
使用docker build指令建構。
每個Dockerfile的第一條指令必須是FROM。FROM指令指定一個已經存在的鏡像,告訴Docker後續的指令都是在這個基礎上進行的。例如:<code>FROM java:8</code>
MAINTAINER 指令用來标志該鏡像所有者和聯系方式。例如:<code>MAINTAINER James "×××@example.com"</code>
VOLUME 指令用來向基于鏡像建立的容器添加卷。一個卷可以是存在一個或者多個容器内的特定的目錄,這個目錄可以繞過聯合檔案系統,并提供共享資料和資料持久化的功能。
CMD 指令用來指定一個容器啟動時要運作的指令。
ENTRYPOINT指令與CMD指令很相似。
WORKDIR 指令用來從鏡像建立一個新容器的時候,在容器内部設定一個工作指令,ENTRYPOINT或CMD指令指定的程式會在這個目錄下執行。
ENV 指令用來在在鏡像建構過程中設定環境變量。例如:<code>ENV TEST_PATH /home/test</code>
RUN 指令用來在目前鏡像中運作指定的指令。例如:<code>RUN apt-get install -y nginx</code>
EXPOSE 指令用來告訴Docker該容器内的應用程式将使用容器的指定端口。例如:<code>EXPOSE 80</code>
ADD 指令用來将建構環境下的檔案和目錄複制到鏡像中。 例如:<code>ADD docker-0.0.1-SNAPSHOT.jar app.jar</code>
COPY 指令與ADD 類似,不同點在與COPY隻關心在建構上下文中複制本地檔案,而不會提取和解壓。
LABEL 指令用于為Docker鏡像添加中繼資料。例如:<code>LABEL name=test description="a container is used to test"</code>
Dockerfile執行個體:
執行<code>docker build</code>指令後看到“BUILD SUCCESS”表明建構成功,可以使用<code>docker run</code>指令來運作了。
本文介紹了Docker是什麼、Docker思想、Docker核心概念、Docker安裝等内容,看完本文,Docker算是入門了,但是萬裡長征隻走完了第一步,學無止境,共勉。
由于部落客也是在攀登的路上,文中可能存在不當之處,歡迎各位多指教! 如果文章對您有用,那麼請點個”推薦“,以資鼓勵!