Docker 鏡像、容器與數據卷的高效管理:最佳實踐與自動化腳本20250411

Docker 鏡像、容器與數據卷的高效管理:最佳實踐與自動化腳本

引言

在現代軟件開發中,容器化技術正變得越來越重要。Docker 作為容器化的代表工具,在各大企業中得到了廣泛的應用。然而,隨著容器化應用的增多,如何高效管理 Docker 鏡像、容器和數據卷成為了一個不可忽視的問題。本文將結合實際案例,展示如何通過 最佳實踐自動化腳本 來優化 Docker 環境的管理,解決常見問題。
在這里插入圖片描述


1. 容器鏡像管理:優化與清理

問題:容器鏡像體積過大

隨著 Docker 容器的構建和鏡像的更新,鏡像體積會越來越大,導致磁盤空間不足。特別是在構建復雜的應用時,鏡像的體積可能膨脹得非常快。

最佳實踐:使用多階段構建

使用 多階段構建 是優化 Docker 鏡像體積的一個有效方法。以下是一個 多階段構建的 Dockerfile 示例,它首先使用一個帶有構建工具的鏡像進行構建,最后只保留應用的最終可執行文件,顯著減小鏡像體積。

# 第一階段:構建應用
FROM node:14 AS buildWORKDIR /app
COPY . .
RUN npm install && npm run build# 第二階段:創建最終鏡像
FROM node:14-slimWORKDIR /app
COPY --from=build /app/build /app/buildCMD ["npm", "start"]

解釋

  • 第一階段(build)使用完整的 Node.js 鏡像來構建應用。
  • 第二階段(node:14-slim)是一個輕量級的鏡像,只復制構建后的文件,減少不必要的構建依賴和臨時文件,從而顯著減少鏡像體積。
清理未使用的鏡像

使用 docker system prune 命令清理未使用的鏡像、容器和緩存。在定期清理時,使用以下腳本:

#!/bin/bash
# 每周清理未使用的鏡像和容器
docker system prune -f# 清理懸掛的鏡像(沒有標簽的鏡像)
docker image prune -f# 輸出清理后的磁盤使用情況
df -h

您可以將該腳本通過 Cron 任務 定期執行,避免手動清理帶來的麻煩。


2. 容器與卷管理:持久化與數據清理

問題:容器刪除導致數據丟失

容器的文件系統在容器停止后會丟失數據,尤其是在沒有使用卷來持久化數據時。為了解決這一問題,可以使用 數據卷(Volumes) 來存儲容器的持久化數據。

最佳實踐:使用 Docker 卷進行持久化存儲

首先,創建一個卷來存儲數據:

# 創建數據卷
docker volume create my_data_volume# 啟動容器并掛載卷
docker run -d --name my_container -v my_data_volume:/app/data my_image

通過 -v 參數將卷掛載到容器的 /app/data 路徑上。即使容器被刪除,卷中的數據也不會丟失。

定期清理未使用的卷

未掛載的卷會占用磁盤空間。使用以下腳本來清理未使用的卷:

#!/bin/bash
# 清理所有未掛載的卷
docker volume prune -f# 輸出清理后的卷使用情況
docker volume ls

在此腳本中,docker volume prune -f 會刪除所有未掛載的卷,以釋放磁盤空間。


3. 容器與鏡像清理流程:自動化與監控

問題:誤刪容器和鏡像

使用 docker system prune -af 時,可能會誤刪正在使用的容器和鏡像,導致系統運行異常。為了避免這種情況,以下是改進的 自動化清理流程,結合 日志監控,確保容器和鏡像的清理不會影響到生產環境。

自動化清理腳本:
#!/bin/bash
# 記錄清理前的容器和鏡像狀態
echo "Before cleanup:" > cleanup.log
docker ps -a >> cleanup.log
docker images >> cleanup.log# 清理未使用的容器、鏡像和網絡
docker system prune -f# 記錄清理后的容器和鏡像狀態
echo "After cleanup:" >> cleanup.log
docker ps -a >> cleanup.log
docker images >> cleanup.log# 輸出清理后的磁盤使用情況
df -h
日志監控:

結合 PrometheusGrafana 對 Docker 容器的資源使用情況進行監控。以下是基本的 Prometheus 配置,用于監控 Docker 容器的資源占用:

  1. 安裝 Prometheus Docker Exporter:
docker run -d \-p 9104:9104 \--name=prometheus-docker-exporter \--volume=/:/host:ro \--volume=/var/run/docker.sock:/var/run/docker.sock:ro \prom/dockershim
  1. Prometheus 配置:

prometheus.yml 中添加 Docker exporter 配置:

scrape_configs:- job_name: 'docker'static_configs:- targets: ['localhost:9104']
  1. Grafana 可視化:

通過 Grafana 創建 Docker 容器資源使用情況的儀表板,包括 CPU、內存、磁盤空間等。


4. 高效管理 Docker 環境:自動化與容器編排

自動化容器管理:使用 Docker Compose

