Docker 是一個工具,允許開發人員將他們的應用程式及其所有依賴項打包到一個容器中。然後,這個容器就可以輕鬆地在任何安裝了 Docker 的機器上傳輸和執行,而不必擔心環境的差異。這就像是打包和執行軟體的標準化方式。
容器是什麼?
容器就像一個小包,其中包含程式執行所需的一切,可以輕鬆地在不同電腦上移動和執行,而不會造成任何麻煩。
最酷的部分是這個迷你電腦(容器)就像一個披著斗篷的超級英雄。它可以在任何電腦上執行,無論它們有多麼不同,因為它自帶特殊的環境。這是一種保持軟體井然有序的方式,並確保它無論在哪裡都能以相同的方式運作。
為什麼我們需要 Docker?
一致性: Docker 確保軟體在您的電腦、您朋友的電腦或任何電腦上以相同的方式運作。它使事情保持一致。
可移植性: 您可以將您的軟體及其朋友打包到 Docker 容器中,並且它可以移動到任何地方。這就像將您的遊戲及其所有規則放在手提箱中並在朋友家中玩。
隔離: Docker 容器就像小氣泡。氣泡內發生的事只會留在氣泡內。這意味著容器中的一個程式不會幹擾容器外的另一個程式。
效率: Docker有助於節省電腦資源。您可以讓許多容器在同一台電腦上執行,而不會相互妨礙,而不是讓一整台電腦只用於一個程式。
速度: Docker 讓啟動、停止和共享軟體變得快速、輕鬆。這就像打開和關閉遊戲機一樣 - 快速而簡單。
什麼是 Docker 映像?
Docker 映像像是程式及其運作所需的所有內容的快照。它是一個打包版本,包括程式碼、工具和設置,就像包含所有成分的餅乾食譜的快照一樣。
圖像是配方,容器是當您按照該配方實際製作和執行程序時所得到的。
一些基本的 Docker 命令。
docker執行nginx
docker ps
docker ps -a
`docker stopsilly_sammet'
`docker rmsilly_sammet'
docker 映像
docker rmi nginx
docker拉nginx
docker 執行 ubuntu sleep 5
docker exectracted_mcclintock cat /etc/hosts
docker run -d kodekloud/simple-webapp
docker Attach a043d
一些 Docker 概念:
使用標籤執行:
標籤就像程式的版本。它指定您要執行哪個版本。
範例程式碼:docker run nginx:latest
這將執行最新版本的 Nginx 程式。
使用標準輸入執行:
STDIN 就像在鍵盤上打字一樣。有些程式需要您的輸入。
範例程式碼:docker run -i -t ubuntu
這會在 Ubuntu 容器內執行互動終端,讓您可以鍵入命令。
使用連接埠映射執行:
連接埠就像門。程式使用它們與外界進行通訊。
範例程式碼:docker run -p 8080:80 nginx
這將執行 Nginx,並打開電腦連接埠 8080 上的門,將其連接到容器的連接埠 80。
使用磁碟區映射執行:
磁碟區就像共用資料夾。它們讓您可以將東西存放在容器之外。
範例程式碼:docker run -v /your/local/folder:/container/folder nginx
這將執行 Nginx 並將電腦上的資料夾連接到容器內的資料夾。
檢查容器:
檢查就像仔細檢查正在執行的程式。
範例程式碼:docker檢查container_name
這為您提供有關正在執行或已停止的容器的詳細資訊。
容器日誌:
日誌就像日記。他們記錄程式正在做什麼。
範例程式碼:“docker 日誌容器名稱”
這會向您顯示特定容器的日誌或活動。
環境變數就像程式用來尋找重要資訊的便利筆記,有點像是程式可以理解和更好工作的秘密訊息!
Python腳本(app.py)中的環境變數:
假設您有一個用 Python 寫的程式 (app.py)。您可能想要在不更改程式碼的情況下自訂它。您可以使用環境變數。
範例程式碼(app.py):
import os
app_color = os.getenv("APP_COLOR", "default_color")
print(f"The app color is {app_color}")
正常運作腳本:python app.py
以特定顏色執行:export APP_COLOR=blue; python 應用程式.py
在 Docker 中使用 ENV 變數:
Docker 容器也可以使用環境變數。這就像是向容器內的程式發出指令。
範例程式碼:
docker run -e APP_COLOR=green simple-webapp-color
這會執行 Docker 容器(simple-webapp-color
)並將環境變數 APP_COLOR
設為「綠色」。
檢查環境變數:
有時,您會想要檢查正在執行的容器正在使用哪些環境變數。
範例程式碼:docker檢查blissful_hopper
此命令提供有關名為“blissful_hopper”的容器的詳細訊息,包括其環境變數。
簡單來說,環境變數就像程式(或 Docker 容器)可以讀取以了解如何行為的小註釋。您可以在執行程式之前設定這些註釋,程式將使用它們來自訂自身。第二個範例中的「export」指令就像在執行程式之前寫一條註釋,告訴它如何運作。 “docker Inspect”指令就像是在容器內部查看它有什麼註解。
Docker 檔案:
Dockerfile 就像是 Docker 建立映像的一組指令。這就像是烤蛋糕的食譜。
# Use the Ubuntu base image
FROM Ubuntu
# Update apt repository
RUN apt-get update
# Install dependencies using apt
RUN apt-get install -y python
# Install Python dependencies using pip
RUN pip install flask
RUN pip install flask-mysql
# Copy source code to /opt folder
COPY . /opt/source-code
# Set the working directory
WORKDIR /opt/source-code
# Specify entry point to run the web server
ENTRYPOINT ["flask", "run"]
建立自己的圖像的步驟:
使用上述內容建立一個名為「Dockerfile」的檔案。
將其保存在與原始碼相同的目錄中。
建置 Docker 映像:
在終端機中執行以下命令:
docker build -t your-image-name .
此命令告訴 Docker 使用目前目錄中的 Dockerfile (.
) 建置映像,並使用您選擇的名稱對其進行標記 (-t your-image-name
)。
分層架構:
將 Docker 映像視為一個分層蛋糕。 Dockerfile 中的每個指令都會在映像上新增一層。
圖層可重複使用。如果您變更程式碼中的某些內容,Docker 只會重建受影響的層,從而提高效率。
Docker 建置輸出:
你可以容器化什麼?
幾乎所有東西!應用程式、服務、資料庫、網站,基本上任何軟體都可以容器化。
這就像將您的軟體放入一個盒子中,以便它可以在任何地方執行而不會造成麻煩。
Docker 中的CMD
:
將 CMD 視為啟動容器時程式執行的預設操作。
這就像說,“嘿,當你執行這個容器時,默認執行此操作。”
範例:CMD ["flask", "run"]
表示當容器啟動時,它會自動執行 Flask Web 伺服器。
CMD 範例:
FROM alpine
CMD ["sleep", "5"]
在此範例中,當您使用此映像執行容器時,它會自動休眠 5 秒。
Docker 中的ENTRYPOINT
:
將 ENTRYPOINT 視為容器所做的主要事情。就好像boss的命令一樣。
它設定一個預設應用程式在容器啟動時執行,但您仍然可以根據需要覆蓋它。
範例:ENTRYPOINT ["flask", "run"]
表示容器主要用於執行 Flask Web 伺服器,但如果需要,您仍可新增更多指令。
入口點範例:
FROM alpine
ENTRYPOINT ["sleep"]
CMD ["5"]
在這裡,主要目的是睡眠,如果您願意,您仍然可以覆蓋睡眠持續時間。
在這兩種情況下,容器在啟動時只會休眠幾秒鐘。主要區別在於如何提供參數以及它們是否可以輕鬆覆蓋。
CMD 就像在說,“這是默認要做的事情”,而 ENTRYPOINT 就像在說,“這是主要要做的事情,但如果你願意,你可以稍微調整一下。”它們都有助於定義容器啟動時執行的操作。
Docker 網路幫助容器(程式)相互通信,確保它們可以順利地協同工作。
預設網路:
Docker 建立預設網路供容器通訊。
範例程式碼:docker run ubuntu --network=host
使用者定義的網路:
您可以建立自己的網路以更好地組織和控制。
範例程式碼:
docker network create --driver=bridge --subnet=182.18.0.0/16 custom-isolated-network
上市網路:
您可以查看您擁有的所有網路。
範例程式碼:docker network ls
檢查網路:
您可以檢查特定網路的詳細資訊。
範例程式碼:docker網路檢查blissful_hopper
嵌入式 DNS:
Docker 有一個內建的 DNS 系統,供容器透過名稱相互查找。
範例程式碼:mysql.connect(mysql)
Docker 儲存就像使用容器時決定將資料保存在哪裡一樣。您可以將它們保留在容器內,使用磁碟區在容器之間共用它們,或將它們儲存在容器外部以妥善保管。
Docker中的檔案系統:
Docker 使用分層架構來建立映像。 Dockerfile 中的每個指令都會在檔案系統中新增一個新圖層。
# Dockerfile
FROM Ubuntu
RUN apt-get update && apt-get install -y python
RUN pip install flask flask-mysql
COPY . /opt/source-code
WORKDIR /opt/source-code
ENTRYPOINT ["flask", "run"]
Dockerfile 中的層:
第 1 層:Ubuntu 基礎層
第 2 層:apt 軟體包的更改
第 3 層:pip 套件的變化
第 4 層:原始碼
第 5 層:使用「flask」指令更新入口點
第 6 層:容器層
影像圖層:
當您建立 Docker 映像時,它由唯讀層組成。每一層代表影像的變化或加入。
第 1 層:Ubuntu 基礎層
第 2 層:apt 軟體包的更改
第 3 層:pip 套件的變化
第 4 層:原始碼
第 5 層:使用「flask」指令更新入口點
# Build the Docker image
docker build -t mmumshad/my-custom-app .
容器層:
當您執行 Docker 容器時,會在唯讀映像層上方新增一個讀寫層。該層特定於正在執行的容器。
# Run the Docker container
docker run mmumshad/my-custom-app
數量:
# Create a Docker volume
docker volume create data_volume
# Use the volume in a container
docker run -v data_volume:/var/mysql mysql
# Mount a host directory to a container directory
docker run -v /path/on/host:/var/mysql/mysql -d mysql
docker run --mount type=bind,source=/mysql,target=/var/mysql mysql
儲存驅動程式:
Docker Compose 是一個方便的工具,可幫助您輕鬆執行和連接不同的軟體服務,就好像它們都是同一事件的一部分一樣。
Docker Compose 基礎:
執行單一容器:
docker run mmumshad/simple-webapp
docker run mongodb
docker run redis:alpine
docker run ansible
Docker 撰寫文件(docker-compose.yml
):
Docker Compose 允許您在一個簡單的檔案中定義所有這些服務:
# docker-compose.yml
version: '3'
services:
web:
image: 'mmumshad/simple-webapp'
database:
image: 'mongodb'
messaging:
image: 'redis:alpine'
orchestration:
image: 'ansible'
此檔案描述您要執行的服務(「web」、「database」、「messaging」、「orchestration」)、它們各自的映像以及任何其他配置。
使用 Docker Compose 執行:
要一起啟動所有這些服務:
docker-compose up
Docker Compose 負責啟動「docker-compose.yml」檔案中定義的所有容器。
使用 Docker Compose 建置:
您也可以使用 Docker Compose 建置映像:
docker-compose build
此指令建置「docker-compose.yml」檔案中指定的映像。
執行連結容器:
如果您要透過連結執行單一容器:
docker run -d --name redis redis
docker run --name voting-app -p 5000:80 --link redis:redis voting-app
docker run --name result-app -p 5001:80 --link db:db result-app
docker run -d --name worker --link db:db --link redis:redis worker
在 Docker 中撰寫:
# docker-compose.yml
version: '3'
services:
vote:
image: 'voting-app'
ports:
- '5000:80'
links:
- 'redis:redis'
result:
image: 'result-app'
ports:
- '5001:80'
links:
- 'db:db'
worker:
image: 'worker'
links:
- 'db:db'
- 'redis:redis'
db:
image: 'db'
redis:
image: 'redis'
Docker Compose 可讓您在單一檔案中描述整個應用程式堆疊,從而輕鬆管理、執行和連接不同的服務。這就像在一份計劃中寫下活動的所有任務,然後 Docker Compose 為您處理設定。
Docker 註冊表是人們儲存和分享 Docker 映像的地方,使其他人可以輕鬆使用和執行他們的軟體。它就像一個大型線上程式庫,可以輕鬆下載並在不同電腦上使用。
Docker 註冊表基礎知識:
公共登記處:
Docker 映像可以在 Docker Hub 等公共註冊表中儲存和共用。
例:
docker pull nginx
私人登記處:
有時,您可能希望將圖像保存在您自己的私人註冊表中。
例:
bash
docker login private-registry.io
- 從私有註冊表中的映像執行容器:
docker run private-registry.io/apps/internal-app
部署您自己的私有註冊表:
您可以為您的團隊或公司部署自己的私人註冊表。
例:
在您的電腦上執行私有註冊表:
docker run -d -p 5000:5000 --name registry registry:2
為私人註冊表標記您的圖像:
bash
docker image tag my-image localhost:5000/my-image
將映像推送到您的私人註冊表:
bash
docker push localhost:5000/my-image
從您的私人註冊表中提取映像:
bash
docker pull localhost:5000/my-image
從遠端私有註冊表中提取:
您也可以使用 IP 位址或網域從遠端私有註冊表中提取映像。
例:
docker pull 192.168.56.100:5000/my-image
Docker 註冊表就像一個儲存空間,人們在其中保存和共享 Docker 映像。您可以將公用註冊表用於廣泛使用的映像,也可以根據您的特定需求設定自己的私人註冊表。它就像一個用於共享和儲存軟體藍圖(圖像)的特殊庫。
想像一下,你有一個魔盒(Docker Engine),可以為你執行和管理各種程式(容器)。 Docker Engine 就像是這個魔盒的大腦。
Docker 守護程式:
REST API:
Docker CLI(命令列介面):
連線到遠端 Docker 引擎:
連接到遠端 Docker 引擎可讓您控制另一台機器上的容器,且設定約束可確保容器僅使用指定的資源。
Docker主機IP:
您可以使用 IP 位址和連接埠連接到不同電腦上的 Docker 引擎。
例:
docker -H=remote-docker-engine:2375 run nginx
這告訴您的本機 Docker CLI 與遠端 Docker 引擎進行通訊。
有約束地執行容器:
Docker 允許您設定容器的資源限制,例如 CPU 和記憶體限制。
例:
docker run --cpus=0.5 ubuntu
docker run --memory=100m ubuntu
這些指令限制容器僅使用半個 CPU 核心和 100 MB 記憶體。
當然,讓我們簡化一下PID命名空間的概念:
命名空間PID:
PID 命名空間可讓您為容器中的進程(如程式或任務)建立單獨的區域,因此它們有自己的一組「票號」(進程 ID),不會與容器外的進程發生衝突。
範例程式碼:
使用主機 PID 命名空間執行容器:
docker run --pid=host ubuntu
執行具有隔離 PID 命名空間的容器:
docker run --pid=container ubuntu
在第一個範例中,容器與進程交互,就好像它與主機位於同一空間中一樣。在第二個範例中,容器有自己的進程隔離空間。這就像在大型活動中擁有一個私人區域,您的團隊有自己的一套票號,讓您可以獨立於活動的其餘部分進行操作。
容器化概念:
進程 ID 命名空間:
容器有自己獨立的流程 ID (PID) 空間,因此容器內的流程與容器外的流程是分開的。
例:
docker run --pid=host ubuntu
網路命名空間:
容器也有自己獨立的網路命名空間,這意味著它們可以有自己的網路配置。
例:
docker run --net=host nginx
Unix分時命名空間:
此命名空間允許容器擁有自己的時間視圖,與主機和其他容器分開。
例:
docker run --uts=host ubuntu
進程間掛載命名空間:
Mount命名空間隔離檔案系統,讓容器擁有自己的檔案系統視圖。
例:
docker run --mount=type=bind,source=/host/folder,target=/container/folder ubuntu
當然!我們來簡化一下cgroup的概念:
C組:
cgroup(控制組的縮寫)可協助在不同進程或容器之間管理和分配系統資源,例如 CPU 和記憶體。它們確保沒有任何一個進程或容器耗盡所有可用資源,從而保持一切平衡。
範例程式碼:
使用 Cgroup 設定 CPU 限制:
這就像說聚會上的每位客人只能吃一定數量的食物。
docker run --cpus=0.5 ubuntu
這限制容器僅使用一半的 CPU 核心。
使用 Cgroup 設定記憶體限制:
這就像說每位客人只能在舞池上佔據一定的空間。
docker run --memory=100m ubuntu
這限制容器僅使用 100 MB 記憶體。
Linux 容器(預設):
Linux 容器是一種打包和執行軟體及其所需一切的方法,它們最適合執行 Linux 的電腦。
Windows 容器:
Windows 容器是一種打包和執行軟體的方式,就像 Linux 容器一樣,但它們設計用於執行 Windows 的電腦。
Windows 容器基礎:
集裝箱類型:
Windows 容器有兩種主要類型:Windows Server Core 和 Nano Server。
Windows Server Core: 將其視為功能更齊全的容器,適合各種應用程式。
Nano Server: 將其視為一個輕量級容器,專為特定的、簡約的用例而設計。
基礎鏡像:
基礎映像就像是建立容器時開始使用的空白畫布。
例:
docker pull mcr.microsoft.com/windows/servercore:ltsc2019
此指令擷取 Windows Server Core 基礎映像。
例:
docker pull mcr.microsoft.com/windows/nanoserver:ltsc2019
此命令提取 Nano Server 基礎映像。
支援的環境:
Windows 容器可以在特定版本的 Windows 作業系統上運作。
例:
您可以在 Windows Server 2016 上執行 Windows 容器。
例:
您可以在 Windows 10 專業版和企業版上執行 Windows 容器,並使用 Hyper-V 隔離容器進行額外隔離。
容器編排是一種管理和協調多個容器的方法,確保它們無縫協作來執行應用程式,就像一個超級智能的管理器確保所有機器人一起工作來建置完美的塔一樣。
為什麼要編曲?
多項任務,一名經理:
一致性:
效率:
縮放比例:
可靠性:
協調:
容器編排程式碼:
# Create a Docker service with 100 replicas (instances) of a Node.js application
docker service create --replicas 100 --name my-nodejs-app nodejs
在這個例子中:
docker service create
:該指令告訴 Docker 建立一個服務,該服務是一組正在執行的容器。
--replicas 100
:此標誌指定您需要 100 個服務實例(副本)。
--name my-nodejs-app
:此標誌為您的服務提供名稱,在本例中為「my-nodejs-app」。
nodejs
:這是 Node.js 應用程式的圖片或配方。這就像是烘焙紙杯蛋糕的藍圖。
因此,這段簡單的程式碼就像告訴您神奇的廚師助手 (Docker Swarm) 建立 Node.js 應用程式的 100 個副本,確保您有大量容器正在執行並準備好提供服務。
Docker Swarm 是一個工具,可以幫助協調和管理一組電腦(節點)作為一個機器人團隊一起工作,使它們能夠以協調的方式部署和執行多個容器。這就像有一個首席機器人經理,確保所有單一機器人一起建造出偉大而令人驚嘆的東西。
設定 Docker Swarm:
群組管理器:
# Initiate Docker Swarm on the Swarm Manager
docker swarm init
節點工作人員:
# Join a Node Worker to the Docker Swarm
docker swarm join --token <token> <Swarm Manager IP>
Docker Swarm 服務:
現在您已經有了一個協調的團隊,您想要建立一項服務,例如與您的機器人團隊一起建造塔:
# Create a Docker service (a group of containers) with 3 replicas (instances)
docker service create --replicas 3 --network frontend --name my-web-server my-web-image
--replicas 3
:此標誌告訴 Docker 建立服務的三個實例(副本)。
--network frontend
:此標誌指定您的服務屬於名為「frontend」的網路。
--name my-web-server
:這會為您的服務命名,在本例中為「my-web-server」。
my-web-image
:這是您的網頁伺服器的圖片或藍圖。這就像建造塔樓的配方。
您建立了一個由隊長(Swarm Manager)和工作機器人(Node Workers)組成的機器人團隊。然後,您指示他們建立一個執行您的 Web 伺服器應用程式的服務(容器群組)。主機器人確保建立 Web 伺服器的三個副本並將其連接到「前端」網路。這就像有一個首席機器人經理在工作機器人的幫助下監督多個塔(貨櫃)的建造。
好的,這就是本文的內容。
另外,如果您對此或其他任何問題有任何疑問,請隨時在下面的評論中或在 Instagram 、Facebook 或Twitter。
感謝您閱讀這篇文章,我們下一篇再見! ❤️
原文出處:https://dev.to/abhixsh/docker-for-the-absolute-beginner-3h1p