天天看點

一文快速入門Docker

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

Docker的logo是一個載着集裝箱的大鲸魚,這絕對是對Docker最形象的描述和解釋。

對比運輸業,在集裝箱出現之前,貨物無法用統一的标準方式進行搬運,比如有些貨物易碎,需要輕拿輕放,有些則不需要。于是鐵路、公路、海洋等各種運輸之間,需要大量的人力作為貨物中轉,效率極低,而且成本很高。集裝箱出現之後,解決了這個難題,任何貨物貨物都可以放到這個神奇的箱子裡,然後在公路、鐵路、海洋等所有運輸場景下,這個箱子在運輸過程中都是密封的,而且中間的中轉工作,都可以通過大型機械搞定,效率大大提升。

Docker正式借鑒了标準集裝箱的思想,将集裝箱思想運用到了軟體領域。Docker為代碼提供了一個基于容器的标準化運輸系統,可以将任何應用及其依賴的環境(如代碼、配置檔案、JDK、Tomcat等)打包成一個容器,這個容器可以在幾乎所有的作業系統運作。

鏡像是docker的基石,使用者可以基于鏡像來運作自己的容器。

鏡像的基礎是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算是入門了,但是萬裡長征隻走完了第一步,學無止境,共勉。

由于部落客也是在攀登的路上,文中可能存在不當之處,歡迎各位多指教! 如果文章對您有用,那麼請點個”推薦“,以資鼓勵!