Docker學習心得

 

每一輪新技術的興起,不管對公司仍是我的既是機會也是挑戰。docker

我我的的見解是:若是某項新技術將來將成爲主流,就應該及早儘快掌握。 由於:ubuntu

一、新技術意味着新的市場和新的需求。
初期掌握這種技術的人不會不少,而市場需求會愈來愈大,於是會造成供不該求的賣方市場,物以稀爲貴,這對技術人員將是一個可貴的價值提高機會。vim

二、學習新技術須要時間和精力,早起步早成材。服務器

三、本文主要總結容器核心知識,進階知識之後有機會在學習網絡

What - 什麼是容器?
容器是一種輕量級、可移植、自包含的軟件打包技術,使應用程序能夠在幾乎任何地方以相同的方式運行。開發人員在本身筆記本上建立並測試好的容器,無需任何修改就可以在生產系統的虛擬機、物理服務器或公有云主機上運行。架構

How-爲何須要容器?socket

Docker 將集裝箱思想運用到軟件打包上,爲代碼提供了一個基於容器的標準化運輸系統。Docker 能夠將任何應用及其依賴打包成一個輕量級、可移植、自包含的容器。容器能夠運行在幾乎全部的操做系統上學習

 

 

容器基本入門測試

Docker 的核心組件包括:ui

Docker 客戶端 - Client:經過docker在host上構建和運行容器

Docker 服務器 - Docker daemon:是服務器組件,以 Linux 後臺服務的方式運行。

Docker 鏡像 - Image:經過它能夠建立 Docker 容器。

Registry:存放 Docker 鏡像的倉庫,Registry 分私有和公有兩種。

Docker 容器 - Container

 

Docker 架構以下圖所示:

 

Docker 採用的是 Client/Server 架構。客戶端向服務器發送請求,服務器負責構建、運行和分發容器。客戶端和服務器能夠運行在同一個 Host 上,客戶端也能夠經過 socket 或 REST API 與遠程的服務器通訊。

 

新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現有鏡像的基礎上增長一層。

問什麼 Docker 鏡像要採用這種分層結構呢?

最大的一個好處就是 - 共享資源。

好比:有多個鏡像都從相同的 base 鏡像構建而來,那麼 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內存中也只需加載一份 base 鏡像,就能夠爲全部容器服務了。並且鏡像的每一層均可以被共享,咱們將在後面更深刻地討論這個特性。

 

 

dockerfile文件建立鏡像

Dockerfile 是一個文本文件,記錄了鏡像構建的全部步驟。

第一個 Dockerfile

用 Dockerfile 建立上節的 ubuntu-with-vi,其內容則爲:

 

下面咱們運行 docker build 命令構建鏡像並詳細分析每一個細節。

root@ubuntu:~# pwd         ①  

/root  

root@ubuntu:~# ls          ②   

Dockerfile   

root@ubuntu:~#docker build -t ubuntu-with-vi-dockerfile .        ③   

Sending build context to Docker daemon 32.26 kB           ④   

Step 1 : FROM ubuntu           ⑤   

 ---> f753707788c5   

Step 2 : RUN apt-get update && apt-get install -y vim           ⑥   

 ---> Running in 9f4d4166f7e3             ⑦   

......   

Setting up vim (2:7.4.1689-3ubuntu1.1) ...   

 ---> 35ca89798937           ⑧    

Removing intermediate container 9f4d4166f7e3          ⑨   

Successfully built 35ca89798937           ⑩   

root@ubuntu:~#   


① 當前目錄爲 /root。

② Dockerfile 準備就緒。

③ 運行 docker build 命令,-t 將新鏡像命名爲 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 爲當前目錄。Docker 默認會從 build context 中查找 Dockerfile 文件,咱們也能夠經過 -f 參數指定 Dockerfile 的位置。

④ 從這步開始就是鏡像真正的構建過程。 首先 Docker 將 build context 中的全部文件發送給 Docker daemon。build context 爲鏡像構建提供所須要的文件或目錄。
Dockerfile 中的 ADD、COPY 等命令能夠將 build context 中的文件添加到鏡像。此例中,build context 爲當前目錄 /root,該目錄下的全部文件和子目錄都會被髮送給 Docker daemon。

因此,使用 build context 就得當心了,不要將多餘文件放到 build context,特別不要把 /、/usr 做爲 build context,不然構建過程會至關緩慢甚至失敗。

⑤ Step 1:執行 FROM,將 ubuntu 做爲 base 鏡像。
ubuntu 鏡像 ID 爲 f753707788c5。

⑥ Step 2:執行 RUN,安裝 vim,具體步驟爲 ⑦、⑧、⑨。

