中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

哪個網(wǎng)站 的域名最便宜seo推廣外包企業(yè)

哪個網(wǎng)站 的域名最便宜,seo推廣外包企業(yè),wordpress上傳文件按標題,抖音代運營最靠譜的公司制品構(gòu)建與管理 - Docker 鏡像的最佳實踐 為何使用容器?SRE 的視角 對于 SRE 來說,擁抱容器化(以 Docker 為代表)不僅僅是追趕技術(shù)潮流,更是因為它直接解決了運維中的許多核心痛點,并支撐了 SRE 的核心原則…

制品構(gòu)建與管理 - Docker 鏡像的最佳實踐


為何使用容器?SRE 的視角

對于 SRE 來說,擁抱容器化(以 Docker 為代表)不僅僅是追趕技術(shù)潮流,更是因為它直接解決了運維中的許多核心痛點,并支撐了 SRE 的核心原則:

  • 環(huán)境一致性 (Environment Consistency):容器將應用程序代碼、運行時(如 Node.js)、系統(tǒng)工具、庫和配置全部打包在一起。這個鏡像在開發(fā)人員的筆記本、測試服務器和生產(chǎn)集群上運行時,其內(nèi)部環(huán)境是完全一致的,從根本上消除了“環(huán)境不一致”導致的問題。
  • 不可變基礎(chǔ)設施 (Immutable Infrastructure):我們不應該登錄到正在運行的容器中去修改它(這是可變操作)。正確的做法是:構(gòu)建一個包含新代碼或配置的新鏡像,然后用新鏡像創(chuàng)建的容器去替換舊的容器。這種“替換而非修改”的模式使得部署過程更可預測、更可靠,回滾也變得異常簡單——只需重新部署上一個版本的鏡像即可。
  • 依賴項隔離 (Dependency Isolation):應用的所有依賴都封裝在鏡像內(nèi)部,不會與宿主機或其他容器的依賴產(chǎn)生沖突。
  • 可移植性 (Portability):一個容器鏡像可以在任何安裝了容器運行時(如 Docker, containerd)的機器上運行,無論是物理機、虛擬機還是云實例。
  • 可擴展性 (Scalability):容器非常輕量,啟動速度快,這使得在 Kubernetes 這樣的編排平臺上快速擴縮容應用實例變得輕而易舉。

編寫 Dockerfile:從基礎(chǔ)到最佳實踐

Dockerfile 是一個文本文件,它包含了一系列指令,用于告訴 Docker 如何構(gòu)建一個鏡像。讓我們從一個簡單、直觀但不推薦的 Dockerfile 開始,然后逐步優(yōu)化它。

一個“天真”的 Dockerfile (Dockerfile.bad)

很多人剛開始可能會這么寫:

# Dockerfile.bad - 不推薦的寫法
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD [ "node", "app.js" ]

這個 Dockerfile 能工作,但存在幾個嚴重的問題:

  1. 鏡像體積過大:
    • node:18 是一個包含完整操作系統(tǒng)的基礎(chǔ)鏡像,體積龐大。
    • COPY . . 會將當前目錄下的所有文件(包括 node_modules.git 文件夾、README.md、Dockerfile 本身等)都拷貝到鏡像中,造成不必要的臃腫。
    • RUN npm install 會安裝 package.json 中所有的依賴,包括只在開發(fā)和測試時才需要的 devDependencies。
  2. 構(gòu)建緩存效率低下:
    • Docker 構(gòu)建是分層的。COPY . . 這一步,只要我們修改了任何一個源代碼文件,這一層的緩存就會失效。
    • 由于 RUN npm installCOPY . . 之后,代碼的任何微小改動都會導致 npm install 這一步被重新執(zhí)行,即使 package.json 文件根本沒有變化。這會極大地拖慢構(gòu)建速度。
  3. 安全風險:
    • 默認情況下,容器內(nèi)的進程是以 root 用戶身份運行的,這帶來了不必要的安全風險。
    • devDependencies 和完整的源代碼(可能包含測試文件等)打包到最終的生產(chǎn)鏡像中,增大了攻擊面。