為了高效管理多個容器,Docker Compose 提供了一種簡單的方式來定義和運行多容器 Docker 應用。以下是一個 Docker Compose 示例,用于管理多容器應用:

version: '3'
services:web:image: nginx:latestports:- "8080:80"volumes:- ./web:/usr/share/nginx/htmldb:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: examplevolumes:- db_data:/var/lib/mysqlvolumes:db_data:
  • web 服務是一個 Nginx 容器,綁定本地端口 8080。
  • db 服務是一個 MySQL 容器,使用卷來持久化數據庫數據。
容器編排與 Kubernetes 集成

對于大規模生產環境,使用 Kubernetes 進行容器編排是最佳選擇。Kubernetes 提供了自動化的容器管理、部署和擴展機制,確保容器化應用的高可用性和可擴展性。


結論

Docker 的容器、鏡像和數據卷管理是 DevOps 和微服務架構中不可忽視的重要組成部分。通過遵循最佳實踐、使用多階段構建、配置數據卷以及自動化清理任務,我們可以大大提高容器管理的效率和安全性。結合 自動化腳本日志監控容器編排工具(如 Docker Compose 和 Kubernetes),可以使 Docker 環境的管理更加高效、可靠和靈活。掌握這些實戰技巧,能夠幫助開發者和運維人員優化容器環境,確保生產系統的穩定運行。


實踐指南

  1. 鏡像管理: 使用多階段構建和輕量級基礎鏡像來減小鏡像體積。
  2. 數據持久化: 將數據存儲到卷中,確保數據在容器刪除時不會丟失。
  3. 清理策略: 編寫定時清理腳本并結合日志監控,避免誤刪資源。
  4. 自動化: 使用 Docker Compose 和 Kubernetes 管理多容器環境,提升容器編排效率。

通過這些實戰方法,您將能夠更好地管理 Docker 環境,提升系統的穩定性和效率。


進一步閱讀與資源:

  1. Docker 官方文檔
  2. Prometheus 文檔
  3. Kubernetes 入門指南

通過這些具體的 代碼示例、腳本流程圖,本文提供了更具實戰性的 Docker 管理方法,確保技術讀者能夠直接應用于生產環境中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76624.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Selenium之Actions事件

鼠標、鍵盤組合鍵 在使用selenium的時候,有的時候我們需要鼠標單擊、雙擊、拖動;或者是按下鍵盤的某個鍵,松開某個按鍵,以及組合鍵的使用;今天我們就來看一看,怎么樣實現上面的操作 先把準備工作做好&…

如何在 CentOS 7 系統上以容器方式部署 GitLab,使用 ZeroNews 通過互聯網訪問 GitLab 私有倉庫,進行代碼版本發布與更新

第 1 步: 部署 GitLab 容器? 在開始部署 GitLab 容器之前,您需要創建本地目錄來存儲 GitLab 數據、配置和日志: #創建本地目錄 mkdir -p /opt/docker/gitlab/data mkdir -p /opt/docker/gitlab/config mkdir -p /opt/docker/gitlab/log#gi…

.py文件和.ipynb文件的區別:完整教程

一、概述 Python開發者常用的兩種文件格式.py和.ipynb各有特點,本教程將通過對比分析、代碼示例和場景說明,幫助開發者全面理解二者的區別與聯系。 二、核心區別對比 1. 文件格式本質 特性.ipynb文件.py文件文件類型JSON結構化文檔純文本文件存儲內容…

Go 字符串四種拼接方式的性能對比

