Docker 介紹與使用

Docker

文章目錄

  • Docker
    • 介紹
      • 與虛擬機的比較
      • 啟動速度
      • 占用資源
    • 優勢
      • 更容易遷移
      • 更容易維護
      • 更容易擴展
    • 使用場景
      • 持續集成
      • 提供可伸縮的云服務
      • 搭建微服務架構
    • 鏡像與容器
      • 鏡像構成(分層結構)
      • 鏡像與容器的區別
    • 安裝 Docker
    • 常用命令介紹
      • 鏡像相關
      • 容器相關
    • 實戰:從構建到部署一個 Web 應用
      • 示例項目結構:
      • `app.js`
      • `package.json`
      • Dockerfile
      • 構建鏡像
      • 運行容器
    • 使用 Docker Volume 實現持久化
      • 示例:MySQL 容器掛載本地目錄
    • 多容器部署:Docker Compose 示例
      • 項目結構
      • docker-compose.yml
      • 構建并啟動容器組
    • 容器之間通信
    • Docker 常用工具和高級功能
    • 清理命令合集
    • 參考資料

介紹

Docker 是一個開源的應用容器引擎,它允許開發者將應用及其依賴打包進一個輕量級、可移植的容器中,然后在任何支持 Docker 的平臺上運行。
它的核心目標是“一次構建,到處運行”。

由于不同的機器有不同的操作系統,以及不同的庫和組件,在將一個應用部署到多臺機器上需要進行大量的環境配置操作。

Docker 主要解決環境配置問題,它是一種虛擬化技術,對進程進行隔離,被隔離的進程獨立于宿主操作系統和其它隔離的進程。使用 Docker 可以不修改應用程序代碼,不需要開發人員學習特定環境下的技術,就能夠將現有的應用程序部署在其它機器上。


核心特點:

  • 鏡像(Image):是一個只讀的模板,包含運行應用所需的代碼、庫、依賴等。
  • 容器(Container):鏡像的一個運行實例,是一個隔離的環境。
  • Dockerfile:用于構建鏡像的腳本文件。
  • Docker Hub:一個公共的鏡像倉庫,也可以使用私有倉庫。

與虛擬機的比較

虛擬機也是一種虛擬化技術,它與 Docker 最大的區別在于它是通過模擬硬件,并在硬件上安裝操作系統來實現。


啟動速度

啟動虛擬機需要先啟動虛擬機的操作系統,再啟動應用,這個過程非常慢;

而啟動 Docker 相當于啟動宿主操作系統上的一個進程。

占用資源

虛擬機是一個完整的操作系統,需要占用大量的磁盤、內存和 CPU 資源,一臺機器只能開啟幾十個的虛擬機。

而 Docker 只是一個進程,只需要將應用以及相關的組件打包,在運行時占用很少的資源,一臺機器可以開啟成千上萬個 Docker。

優勢

除了啟動速度快以及占用資源少之外,Docker 具有以下優勢:

更容易遷移

提供一致性的運行環境。已經打包好的應用可以在不同的機器上進行遷移,而不用擔心環境變化導致無法運行。

更容易維護

使用分層技術和鏡像,使得應用可以更容易復用重復的部分。復用程度越高,維護工作也越容易。

更容易擴展

可以使用基礎鏡像進一步擴展得到新的鏡像,并且官方和開源社區提供了大量的鏡像,通過擴展這些鏡像可以非常容易得到我們想要的鏡像。

使用場景

持續集成

持續集成指的是頻繁地將代碼集成到主干上,這樣能夠更快地發現錯誤。

Docker 具有輕量級以及隔離性的特點,在將代碼集成到一個 Docker 中不會對其它 Docker 產生影響。

提供可伸縮的云服務

根據應用的負載情況,可以很容易地增加或者減少 Docker。

搭建微服務架構

Docker 輕量級的特點使得它很適合用于部署、維護、組合微服務。

鏡像與容器

鏡像是一種靜態的結構,可以看成面向對象里面的類,而容器是鏡像的一個實例。

鏡像包含著容器運行時所需要的代碼以及其它組件,它是一種分層結構,每一層都是只讀的(read-only layers)。構建鏡像時,會一層一層構建,前一層是后一層的基礎。鏡像的這種分層存儲結構很適合鏡像的復用以及定制。