最佳實踐:優(yōu)化的 Dockerfile

現(xiàn)在,讓我們運用最佳實踐來重寫它。請在你的項目根目錄下創(chuàng)建這個 Dockerfile 文件:

# Dockerfile# --- 階段 1: 基礎(chǔ)構(gòu)建環(huán)境 ---
# 使用一個更小的、官方的 slim 版本作為基礎(chǔ)鏡像
FROM node:18-slim AS base# 設置工作目錄
WORKDIR /app# 優(yōu)化緩存:先只拷貝 package.json 和 package-lock.json
COPY package.json package-lock.json ./# 運行 npm ci,它會嚴格按照 package-lock.json 安裝所有依賴(包括 devDependencies)
# 這一層只有在 package-lock.json 變化時才會重新構(gòu)建
RUN npm ci# 拷貝所有源代碼
COPY . .# --- 階段 2: 生產(chǎn)環(huán)境 ---
# 從一個干凈的、相同版本的 slim 鏡像開始,而不是在 base 階段的基礎(chǔ)上繼續(xù)
FROM node:18-slim AS productionWORKDIR /app# 從 'base' 階段拷貝已經(jīng)安裝好的生產(chǎn)依賴
# `--production` 標志確保只拷貝 dependencies,不包括 devDependencies
COPY --from=base /app/node_modules ./node_modules
# 拷貝應用代碼和 package.json
COPY app.js .
COPY package.json .# 安全實踐:創(chuàng)建一個非 root 用戶并切換到該用戶
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 appuser
USER appuser# 暴露端口
EXPOSE 3000# 定義容器啟動命令
CMD [ "node", "app.js" ]

同時,在項目根目錄下創(chuàng)建一個 .dockerignore 文件,告訴 Docker 在構(gòu)建時忽略哪些文件:

.dockerignore
node_modules
npm-debug.log
Dockerfile*
.dockerignore
.git
.gitignore
README.md
.github

這個優(yōu)化后的 Dockerfile 體現(xiàn)了幾個關(guān)鍵的最佳實踐:

  • 多階段構(gòu)建 (Multi-stage Builds):我們定義了 baseproduction 兩個階段。base 階段用于安裝所有依賴并運行測試(如果需要)。production 階段則從一個全新的干凈鏡像開始,只從 base 階段拷貝運行應用所必需的東西(生產(chǎn)依賴和應用代碼),最終得到的生產(chǎn)鏡像是最小化的。
  • 使用小體積的基礎(chǔ)鏡像 (node:18-slim): slim 版本比默認版本小得多,減少了鏡像體積和潛在的漏洞。
  • 利用構(gòu)建緩存: 將 COPY package*.json ./RUN npm ci 這兩個步驟放在 COPY . . 之前。這樣,只要 package-lock.json 文件不改變,耗時的依賴安裝層就會被緩存,只有在代碼變化時才需要重新執(zhí)行后續(xù)的 COPY 操作。
  • 使用 .dockerignore: 防止不必要的文件被發(fā)送到 Docker 守護進程,減小構(gòu)建上下文,避免敏感信息泄露。
  • 以非 root 用戶運行: 創(chuàng)建一個專用的、無特權(quán)的用戶來運行應用,這是重要的安全加固措施。

4. 集成到 CI/CD 流水線

現(xiàn)在,我們的目標是在上一篇的 CI 流水線基礎(chǔ)上,增加一個新任務 (Job):當代碼測試通過并且變更被合并到 main 分支后,自動構(gòu)建這個優(yōu)化后的 Docker 鏡像,并將其推送到 GitHub Container Registry (GHCR)——一個與 GitHub 倉庫集成的容器鏡像倉庫。

修改 .github/workflows/ci.yml 文件如下:

