Docker是供開發人員和系統管理員使用容器構建,運行和共享應用程序的平臺。 使用容器部署應用程序稱爲容器化。 容器並非新事物,但用於輕鬆部署應用程序的容器倒是新事物。 容器化愈來愈受歡迎,由於容器是:node
根本上講,一個容器不過是一個正在運行的進程,並對其應用了一些附加的封裝功能,以使其與主機和其餘容器隔離 容器隔離的最重要方面之一是每一個容器都與本身的專用文件系統進行交互。 該文件系統由Docker映像提供。 映像包括運行應用程序所需的一切-代碼或二進制文件,運行時,依賴項以及所需的任何其餘文件系統對象。git
容器在Linux上本地運行,並與其餘容器共享主機的內核。 它運行一個獨立進程,不佔用任何其餘可執行文件更多的內存,從而使其輕巧。github
相比之下,虛擬機(VM)運行具備「虛擬機管理程序」對主機資源的虛擬訪問權的成熟「來賓」操做系統。 一般,VM會產生大量開銷,超出了應用程序邏輯所消耗的開銷。docker
Docker Desktop是適用於Mac或Windows環境的易於安裝的應用程序,可以讓您在幾分鐘內開始編碼和容器化。 Docker Desktop包含直接從您的機器構建,運行和共享容器化應用程序所需的一切。 具體環境能夠去官網上下載相應的安裝包npm
$ docker --version
json
一般,開發工做流程以下所示:瀏覽器
在本教程的這個階段,讓咱們關注這個工做流的第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的文件。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上可用,您將能夠在任何地方運行它。 若是您嘗試在還沒有安裝的新機器上使用它,則Docker會自動嘗試從Docker Hub下載。 經過以這種方式移動映像,您再也不須要在要運行咱們的軟件的計算機上安裝除Docker之外的任何依賴項。 容器化應用程序的依賴關係已徹底封裝並隔離在您的映像中,如上所述,咱們可使用Docker Hub進行共享。
須要記住的另外一件事:目前,咱們僅將您的映像推送到Docker Hub; 那你的Dockerfile呢? 一個關鍵的最佳實踐是將它們保留在版本控制中,或者與應用程序的源代碼一塊兒保留。 您能夠在Docker Hub存儲庫描述中添加連接或註釋,以指示能夠在何處找到這些文件,不只保留有關圖像構建方式以及做爲完整應用程序運行的方式的記錄。