構建容器時,通過在鏡像的基礎上添加一個可寫層(writable layer),用來保存著容器運行過程中的修改。

鏡像構成(分層結構)

每個鏡像是多層構成的,比如:

FROM ubuntu:20.04     <- 基礎層
RUN apt-get update    <- 新增一層
RUN apt install nginx <- 又新增一層
COPY . /app           <- 又一層

這些層具有緩存機制,因此只要上一層沒變,Docker 會復用已有層來提高構建效率。


鏡像與容器的區別

對象說明
鏡像(Image)模板:不可變,類似于軟件安裝包
容器(Container)鏡像的運行時實例,可修改狀態、產生數據


安裝 Docker

參考官網:https://docs.docker.com/get-docker/
主要支持 Windows、macOS、Linux 等系統,安裝后可通過命令 docker --version 檢查是否安裝成功。


常用命令介紹

鏡像相關

# 搜索鏡像(如nginx)
docker search nginx# 拉取鏡像
docker pull nginx# 查看本地鏡像
docker images# 刪除鏡像
docker rmi 鏡像ID或名稱

容器相關

# 運行容器
docker run -d -p 8080:80 --name mynginx nginx
# -d 后臺運行
# -p 映射端口(宿主機:容器)
# --name 給容器起個名字# 查看正在運行的容器
docker ps# 查看所有容器(包含停止的)
docker ps -a# 停止容器
docker stop 容器名或ID# 啟動容器
docker start 容器名或ID# 進入容器交互終端
docker exec -it 容器名或ID bash# 刪除容器
docker rm 容器名或ID

實戰:從構建到部署一個 Web 應用

下面以構建一個簡單 Node.js 應用為例,展示完整流程。

示例項目結構:

myapp/
│
├── app.js
├── package.json
└── Dockerfile

app.js

const express = require('express');
const app = express();
const port = 3000;app.get('/', (req, res) => res.send('Hello Docker!'));
app.listen(port, () => console.log(`Server running on port ${port}`));

package.json

{"name": "myapp","version": "1.0.0","dependencies": {"express": "^4.18.2"}
}

Dockerfile

# 基礎鏡像
FROM node:18# 創建工作目錄
WORKDIR /usr/src/app# 拷貝依賴清單
COPY package*.json ./# 安裝依賴
RUN npm install# 拷貝應用代碼
COPY . .# 開放端口
EXPOSE 3000# 啟動命令
CMD ["node", "app.js"]

構建鏡像

docker build -t my-node-app .

運行容器

docker run -d -p 3000:3000 --name node-test my-node-app

此時訪問瀏覽器 http://localhost:3000 即可看到輸出。


使用 Docker Volume 實現持久化

Docker 中容器一旦銷毀,其中的數據會丟失,因此常用 volume 保存持久化數據。

示例:MySQL 容器掛載本地目錄

docker run -d \--name mydb \-e MYSQL_ROOT_PASSWORD=root \-v /my/local/mysql:/var/lib/mysql \mysql:8

容器內 /var/lib/mysql 的數據將映射到宿主機 /my/local/mysql,保證重啟后數據不丟。


多容器部署:Docker Compose 示例

項目結構

myapp/
├── docker-compose.yml
├── app/
│   ├── app.js
│   ├── package.json
│   └── Dockerfile
└── db/

docker-compose.yml

version: '3.8'
services:web:build: ./appports:- "3000:3000"depends_on:- dbdb:image: mysql:8environment:MYSQL_ROOT_PASSWORD: rootvolumes:- db_data:/var/lib/mysqlvolumes:db_data:

構建并啟動容器組

docker-compose up -d

容器之間通信

在 Compose 中,各服務默認加入同一網絡,可以直接通過服務名訪問:

// 在 web 服務代碼中
mysql.createConnection({host: 'db',   // Compose 中的服務名user: 'root',password: 'root'
});

Docker 常用工具和高級功能

  • Docker Volume:管理數據持久化
  • Docker Network:自定義網絡讓容器之間安全通信
  • Docker Compose:本地開發和測試的神器
  • Dockerfile 構建優化
    • 多階段構建(multi-stage)
    • 合理利用緩存層
    • 使用 .dockerignore 排除無關文件

清理命令合集

# 清除所有停止的容器
docker container prune# 清除未使用的鏡像
docker image prune# 清理所有未使用的數據(包括鏡像、容器、卷等)
docker system prune -a