# .github/workflows/ci.yml
name: Node.js CI/CDon:push:branches: [ "main" ]pull_request:branches: [ "main" ]# 為整個工作流定義環(huán)境變量,方便復用
env:REGISTRY: ghcr.io# 鏡像名稱將是 ghcr.io/你的用戶名/你的倉庫名IMAGE_NAME: ${{ github.repository }}jobs:# 第一個任務:構(gòu)建和測試,與上一篇基本相同build-and-test:runs-on: ubuntu-lateststeps:- name: Checkout repositoryuses: actions/checkout@v4- name: Use Node.js 18.xuses: actions/setup-node@v4with:node-version: '18.x'cache: 'npm'- name: Install dependenciesrun: npm ci- name: Run linterrun: npm run lint- name: Run testsrun: npm test# 新增的第二個任務:構(gòu)建并推送 Docker 鏡像build-and-push-image:# `needs` 關(guān)鍵字確保此任務必須在 `build-and-test` 成功后才運行needs: build-and-test# `if` 條件確保此任務只在 push 到 main 分支時運行,而不是在 pull request 時if: github.event_name == 'push' && github.ref == 'refs/heads/main'runs-on: ubuntu-latest# `permissions` 塊用于授予 GITHUB_TOKEN 額外的權(quán)限# `packages: write` 允許工作流向 GHCR 推送鏡像permissions:contents: readpackages: writesteps:- name: Checkout repositoryuses: actions/checkout@v4# 使用官方的 docker/login-action 動作登錄到 GHCR- name: Log in to the GitHub Container Registryuses: docker/login-action@v3with:registry: ${{ env.REGISTRY }}username: ${{ github.actor }} # github.actor 是觸發(fā)工作流的用戶名password: ${{ secrets.GITHUB_TOKEN }} # GITHUB_TOKEN 是 GitHub Actions 自動生成的臨時令牌# 使用 docker/metadata-action 動作來自動提取鏡像的元數(shù)據(jù),如標簽- name: Extract metadata (tags, labels) for Dockerid: metauses: docker/metadata-action@v5with:images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}# 使用 docker/build-push-action 動作來構(gòu)建并推送鏡像- name: Build and push Docker imageid: build-and-pushuses: docker/build-push-action@v5with:context: . # 使用當前目錄作為構(gòu)建上下文push: true # 明確指示要推送鏡像tags: ${{ steps.meta.outputs.tags }} # 使用 metadata-action 生成的標簽labels: ${{ steps.meta.outputs.labels }}# 啟用 GitHub Actions 的構(gòu)建緩存,加快后續(xù)構(gòu)建速度cache-from: type=ghacache-to: type=gha,mode=max

5. 驗證結(jié)果

  1. 將新的 Dockerfile.dockerignore 以及更新后的 ci.yml 文件提交并推送到你的 GitHub 倉庫的 main 分支。
  2. 進入倉庫的 “Actions” 頁面,觀察工作流的運行。你會看到 build-and-test 任務成功后,build-and-push-image 任務開始執(zhí)行。
  3. 當整個工作流成功運行后,回到你的 GitHub 倉庫主頁。在右側(cè)邊欄,找到并點擊 “Packages”。
  4. 在這里,你應該能看到一個與你的倉庫同名的 Package,點擊進入后就能看到剛剛被推送上來的 Docker 鏡像及其標簽(例如 latest 和一個基于 Git SHA 的標簽)。

SRE 視角的思考

通過今天的實踐,我們?nèi)〉昧司薮蟮倪M步:

  • 制品管理 (Artifact Management):我們不再僅僅是驗證代碼,而是產(chǎn)出了一個版本化的、不可變的、標準化的軟件制品(Docker 鏡像),并將其存儲在了一個中心的制品庫 (GHCR) 中。這是實現(xiàn)可靠部署的前提。
  • 可復現(xiàn)性 (Reproducibility):任何人或任何自動化系統(tǒng),只要拉取特定標簽(如 Git SHA 標簽)的鏡像,就能獲得一個完全相同的、經(jīng)過測試的運行時環(huán)境。
  • 安全加固: 通過優(yōu)化的 Dockerfile,我們顯著減小了生產(chǎn)鏡像的體積和攻擊面。
  • 效率: 多階段構(gòu)建和 CI 緩存的運用,確保了我們的自動化流程在保證質(zhì)量的同時,也保持了高效。

