Docker 入門三部曲

容器基礎概念

Docker是供開發人員和系統管理員使用容器構建,運行和共享應用程序的平臺。 使用容器部署應用程序稱爲容器化。 容器並非新事物,但用於輕鬆部署應用程序的容器倒是新事物。 容器化愈來愈受歡迎,由於容器是:node

  • 靈活:即便最複雜的應用程序也能夠容器化。
  • 輕量級:容器利用並共享了主機內核,在系統資源方面比虛擬機更加有效。
  • 可移植:您能夠在本地構建,部署到雲並在任何地方運行。
  • 鬆散耦合:容器是高度自給自足並封裝的容器,使您能夠在不破壞其餘容器的狀況下更換或升級它們。
  • 可擴展:您能夠在數據中心內增長並自動分佈容器副本。
  • 安全:容器對進程應用主動約束和隔離,而不須要用戶進行任何配置。

鏡像和容器

根本上講,一個容器不過是一個正在運行的進程,並對其應用了一些附加的封裝功能,以使其與主機和其餘容器隔離 容器隔離的最重要方面之一是每一個容器都與本身的專用文件系統進行交互。 該文件系統由Docker映像提供。 映像包括運行應用程序所需的一切-代碼或二進制文件,運行時,依賴項以及所需的任何其餘文件系統對象。git

容器和虛擬機

容器在Linux上本地運行,並與其餘容器共享主機的內核。 它運行一個獨立進程,不佔用任何其餘可執行文件更多的內存,從而使其輕巧。github

相比之下,虛擬機(VM)運行具備「虛擬機管理程序」對主機資源的虛擬訪問權的成熟「來賓」操做系統。 一般,VM會產生大量開銷,超出了應用程序邏輯所消耗的開銷。docker

Docker

VM

設置Docker環境

Docker Desktop是適用於Mac或Windows環境的易於安裝的應用程序,可以讓您在幾分鐘內開始編碼和容器化。 Docker Desktop包含直接從您的機器構建,運行和共享容器化應用程序所需的一切。 具體環境能夠去官網上下載相應的安裝包npm

測試安裝

$ docker --versionjson

構建和運行鏡像

一般,開發工做流程以下所示:瀏覽器

  • 1.首先建立Docker鏡像,爲應用程序的每一個組件建立和測試單獨的容器。
  • 2.將您的容器和支持基礎結構組裝成一個完整的應用程序
  • 3.測試,共享和部署完整的容器化應用程序。

在本教程的這個階段,讓咱們關注這個工做流的第1步:建立鏡像。記住,Docker鏡像捕獲咱們的容器化進程將在其中運行的私有文件系統;咱們須要建立一個包含應用程序所需運行內容的鏡像。 讓咱們看一個實例:安全

git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
複製代碼

node-bulletin-board項目是一個簡單的公告板應用程序,使用Node.js編寫。 在此示例中,假設您編寫了此應用,如今正嘗試對其進行容器化.bash

經過Dockerfile定義一個容器

在公告欄應用程序中查看名爲Dockerfile的文件。Dockerfiles描述如何爲容器裝配專用文件系統,還能夠包含一些元數據,這些元數據描述如何基於此映像運行容器。公告板上的應用程序Dockerfile是這樣的:網絡

FROM node:current-slim


WORKDIR /usr/src/app
COPY package.json .
RUN npm install

EXPOSE 8080
CMD [ "npm", "start" ]

COPY . .
複製代碼

編寫Dockerfile是容器化應用程序的第一步。 您能夠將這些Dockerfile命令視爲有關如何構建映像的逐步指南。 此步驟採起如下步驟:

  • From先前存在的鏡像node:current-slim開始.這是一個官方鏡像, 這是一個官方鏡像,由node.js供應商構建,並通過Docker驗證,是一個高質量的圖像,包含node.js長期支持(LTS)解釋器和基本依賴。
  • 使用 WORKDIR指定全部的後續操做都是基於鏡像文件系統中目錄/usr/src/app,而不是主機文件系統。
  • COPY指令從你的主機的當前路徑.拷貝 package.json 到鏡像中。因此在這種狀況下,鏡像中文件的目錄爲/usr/src/app/package.json
  • RUN指令在鏡像文件系統中運行命令npm install,該命令將讀取package.json文件來決定你的應用程序的node依賴,並安裝他們。
  • COPY指令從主機將應用的其他源代碼複製到鏡像文件系統中。