參考資料

  • DOCKER 101: INTRODUCTION TO DOCKER WEBINAR RECAP
  • Docker 入門教程
  • Docker container vs Virtual machine
  • How to Create Docker Container using Dockerfile
  • 理解 Docker(2):Docker 鏡像
  • 為什么要使用 Docker?
  • What is Docker
  • 持續集成是什么?

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

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

相關文章

《AI大模型應知應會100篇》第62篇:TypeChat——類型安全的大模型編程框架

第62篇&#xff1a;TypeChat——類型安全的大模型編程框架 摘要 在構建 AI 應用時&#xff0c;一個常見的痛點是大語言模型&#xff08;LLM&#xff09;輸出的不確定性與格式不一致問題。開發者往往需要手動解析、校驗和處理模型返回的內容&#xff0c;這不僅增加了開發成本&a…

upload-labs通關筆記-第5關 文件上傳之.ini繞過

目錄 一、ini文件繞過原理 二、源碼審計 三、滲透實戰 1、查看提示 2、制作.user.ini文件 &#xff08;1&#xff09;首先創建一個文本文件 &#xff08;2&#xff09;保存文件名為.user.ini 2、制作jpg后綴腳本 &#xff08;1&#xff09;創建一個文本文件 &#xf…

為什么 Linux 上默認沒有 host.docker.internal

在 Linux 環境中&#xff0c;host.docker.internal 是 Docker 為容器提供的一個特殊 DNS 名稱&#xff0c;用于指向宿主機的 IP 地址&#xff08;類似 macOS/Windows 中的行為&#xff09;。但這個功能在 Linux 上默認不啟用&#xff0c;需要手動配置才能使用。以下是詳細解釋和…

C++GO語言微服務和服務發現②

01 創建go-micro項目-查看生成的 proto文件 02 創建go-micro項目-查看生成的main文件和handler ## 創建 micro 服務 命令&#xff1a;micro new --type srv test66 框架默認自帶服務發現&#xff1a;mdns。 使用consul服務發現&#xff1a; 1. 初始consul服務發現&…

Redis--常見數據類型List列表

目錄 一、概念 二、命令 2.1 LPUSH 2.2 LPUSHX 2.3 RPUSH 2.4 RPUSHX 2.5 LRANGE 2.6 LPOP 2.7 RPOP 2.8 LINDEX 2.9 LINSERT 2.10 LLEN 2.11 阻塞版本命令 三、內部編碼 一、概念 列表類型是用來存儲多個有序的字符串&#xff0c;列表中的每個字符串稱為元素&…

QListWedget控件使用指南

QListWedget公共函數 函數簽名功能描述QListWidget(QWidget *parent nullptr)構造函數&#xff0c;創建一個QListWidget對象&#xff0c;可指定父部件&#xff08;默認為nullptr&#xff09;。virtual ~QListWidget()虛析構函數&#xff0c;釋放QListWidget對象及其資源。voi…

Seata源碼—1.Seata分布式事務的模式簡介

大綱 1.Seata分布式事務框架簡介 2.Seata AT模式實現分布式事務的機制 3.Seata AT模式下的寫隔離機制 4.Seata AT模式下的讀隔離機制 5.官網示例說明Seata AT模式的工作機制 6.Seata TCC模式的介紹以及與AT模式區別 7.Seata Saga模式的介紹 8.單服務多個庫的分布式事務…

【Qt】之音視頻編程2:QtAV的使用篇

QtAV 基本播放控制功能實現&#xff08;C & QML&#xff09; QtAV 提供了完整的播放控制 API&#xff0c;支持 播放、暫停、停止、快進快退、截屏 等功能。以下是具體實現方法&#xff1a; 1. C 控制方式 基本播放控制 #include <QtAV> #include <QtAV/AVPlaye…

歌詞滾動效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 設置標簽頁圖標 --><link rel"shortcut icon&…

基于大模型的TIA診療全流程智能決策系統技術方案

目錄 一、多模態數據融合與預處理系統1.1 數據接入模塊1.2 數據預處理偽代碼二、TIA智能預測模型系統2.1 模型訓練流程2.2 混合模型架構偽代碼三、術中智能監測系統3.1 實時監測流程3.2 實時預測偽代碼四、智能診療決策系統4.1 手術方案推薦流程4.2 麻醉方案生成偽代碼五、預后…

