這只是一個簡單的演示,讓您在逐步工作的同時,對 Docker 的工作原理有基本的了解。我就這樣學習了docker,並製作了這個repo來解決我在學習過程中遇到的一些問題,以便對其他初學者有所幫助。希望您享受學習的樂趣。如果您喜歡它,請在 GitHub 上按讚並支持我的工作。
重要提示:-透過查看自述文件的大小,您可能會重新考慮,但說實話,如果您從頭開始工作,您將不會遇到任何問題並一路學習。
維基百科將 Docker 定義為
是一組平台即服務 (PaaS) 產品,它使用作業系統級虛擬化以稱為容器的套件形式交付軟體。容器彼此隔離,並將其軟體、庫和設定檔捆綁在一起;他們可以透過明確的管道相互溝通。所有容器都由單一作業系統核心運行,因此比虛擬機器使用更少的資源。
Docker 可協助您在沙箱(稱為容器)中更有效地部署應用程序,以便在主機作業系統(即 Mac)上運行。 docker 的主要優點是它允許您將軟體及其所有依賴項打包到單一標準化單元中。
容器是一種解決方案,用於解決如何讓軟體在從一個運算環境轉移到另一個運算環境時順利運行的問題。這可能是從暫存環境到生產環境,也可能是從筆記型電腦到另一個作業系統的另一台筆記型電腦。
容器提供了一種邏輯打包機制,您的應用程式可以從它們運行的環境中抽像出來。主要區別在於每個容器不需要其成熟的作業系統。單一主機上的所有容器共用單一作業系統。這有助於釋放大量的系統資源,例如 CPU、RAM。
安裝 Docker 後,透過執行以下命令來測試 Docker 安裝:
docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Dockerfile
是一個文字文檔,其中包含可以在命令列上呼叫來製作映像的所有命令。建立檔案hello.js
並將此程式碼複製到其中。這裡我們寫了一個簡單的 JS 程式碼來在localhost:8888
上顯示 Hello World。 var http = require( " http " ) ;
http.createServer(function (request, response) {
response.writeHead(200, { ' Content-Type ' : ' text/plain ' }) ;
response.end( ' Hello Worldn ' ) ;
}).listen(8888) ;
// Console will print the message
console.log( ' Server running at http://127.0.0.1:8888/ ' ) ;
Dockerfile
的檔案並將此程式碼複製到其中。 FROM node:8
LABEL maintainer= " [email protected] "
RUN npm install
ADD hello.js /hello.js
EXPOSE 8888
ENTRYPOINT [ " node " , " hello.js " ]
即使這是您見過的第一個 Dockerfile,我想說您也可以很好地猜測這裡發生了什麼。 Dockerfile 指令有 FROM、ENV、LABEL、RUN、ADD、EXPOSE 和 ENTRYPOINT;他們位於首都,但這是慣例,而不是要求。
在較高層級上,此 Dockerfile 提供了諸如從節點映像開始、添加“[email protected]”
作為維護者、運行npm install
以安裝依賴項、在應用程式程式碼中複製檔案、記錄應用程式的網路端口等指令,並將 hello.js 設定為要執行的預設應用程式。
現在我們將在本機電腦中建立一個 docker 映像。在當前專案的資料夾中開啟終端並運行
docker build -t helloworld .
在這裡,您告訴 Docker 根據目前目錄的內容建立一個名為helloworld
的映像(請注意建置命令末尾的點 (.) )。 Docker會在目錄中尋找Dockerfile,並根據檔案中的指令建立映像。
建置 docker 映像後,下一步是運行映像並查看其是否有效:
docker run -p 8888:8888 helloworld
我們剛剛執行的命令使用容器內伺服器的連接埠 8888,並將其暴露在連接埠 8888 上。
恭喜!您已成功建立第一個 docker 映像。
Docker 映像檔就像虛擬機器範本一樣,用於啟動容器。在底層,它們由一個或多個唯讀層組成,當這些層堆疊在一起時,就構成了整體影像。 Docker 負責堆疊這些層並將它們表示為單一統一物件。注意: Docker 映像像是不可變的,這意味著 Docker 映像永遠無法變更。一旦創建,您可以將其刪除,但無法修改。
Docker 映像包含您打包的所有文件,這些文件成為容器的文件系統 - 並且它還包含有關映像本身的大量元資料。其中包括圖像建構方式的簡要歷史。您可以使用它來查看圖像的每一層以及建立該層的命令。您可以使用以下指令檢查helloworld
影像的歷史記錄:
docker image history helloworld
IMAGE CREATED CREATED BY COMMENT
cb84eb33ca20 58 seconds ago /bin/sh -c # (nop) ENTRYPOINT ["node" "hello…
7d652a817a9f 58 seconds ago /bin/sh -c # (nop) EXPOSE 8888
334575e947c9 59 seconds ago /bin/sh -c # (nop) ADD file:b9606ef53b832e66e…
CREATED BY
指令是 Dockerfile 指令 - 存在一對一的關係,因此 Dockerfile 中的每一行都會建立一個映像層。
首先,您需要使用您的 dockerhub 帳戶登入
docker login --username $dockerId
現在您已登錄,您可以將映像推送到您的帳戶或您有權訪問的任何組織。如果您不是任何組織的成員,則只能將映像推送到您帳戶中的儲存庫。
我們建置了一個名為helloworld
的 Docker 映像。該圖片引用沒有帳戶名,因此我們無法將其推送到任何註冊表。不過,我們不需要重建影像來為其提供新的參考,影像可以有多個參考。像這樣標記你的圖像:
docker image tag helloworld $dockerId /helloworld:v1
現在我們有了一個映像引用,帳戶名稱包含我們的 Docker ID,並且我們登入了 Docker Hub,準備好共用我們的映像了! docker image push 指令與 pull 指令相對應,它將我們的本機映像層上傳到登錄:
docker image push championshuttler/helloworld:v1
The push refers to a repository [docker.io/championshuttler/helloworld]
9519a21ac374: Pushed
我們可以將任何字串放入 Docker 映像標籤中,正如我們已經看到的,同一個映像可以有多個標籤。我們將使用它來對我們的圖像中的軟體進行版本控制,並讓用戶對他們不會使用的內容做出明智的選擇 - 並在我們使用其他人的圖像時做出我們自己的明智的選擇。
許多軟體專案使用具有小數點的數位版本控制方案來指示版本之間的變化有多大,您可以使用影像標籤來追蹤它。基本思想類似[major].[minor].[patch],它有一些隱含的保證。僅增加補丁號的版本可能有錯誤修復,但應具有與上一個版本相同的功能;增加次要版本的版本可能會新增功能,但不應刪除任何功能;主要版本可能具有完全不同的功能。
大多數應用程式並不在單一元件中運行。即使大型舊應用程式通常也建構為前端和後端元件,它們是在實體分散式元件中運行的獨立邏輯層。 Docker 非常適合運行分散式應用程式 - 從 n 層整體應用程式到現代微服務。每個元件都在其輕量級容器中運行,Docker 使用標準網路協定將它們插入在一起。您可以使用 Docker Compose 定義和管理這樣的多容器應用程式。 Docker Compose 是一個用來定義和執行多容器 Docker 應用程式的工具。透過 Compose,您可以使用YAML
檔案來設定應用程式的服務。然後,透過一個命令,我們可以根據您的配置建立並啟動所有服務。
Docker Compose 檔案描述了應用程式的所需狀態 - 當一切都在運行時它應該是什麼樣子。這是一種簡單的檔案格式,您可以將在 docker 容器運行命令中放入的所有選項捕獲到 Compose 檔案中。然後,您使用 Docker Compose 工具來運行該應用程式。它計算出所需的 Docker 資源(可能是容器、網路或磁碟區),並向 Docker API 發送請求以建立它們。 Compose YAML 檔案的預設名稱是docker-compose.yml
。但是,我們可以使用-f標誌來指定自訂檔名。
讓我們開始吧。
下面的程式碼顯示了一個非常簡單的Docker Compose
文件,它定義了一個帶有兩個服務(Web 前端和 Redis)的小型 Flask 應用程式。該應用程式是一個簡單的 Web 伺服器,用於計算存取次數並將值儲存在 Redis 中。
version: " 3.5 "
services:
web-frontend:
build: .
command: python app.py
ports:
- target: 8888
published: 8888
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: " redis:alpine "
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
version
金鑰是必要的,並且它應該始終位於文件的第一行。這解釋了Compose file
格式的版本(基本上是 API)。
頂層services
關鍵是我們定義不同的應用程式服務的地方。我們使用的範例定義了兩個服務;一個名為web-frontend
Web 前端和一個名為 Redis 的記憶體資料庫。 Compose 會將這些服務中的每一個部署為其容器。
頂級networks
密鑰告訴 Docker 建立新網路。預設情況下,Compose 將建立橋接網路。這些是單主機網絡,只能連接同一主機上的容器。
在 Web 前端服務的定義中,我們為 Docker 提供了以下指令:
我們將部署上一節中 Compose 檔案中定義的應用程式。為此,您需要 https://github.com/championsshuttler/counter-app 中的以下 4 個檔案:
將 Git 儲存庫複製到本機。
git clone https://github.com/championshuttler/counter-app.git
讓我們快速描述一下每個文件:
app.py
是應用程式程式碼(Python Flask 應用程式)。docker-compose.yml
是 Docker Compose 文件,描述 Docker 應如何部署應用程式。Dockerfile
描述如何建置 Web 前端服務的映像。requirements.txt
列出了應用程式所需的Python 套件。讓我們使用 Compose 來啟動該應用程式。您必須從counter-app
目錄中執行以下所有命令:
docker-compose up &
應用程式需要幾秒鐘的時間才能啟動,並且輸出可能非常冗長。
成功部署應用程式後,您可以將 Web 瀏覽器指向port 5000
上的 Docker 主機,並查看該應用程式的全部功能。
您是否覺得本教程一團糟,還是您覺得很有趣並學到了一些東西?直接將您的想法發送給我或只是創建一個問題。也可以在 Twitter 上找到我,如果您有任何疑問,請隨時詢問。
我很想聽聽您對本教學的體驗。希望你喜歡學習。如果你喜歡它,請在 GitHub 上給它一個並支持我的工作。