簡介 使用完整的基準測試代碼文件,可以直接運行來比較四種字符串拼接方法的性能。 for 索引 的方式 for range 的方式 strings.Join 的方式 strings.Builder 的方式 寫一個基準測試文件 echo_bench_test.go package mainimport ("os""stri…

從代碼學習深度學習 - Bahdanau注意力 PyTorch版

文章目錄 1. 前言為什么選擇Bahdanau注意力本文目標與預備知識2. Bahdanau注意力機制概述注意力機制簡述加性注意力與乘性注意力對比Bahdanau注意力的數學原理與流程圖數學原理流程圖可視化與直觀理解3. 數據準備與預處理數據集簡介數據加載與預處理1. 讀取數據集2. 預處理文本…

19【動手學深度學習】卷積層

1. 從全連接到卷積 2. 圖像卷積 3. 圖形卷積代碼 互相關操作 import torch from torch import nn from d2l import torch as d2ldef corr2d(X, K):"""計算2維互相關運算"""h, w K.shapeY torch.zeros((X.shape[0]-h1, X.shape[1]-w 1))for …

Linux xorg-server 解析(一)- 編譯安裝Debug版本的xorg-server

一:下載代碼 1. 配置源,以Ubuntu24.04 為例( /etc/apt/sources.list.d/ubuntu.sources): 2. apt source xserver-xorg-core 二:編譯代碼 1. sudo apt build-dep ./ 2. DEB_BUILD_OPTIONS="nostrip" DEB_CFLAGS_SET="-g -O0" dpkg-buildpac…

大模型SFT用chat版還是base版 SFT后災難性遺忘怎么辦

大模型SFT用chat版還是base版 進行 SFT 時,基座模型選用 Chat 還是 Base 模型? 選 Base 還是 Chat 模型,首先先熟悉 Base 和 Chat 是兩種不同的大模型,它們在訓練數據、應用場景和模型特性上有所區別。 在訓練數據方面&#xf…

【圖像生成之21】融合了Transformer與Diffusion,Meta新作Transfusion實現圖像與語言大一統

論文:Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Model 地址:https://arxiv.org/abs/2408.11039 類型:理解與生成 Transfusion模型?是一種將Transformer和Diffusion模型融合的多模態模型,旨…

動態多目標進化算法:基于知識轉移和維護功能的動態多目標進化算法(KTM-DMOEA)求解CEC2018(DF1-DF14)

一、KTM-DMOEA介紹 在實際工程和現實生活中,許多優化問題具有動態性和多目標性,即目標函數會隨著環境的變化而改變,并且存在多個相互沖突的目標。傳統的多目標進化算法在處理這類動態問題時面臨著一些挑戰,如收斂速度慢、難以跟蹤…

部署NFS版StorageClass(存儲類)

部署NFS版StorageClass存儲類 NFS版PV動態供給StorageClass(存儲類)基于NFS實現動態供應下載NFS存儲類資源清單部署NFS服務器為StorageClass(存儲類)創建所需的RBAC部署nfs-client-provisioner的deployment創建StorageClass使用存儲類創建PVC NFS版PV動態供給StorageClass(存儲…

Vue使用el-table給每一行數據上面增加一行自定義合并行

// template <template><el-table:data"flattenedData":span-method"objectSpanMethod"borderclass"custom-header-table"style"width: 100%"ref"myTable":height"60vh"><!-- 訂單詳情列 -->&l…

vue項目使用html2canvas和jspdf將頁面導出成PDF文件

一、需求&#xff1a; 頁面上某一部分內容需要生成pdf并下載 二、技術方案&#xff1a; 使用html2canvas和jsPDF插件 三、js代碼 // 頁面導出為pdf格式 import html2Canvas from "html2canvas"; import jsPDF from "jspdf"; import { uploadImg } f…

大模型LLM表格報表分析:markitdown文件轉markdown,大模型markdown統計分析

整體流程&#xff1a;用markitdown工具文件轉markdown&#xff0c;然后大模型markdown統計分析 markitdown https://github.com/microsoft/markitdown 在線體驗&#xff1a;https://huggingface.co/spaces/AlirezaF138/Markitdown 安裝&#xff1a; pip install markitdown…

Linux 第二講 --- 基礎指令(二)

前言 這是基礎指令的第二部分&#xff0c;但是該部分的講解會大量使用到基礎指令&#xff08;一&#xff09;的內容&#xff0c;為了大家的觀感&#xff0c;如果對Linux的一些基本指令不了解的話&#xff0c;可以先看基礎指令&#xff08;一&#xff09;&#xff0c;同樣的本文…

python格式化字符串漏洞

什么是python格式化字符串漏洞 python中&#xff0c;存在幾種格式化字符串的方式&#xff0c;然而當我們使用的方式不正確的時候&#xff0c;即格式化的字符串能夠被我們控制時&#xff0c;就會導致一些嚴重的問題&#xff0c;比如獲取敏感信息 python常見的格式化字符串 百…

LLaMA-Factory雙卡4090微調DeepSeek-R1-Distill-Qwen-14B醫學領域

unsloth單卡4090微調DeepSeek-R1-Distill-Qwen-14B醫學領域后&#xff0c;跑通一下多卡微調。 1&#xff0c;準備2卡RTX 4090 2&#xff0c;準備數據集 醫學領域 pip install -U huggingface_hub export HF_ENDPOINThttps://hf-mirror.com huggingface-cli download --resum…

React Hooks: useRef,useCallback,useMemo用法詳解

1. useRef&#xff08;保存引用值&#xff09; useRef 通常用于保存“不會參與 UI 渲染&#xff0c;但生命周期要長”的對象引用&#xff0c;比如獲取 DOM、保存定時器 ID、WebSocket等。 新建useRef.js組件&#xff0c;寫入代碼&#xff1a; import React, { useRef, useSt…

Spring AI 結構化輸出詳解

一、Spring AI 結構化輸出的定義與核心概念 Spring AI 提供了一種強大的功能&#xff0c;允許開發者將大型語言模型&#xff08;LLM&#xff09;的輸出從字符串轉換為結構化格式&#xff0c;如 JSON、XML 或 Java 對象。這種結構化輸出能力對于依賴可靠解析輸出值的下游應用程…

THM Billing

1. 信息收集 (1) Nmap 掃描 bashnmap -T4 -sC -sV -p- 10.10.189.216 輸出關鍵信息&#xff1a; PORT STATE SERVICE VERSION22/tcp open ssh OpenSSH 8.4p1 Debian 5deb11u380/tcp open http Apache 2.4.56 (Debian) # MagnusBilling 應用3306/tcp open …