⑦ 啓動 ID 爲 9f4d4166f7e3 的臨時容器,在容器中經過 apt-get 安裝 vim。

⑧ 安裝成功後,將容器保存爲鏡像,其 ID 爲 35ca89798937。
這一步底層使用的是相似 docker commit 的命令。

⑨ 刪除臨時容器 9f4d4166f7e3。

⑩ 鏡像構建成功。 
經過 docker images 查看鏡像信息。 
鏡像 ID 爲 35ca89798937,與構建時的輸出一致。

在上面的構建過程當中,咱們要特別注意指令 RUN 的執行過程 ⑦、⑧、⑨。Docker 會在啓動的臨時容器中執行操做,並經過 commit 保存爲新的鏡像。

查看鏡像分層結構

ubuntu-with-vi-dockerfile 是經過在 base 鏡像的頂部添加一個新的鏡像層而獲得的。

 

這個新鏡像層的內容由 RUN apt-get update && apt-get install -y vim 生成。這一點咱們能夠經過 docker history 命令驗證。

docker history 會顯示鏡像的構建歷史,也就是 Dockerfile 的執行過程。

 

回顧一下經過 Dockerfile 構建鏡像的過程:

從 base 鏡像運行一個容器。

執行一條指令,對容器作修改。

執行相似 docker commit 的操做,生成一個新的鏡像層。

Docker 再基於剛剛提交的鏡像運行一個新容器。

重複 2-4 步,直到 Dockerfile 中的全部指令執行完畢。

下面列出了 Dockerfile 中最經常使用的指令,完整列表和說明可參看官方文檔。

FROM
指定 base 鏡像。

MAINTAINER
設置鏡像的做者,能夠是任意字符串。

COPY
將文件從 build context 複製到鏡像。
COPY 支持兩種形式:

COPY src dest

COPY ["src", "dest"]

注意:src 只能指定 build context 中的文件或目錄。

ADD
與 COPY 相似,從 build context 複製文件到鏡像。不一樣的是,若是 src 是歸檔文件(tar, zip, tgz, xz 等),文件會被自動解壓到 dest。

ENV
設置環境變量,環境變量可被後面的指令使用。例如:

...

ENV MY_VERSION 1.3

RUN apt-get install -y mypackage=$MY_VERSION

...

EXPOSE
指定容器中的進程會監聽某個端口,Docker 能夠將該端口暴露出來。咱們會在容器網絡部分詳細討論。

VOLUME
將文件或目錄聲明爲 volume。咱們會在容器存儲部分詳細討論。

WORKDIR
爲後面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令設置鏡像中的當前工做目錄。

RUN
在容器中運行指定的命令。

CMD
容器啓動時運行指定的命令。
Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效。CMD 能夠被 docker run 以後的參數替換。

ENTRYPOINT
設置容器啓動時運行的命令。
Dockerfile 中能夠有多個 ENTRYPOINT 指令,但只有最後一個生效。CMD 或 docker run 以後的參數會被當作參數傳遞給 ENTRYPOINT。

下面咱們來看一個較爲全面的 Dockerfile:

 

注:Dockerfile 支持以「#」開頭的註釋。

 

下面是鏡像的經常使用操做子命令:

images    顯示鏡像列表

history   顯示鏡像構建歷史

commit    從容器建立新鏡像

build     從 Dockerfile 構建鏡像

tag       給鏡像打 tag

pull      從 registry 下載鏡像

push      將 鏡像 上傳到 registry

rmi       刪除 Docker host 中的鏡像

search    搜索 Docker Hub 中的鏡像


除了 rmi 和 search,其餘命令都已經用過了。

rmi

rmi 只能刪除 host 上的鏡像,不會刪除 registry 的鏡像。

Search:默認在docker hub 中查找鏡像:docker search httpd

 

容器指令

容器的經常使用操做命令:

create      建立容器  

run         運行容器  

pause       暫停容器  

unpause     取消暫停繼續運行容器  

stop        發送 SIGTERM 中止容器  

kill        發送 SIGKILL 快速中止容器  

start       啓動容器  

restart     重啓容器  

attach      attach 到容器啓動進程的終端  

exec        在容器中啓動新進程,一般使用 "-it" 參數  

logs        顯示容器啓動進程的控制檯輸出,用 "-f" 持續打印  

rm          從磁盤中刪除容器

 

如下三者是當前主流的容器編排引擎。

docker swarm 是 Docker 開發的容器編排引擎。

kubernetes 是 Google 領導開發的開源容器編排引擎,同時支持 Docker 和 CoreOS 容器。

mesos 是一個通用的集羣資源調度平臺,mesos 與 marathon 一塊兒提供容器編排引擎功能。

相關文章
相關標籤/搜索