您會看到,這些步驟與在主機上設置和安裝應用程序所採起的步驟幾乎相同。 可是,將它們捕獲爲Dockerfile容許咱們在可移植的隔離Docker映像內執行相同的操做。

上面的步驟構建了映像的文件系統,可是Dockerfile中還有其餘行。

實例中CMD指令指定了鏡像中的一些描述如何基於咱們鏡像運行容器的元數據。在這個例子中,就是說,此鏡像旨在支持的容器化進程是npm start

EXPOSE 8080通知Docker該容器在運行時正在偵聽端口8000。

上面您看到的是組織一個簡單的Dockerfile的好方法。 老是以FROM命令開頭,按照它的步驟構建專用文件系統,並以任何元數據規範做爲結束。Dockerfile指令比上面看到的要多。 有關完整列表。請參閱Dockerfile參考

構建並測試鏡像

如今咱們已經有了一些源代碼和一個Dockerfile,是時候構建咱們的第一個映像了,並確保從其中啓動的容器按預期工做。確保如今在node-bulletin-board/bulletin-board-app目錄下。而後開始構建鏡像 docker image build -t bulletinboard:1.0 . 您將看到Docker一步一步地遍歷Dockerfile中的每一個指令,在此過程當中構建映像。若是成功,構建過程應該以一條消息結束Successfully tagged bulletinboard:1.0.

➜  bulletin-board-app git:(master) docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bulletinboard       1.0                 13adcd31251b        40 seconds ago      152MB
複製代碼

基於鏡像運行容器

docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
複製代碼

咱們在這裏使用了幾個常見的選項:

  • --publish要求Docker轉發主機端口8000上傳入的流量,到容器的端口8080(容器具備本身的專用端口集,所以,若是咱們要從網絡訪問一個端口,則必須以這種方式將流量轉發到該端口;不然,防火牆規則將阻止全部網絡流量到達您的容器 ,做爲默認的安全狀態)。
  • --detach要求Docker在後臺運行此容器。
  • --name讓咱們指定一個名稱,在後續命令中可使用該名稱來引用咱們的容器,實例中咱們命名爲bb.

另請注意,咱們沒有指定咱們要運行容器的進程。 咱們沒有必要,由於在構建Dockerfile時使用了CMD指令; 所以,Docker知道在啓動時會自動在容器內運行npm start進程。

在瀏覽器中的localhost:8000上訪問您的應用程序。 您應該看到公告板應用程序已啓動並正在運行。 在這一步,咱們一般會竭盡所能,以確保咱們的容器按預期的方式工做; 例如,如今是運行單元測試的時候了。

對電子公告板容器正常工做感到滿意後,能夠將其刪除:

docker container rm --force bb
複製代碼

--force選項刪除正在運行的容器。

本小結總結:

至此,咱們已經成功構建了圖像,對應用程序進行了簡單的容器化,並確認咱們的應用程序已在其容器中成功運行。 下一步將是在Docker Hub上共享您的映像,以即可以輕鬆下載它們並在任何目標計算機上運行它們。

在Docker Hub上共享鏡像

1.若是你尚未docker hub 帳號,首先登錄docker hub 註冊一個

2.建立docker hub 倉庫,而後push鏡像

本小結總結

如今,您的映像已在Docker Hub上可用,您將能夠在任何地方運行它。 若是您嘗試在還沒有安裝的新機器上使用它,則Docker會自動嘗試從Docker Hub下載。 經過以這種方式移動映像,您再也不須要在要運行咱們的軟件的計算機上安裝除Docker之外的任何依賴項。 容器化應用程序的依賴關係已徹底封裝並隔離在您的映像中,如上所述,咱們可使用Docker Hub進行共享。

須要記住的另外一件事:目前,咱們僅將您的映像推送到Docker Hub; 那你的Dockerfile呢? 一個關鍵的最佳實踐是將它們保留在版本控制中,或者與應用程序的源代碼一塊兒保留。 您能夠在Docker Hub存儲庫描述中添加連接或註釋,以指示能夠在何處找到這些文件,不只保留有關圖像構建方式以及做爲完整應用程序運行的方式的記錄。

相關文章
相關標籤/搜索