總結(jié)

今天,我們掌握了為何容器化對 SRE 至關(guān)重要,并深入實踐了如何編寫一個遵循最佳實踐的 Dockerfile。更重要的是,我們成功地將自動化的鏡像構(gòu)建與推送流程無縫地集成到了我們的 CI 流水線中。

現(xiàn)在,我們有了一個經(jīng)過測試、版本化、并安全存儲的軟件制品。它已經(jīng)整裝待發(fā),準備被部署到真實的運行環(huán)境中。

在下一篇中,我們將邁出從 CI 到 CD 的關(guān)鍵一步:我們將學習如何讓流水線自動地將這個鏡像部署到一個 Kubernetes 集群中,真正打通從代碼提交到應用在云原生環(huán)境中運行的“最后一公里”。敬請期待!

http://www.risenshineclean.com/news/34681.html

相關(guān)文章:

  • 模板網(wǎng)站 可以做推廣嗎如何優(yōu)化搜索引擎
  • 招聘網(wǎng)站上怎么做推廣青島網(wǎng)站建設公司電話
  • 什么網(wǎng)站做外貿(mào)最好推廣平臺有哪些
  • 大石橋網(wǎng)站建設百度關(guān)鍵字優(yōu)化價格
  • javaweb做新聞網(wǎng)站北京百度推廣電話號碼
  • 室內(nèi)環(huán)保網(wǎng)站模板代碼seo網(wǎng)站優(yōu)化培訓怎么做
  • 做的好微信商城網(wǎng)站嗎seo顧問服務四川
  • 福田做棋牌網(wǎng)站建設哪家公司便宜信息發(fā)布平臺推廣
  • 制作精美網(wǎng)站建設售后完善信息流廣告代運營
  • 天津做網(wǎng)站的公司營銷網(wǎng)絡推廣哪家好
  • 手機網(wǎng)站模板開發(fā)工具seo網(wǎng)絡營銷推廣公司深圳
  • 相冊模版網(wǎng)站圖片展示成人再就業(yè)培訓班
  • 網(wǎng)站流量少宣傳產(chǎn)品的方式
  • 請人做網(wǎng)站后臺密碼推廣模式包括哪些模式
  • 復興網(wǎng)站制作網(wǎng)絡推廣文案策劃
  • 成都網(wǎng)站建設哪兒濟南興田德潤怎么聯(lián)系婁底seo
  • 網(wǎng)站的反鏈要怎么做近期國內(nèi)熱點新聞事件
  • 網(wǎng)站建設好學嗎google ads 推廣
  • 九江網(wǎng)站建設多少錢百度推廣客服電話24小時
  • 2012搭建wordpress網(wǎng)站seo專員招聘
  • 技術(shù)支持 東莞網(wǎng)站建設舞蹈培訓免費的網(wǎng)頁制作軟件
  • 怎么做網(wǎng)站排名優(yōu)化電子商務平臺
  • 珠海網(wǎng)站建立seo外鏈在線提交工具
  • 鮮花商城網(wǎng)站建設怎么找拉新推廣平臺
  • 手機app制作網(wǎng)站模板seo兼職論壇
  • 專業(yè)網(wǎng)站優(yōu)化報價優(yōu)化推薦
  • wordpress復制他人的網(wǎng)站網(wǎng)站收錄情況查詢
  • 推廣優(yōu)化濟南網(wǎng)絡優(yōu)化網(wǎng)站
  • 網(wǎng)站改版的原因微信怎么推廣自己的產(chǎn)品
  • wordpress 獲取文章評論百度app關(guān)鍵詞優(yōu)化