容器鏡像是可執行的軟體包,包括運行應用程式所需的所有內容:代碼、運行時、系統工具、庫和設置。通過構建自定義鏡像,您可以在任何支持Docker的平臺上無縫地部署應用程式及其所有依賴項。 ### Dockerfile 構建容器鏡像的關鍵組件是 **`Dockerfile`**。它本質上是一個包含有關如何 ...
容器鏡像是可執行的軟體包,包括運行應用程式所需的所有內容:代碼、運行時、系統工具、庫和設置。通過構建自定義鏡像,您可以在任何支持Docker的平臺上無縫地部署應用程式及其所有依賴項。
Dockerfile
構建容器鏡像的關鍵組件是 Dockerfile
。它本質上是一個包含有關如何組裝 Docker 鏡像的說明的腳本。Dockerfile 中的每個指令都會在鏡像中創建一個新層,從而更容易跟蹤更改並最小化鏡像大小。以下是 Dockerfile 的簡單示例:
# Use an official Python runtime as a parent image
FROM python:3.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
構建鏡像
創建 Dockerfile 後,您可以使用 docker build
命令構建鏡像。在包含 Dockerfile 的目錄中的終端中執行以下命令:
docker build -t your-image-name .
此命令告訴 Docker 使用當前目錄中的 Dockerfile(.
)構建鏡像,併為其指定名稱(-t your-image-name
)。
檢查鏡像和層
成功構建後,您可以使用 docker image
命令檢查創建的鏡像:
docker image ls
要更仔細地查看鏡像的各個層,請使用 docker history
命令:
docker history your-image-name
要查看鏡像的層,也可以使用 docker inspect
命令:
docker inspect your-image-name
要刪除鏡像,請使用 docker image rm
命令:
docker image rm your-image-name
將鏡像推送到註冊表
構建鏡像後,您可以將其推送到容器註冊表(例如Docker Hub、Google Container Registry等),以輕鬆分發和部署應用程式。首先使用您的憑據登錄註冊表:
docker login
然後,使用註冊表 URL 標記您的鏡像:
docker tag your-image-name username/repository:tag
最後,將已標記的鏡像推送到註冊表:
docker push username/repository:tag
構建容器鏡像是使用 Docker 的重要方面,它使您可以輕鬆打包和部署應用程式。通過創建具有精確指令的 Dockerfile,您可以輕鬆地構建和分發各種平臺的鏡像。
高效的層緩存
在構建容器鏡像時,Docker會緩存新創建的層。這些層可以在構建其他鏡像時重覆使用,減少構建時間並最小化帶寬使用。但是,要充分利用這種緩存機制,您需要瞭解如何有效地使用層緩存。
Docker層緩存的工作原理
Docker為Dockerfile中的每個指令(例如RUN
、COPY
、ADD
等)創建一個新層。如果指令自上次構建以來沒有更改,Docker將重用現有的層。
例如,考慮以下Dockerfile:
FROM node:14WORKDIR /appCOPY package.json /app/RUN npm installCOPY . /app/CMD ["npm", "start"]
第一次構建鏡像時,Docker將執行每個指令併為每個指令創建一個新層。如果對應用程式進行了一些更改並再次構建鏡像,Docker將檢查更改的指令是否影響任何層。如果沒有任何層受到更改的影響,Docker將重用緩存的層。
有效使用層緩存的技巧
- 最小化Dockerfile中的更改: 儘量減少Dockerfile中更改的頻率,並以使最常更改的行出現在底部的方式構造指令。
- 構建上下文優化: 使用**
.dockerignore
*文件從構建上下文中排除不必要的文件,這些文件可能會導致緩存失效。 - 使用較小的基礎鏡像: 較小的基礎鏡像減少拉取基礎鏡像所需的時間以及需要緩存的層數。
- 利用Docker的-cachefrom標誌: 如果您正在使用CI / CD流水線,則可以指定要用作緩存源的鏡像。
- 組合多個指令: 在某些情況下,組合指令(例如**
RUN
*)可以幫助最小化層數,使緩存更有效。
遵循這些最佳實踐,您可以優化層緩存過程並減少Docker鏡像的構建時間,從而使您的開發和部署過程更加高效。
鏡像大小和安全性
在構建容器鏡像時,瞭解鏡像大小和安全性非常重要。鏡像的大小會影響容器的構建和部署速度。較小的鏡像可以提高構建速度,並減少下載鏡像時的網路開銷。安全性也非常重要,因為容器鏡像可能包含漏洞,這可能會對您的應用程式造成風險。
減小鏡像大小
- 使用適當的基礎鏡像:選擇一個更小、更輕量級的基礎鏡像,僅包含應用程式所需的必要組件。例如,如果可用,請考慮使用官方鏡像的“alpine”變數,因為它通常比較小。
FROM node:14-alpine
- 在單個“RUN”語句中運行多個命令:每個“RUN”語句都會在鏡像中創建一個新的層,這會增加鏡像的大小。使用“&&”將多個命令組合到單個“RUN”語句中,以最小化層數並減小最終鏡像大小。
RUN apt-get update && \\\\ apt-get install -y some-required-package
- 在同一層中刪除不必要的文件:在鏡像構建過程中安裝軟體包或添加文件時,可以在同一層中刪除臨時或未使用的文件,以減小最終鏡像大小。
RUN apt-get update && \\\\ apt-get install -y some-required-package && \\\\ apt-get clean && \\\\ rm -rf /var/lib/apt/lists/*
- 使用多階段構建:使用多階段構建創建更小的鏡像。多階段構建允許您在 Dockerfile 中使用多個“FROM”語句。每個“FROM”語句在構建過程中創建一個新的階段。您可以使用“COPY --from”語句將文件從一個階段複製到另一個階段。
FROM node:14-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:14-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY package*.json ./
RUN npm install --production
CMD ["npm", "start"]
- 使用“.dockerignore”文件:使用“.dockerignore”文件從構建上下文中排除不必要的文件,這些文件可能會導致緩存失效並增加最終鏡像大小。
node_modules
npm-debug.log
提高安全性
- 保持基礎鏡像更新:定期更新您在 Dockerfile 中使用的基礎鏡像,以確保它們包括最新的安全補丁。
- 避免使用 root 運行容器:始終在運行容器時使用非 root 用戶,以最小化潛在風險。在運行應用程式之前,創建一個用戶並切換到該用戶。
RUN addgroup -g 1000 appuser && \\\\ adduser -u 1000 -G appuser -D appuser
USER appuser
- 限制“COPY”或“ADD”指令的範圍:具體說明要複製到容器鏡像中的文件或目錄。避免使用“COPY . .”,因為它可能會意外包含敏感文件。
COPY package*.json ./
COPY src/ src/
- 掃描鏡像以查找漏洞:使用 Anchore 或 Clair 等工具掃描您的鏡像以查找漏洞,併在部署之前修複它們。
遵循這些最佳實踐,您將能夠構建更高效和安全的容器鏡像,從而提高性能並降低應用程式中漏洞的風險。
最後
為了方便其他設備和平臺的小伙伴觀看往期文章,鏈接奉上:
公眾號 Let us Coding
,牛客,知乎,開源中國,CSDN,思否,掘金,InfoQ,簡書,博客園,慕課,51CTO,helloworld,騰訊開發者社區,阿裡開發者社區
看完如果覺得有幫助,歡迎點贊、收藏和關註