Docker, Dockerfile, 和Docker Compose區別 | Baeldung

banq發表於2022-04-22

隨著越來越多的應用程式轉移到雲端計算,術語有時會變得很混亂。

在這篇文章中,我們將談論Docker、Dockerfile和Docker Compose之間的區別。

Docker
讓我們先看看Docker,任何雲端計算平臺的核心元件之一。Docker是一個容器引擎,它允許我們有效和安全地將我們的應用程式與它們所執行的基礎設施分開。

這到底是什麼意思?Docker允許我們在虛擬化環境中執行任何應用程式,使用我們想要的任何硬體或作業系統。這意味著我們可以在開發、測試和生產中為我們的應用程式使用相同的環境。

組成Docker的有幾個關鍵元件。

  • 守護程式:Docker守護程式監聽Docker API請求並管理物件,如影像/映象image和容器。
  • 客戶端:Docker客戶端是向守護程式釋出命令的主要介面。
  • 桌面:Docker桌面是適用於Mac和Windows的Docker專門版本,簡化了與守護程式的互動。

此外,還有幾個我們應該熟悉的Docker物件。
  • 映象:映象是一個獨立的檔案,包括執行一個應用程式的所有必要檔案(包括作業系統和應用程式程式碼)。映象有很多層,每一層都貢獻了一組或多組檔案和目錄。
  • 容器:容器是影像的一個可執行的例項。容器通常是相互隔離的,儘管卷和網路可以讓它們相互作用。
  • 登錄檔:登錄檔儲存映像。它可以是私有的或公共的,並可選擇要求認證。
  • 卷:卷是一個檔案系統,可以提供給一個或多個容器使用。卷可以是永續性的,也可以是短暫性的(只在一個容器處於活動狀態時持續存在)。
  • 網路:網路允許容器使用標準網路協議(TCP/IP)進行通訊。


現在我們瞭解了Docker本身的基本概念,我們可以看看其他兩個直接相關的技術。

Dockerfile
Dockerfile是一個純文字檔案,包含構建Docker映象的指令。有一個Dockerfile標準,它們遵循的是Docker守護程式,而Docker守護程式最終負責執行Dockerfile並生成映象。

一個典型的Dockerfile通常以包括另一個映象開始。例如,它可能建立在一個特定的作業系統或Java分佈。

從那裡,Dockerfile可以執行各種操作來構建一個映象。

  • 將檔案從主機系統複製到容器中。例如,我們可能想複製一個包含我們的應用程式程式碼的JAR檔案。
  • 執行相對於映象的任意命令。例如,我們可能想執行典型的Unix命令來改變檔案許可權或使用包管理器安裝新的包。
  • 定義建立容器時應該執行的命令。例如,一個java命令可以載入我們的JAR檔案並啟動所需的main方法。

案例:

FROM openjdk:17-alpine
ARG JAR_FILE=target/my-app.jar
COPY ${JAR_FILE} my-app.jar
ENTRYPOINT ["java","-jar","/my-app.jar"]


這個例子基於現有的OpenJDK 17 Alpine映象建立了一個Docker映象。然後,它將一個編譯好的JAR檔案複製到映象中,並將啟動命令定義為帶有-jar選項的java命令以及我們編譯好的JAR檔案。

值得注意的是,Dockerfile只是建立Docker映象的一種方式。其他工具,如Buildpacks,可以幫助我們自動將程式碼編譯成Docker映象的過程,而不需要使用Dockerfiles。

Docker Compose
Docker Compose是一個用於定義和執行多容器Docker應用程式的工具。使用YAML配置檔案,Docker Compose允許我們在一個地方配置多個容器。然後,我們可以用一條命令一次性啟動和停止所有這些容器。

此外,Docker Compose允許我們定義容器共享的共同物件。例如,我們可以一次性定義一個卷,然後把它掛在每個容器裡,這樣它們就可以共享一個共同的檔案系統。或者,我們可以定義一個或多個容器用來通訊的網路。
案例:

version: "3.9"
services:
  database:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"
  web:
    image: my-application:latest
    ports:
      - "80:5000"
volumes:
  db_data: {}


這將啟動兩個容器:一個MySQL資料庫伺服器和一個Web應用程式。它定義了一個由資料庫容器使用的卷。此外,它還定義了每個容器應該暴露哪些埠,以便網路流量可以到達它們。

Dockerfiles和Docker Compose並不相互排斥。事實上,它們在一起工作得相當好。Docker Compose提供了一個構建指令,我們可以在啟動容器之前使用它來構建我們的Dockerfiles。

最後,請記住,Docker Compose只是一個協調多個容器的工具。其他選擇包括Kubernetes、Openshift和Apache Mesos。
 

相關文章