Java 日期解析與格式化:從標準格式到自然語言解析

使用 Java 搭配 Apache Commons Lang3 和 Natty 庫&#xff0c;實現靈活高效的日期解析與格式化。 一、背景 將不同格式的日期統一成一個格式。日期格式可能有以下幾種類型&#xff1a; 標準格式&#xff1a;2024-02-28、14/05/2022、2002年5月6日非英文月份縮寫&#xff1a;…

Room持久化庫:從零到一的全面解析與實戰

簡介 在Android開發中,Room作為官方推薦的數據庫持久化庫,提供了對SQLite的抽象層,使得數據庫操作更加安全、高效且易于維護。 Room通過注解處理器和編譯時驗證,顯著降低了數據庫操作的復雜度,同時支持響應式編程模式,使開發者能夠輕松實現數據變化的實時監聽。對于企業…

MySQL(6)如何刪除數據庫和表?

在 MySQL 中刪除數據庫和表是常見的管理操作。下面將詳細介紹如何使用 SQL 語句以及圖形化工具來刪除數據庫和表。 步驟一&#xff1a;連接 MySQL 服務器 首先&#xff0c;連接到 MySQL 服務器&#xff0c;可以使用命令行工具 mysql 或圖形化工具如 MySQL Workbench。 使用命…

攜固態電池、新形態鋼殼疊片電池等產品 豪鵬科技將亮相CIBF 2025

攜固態電池、新形態鋼殼疊片電池等產品 豪鵬科技將亮相CIBF 2025 來源&#xff1a; 電池百人會-電池網 豪鵬科技&#xff08;展位號:14W001&#xff09;將攜固態電池、新形態鋼殼疊片電池及高安全性鈉離子電池等前沿技術產品亮相CIBF 2025&#xff0c;憑借多年的技術積累和產…

React學習———useEffect和useLayoutEffect

useEffect useEffect是React的一個Hook&#xff0c;用于在函數組件中處理副作用。副作用包括數據獲取、訂閱、手動DOM操作以及其他需要再渲染后執行的操作 基本用法 useEffect(() > {// 副作用邏輯return () > {// 可選的清理函數} }, [依賴數組])第一個參數&#xff…

“天神之眼”計算平臺的算力設計(預計500-1000 TOPS)

關于比亞迪“天神之眼”計算平臺的算力設計&#xff08;預計500-1000 TOPS&#xff09;&#xff0c;其技術路徑和行業意義值得深入探討。以下從實現方式、技術挑戰和行業影響三個維度展開分析&#xff1a; 1. 多芯片互聯的技術實現路徑 &#xff08;1&#xff09;芯片選型方案…

FPGA: Xilinx Kintex 7實現PCIe接口

在Xilinx Kintex-7系列FPGA上實現PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;接口&#xff0c;通常使用Xilinx提供的7 Series Integrated Block for PCIe IP核&#xff0c;結合Vivado設計流程。以下是實現PCIe接口的詳細步驟和關鍵點&#xff0c;適…

ArcGIS Desktop使用入門(二)常用工具條——圖形

系列文章目錄 ArcGIS Desktop使用入門&#xff08;一&#xff09;軟件初認識 ArcGIS Desktop使用入門&#xff08;二&#xff09;常用工具條——標準工具 ArcGIS Desktop使用入門&#xff08;二&#xff09;常用工具條——編輯器 ArcGIS Desktop使用入門&#xff08;二&#x…

JT/T 808 通訊協議及數據格式解析

文章目錄 一、引言二、協議數據幀結構三、消息頭結構&#xff08;Message Header&#xff09;四、常用消息類型&#xff08;Message ID&#xff09;五、典型消息體結構解析六、數據轉義規則七、校驗碼計算方法八、終端與平臺通信流程示意&#xff08;簡要&#xff09;九、平臺接…

Rust 輸出到命令行

Rust 輸出到命令行 引言 Rust 是一門系統編程語言&#xff0c;以其高性能、內存安全、并發支持和零成本抽象等特性而聞名。在開發過程中&#xff0c;將 Rust 程序的輸出傳遞到命令行是常見的需求。本文將詳細介紹 Rust 輸出到命令行的多種方法&#xff0c;幫助讀者掌握這一技…