Docker|簡單入門

文章目錄

    • Docker簡介
    • Docker和虛擬機的聯系和區別
    • 基本原理和概念
      • 鏡像
      • 容器
      • 倉庫
    • Docker安裝配置
    • 容器化和Dockerfile
    • 實踐環節
    • Docker Compose

在這里插入圖片描述

Docker簡介

  • Docker是一個用于構建build、運行run、傳送share應用程序的平臺,可以把應用程序打包成一個個的集裝箱,然后小鯨魚就可以把它們運送到任何所需要的地方。
  • Docker 是利用 Linux 內核的 Namespace + Cgroups 實現進程級隔離和資源限制,提供輕量級、快速可移植的容器技術,是現代云原生架構的基石之一。
  • Docker 是一個開源的容器化平臺,可以把應用程序和它的依賴打包在一個輕量級、可移植、自包含的容器中,保證跨環境一致運行。
  • 一句話:“一次構建,到處運行”。
  • Docker 解決了什么問題?
  • 在傳統部署中,常常遇到:
    • 依賴沖突:不同應用需要不同版本的庫,部署在同一機器容易打架。
    • 環境不一致:開發、測試、生產環境配置不一致,導致“在我機器上能跑”。
    • 復雜部署流程:要手動配置各種環境,效率低、容易出錯。
  • Docker 通過容器機制解決這些問題:
    • 應用 + 環境打包成鏡像 → 一次構建,任意運行
    • 鏡像不可變,版本可控,回滾方便
    • 容器輕量、秒級啟動、資源隔離

在這里插入圖片描述
在這里插入圖片描述

  • 以一個前后端分離的網站,如果沒有docker,那么我們要在本地先安裝以下內容,才可以運行:

    • 安裝前端Node.js環境
    • 安裝各種npm依賴
    • 安裝Java運行時環境
    • 安裝SpringBoot微服務的各種第三方依賴包
    • 安裝MySQL數據庫
    • 安裝配置Redis緩存
    • 安裝配置Nginx負載均衡
    • 配置各種環境變量并啟動腳本
  • 而且這還只是開發環境,如果是要在測試環境也配一邊就要再來一次,耗時耗力而且容易出錯。

在這里插入圖片描述

  • 但是有了Docker我們就可以把他們打包成一個一個的集裝箱,只要在開發環境中運行成功了,那么在測試環境中運行也是沒有問題的。

在這里插入圖片描述

  • 核心概念

在這里插入圖片描述

# Docker常用命令# 查看本地鏡像
docker images# 拉取鏡像
docker pull nginx# 啟動容器
docker run -d -p 8080:80 nginx# 查看運行中的容器
docker ps# 停止容器
docker stop <container_id># 進入容器
docker exec -it <container_id> /bin/bash

Docker和虛擬機的聯系和區別

  • 聯系
    • 目的相同:容器和虛擬機都是用來實現隔離,讓應用運行在相互隔離的環境中:
      • 避免依賴沖突
      • 保證環境一致性
      • 提高資源利用率
    • 都支持跨平臺部署:容器鏡像、虛擬機鏡像都能實現 “一次打包,到處運行”。
    • 都能通過編排工具管理(如 K8s 支持容器,VM 支持 OpenStack、vSphere 等)

在這里插入圖片描述

  • Docker 容器 ≠ 虛擬機,不需要 Hypervisor(虛擬化技術:將物理資源虛擬為多個邏輯資源的技術),不是完全模擬一個硬件環境
  • Docker 容器 = 基于宿主機 Linux 內核的隔離進程,啟動快,資源開銷小
  • 虛擬機一定程度上實現了資源的整合,可以將一臺服務器的計算能力、存儲能力、網絡資源分配給多個邏輯服務器,實現多臺服務器的功能

在這里插入圖片描述
在這里插入圖片描述

  • 但是每臺虛擬機都需要占用大量的資源,如CPU、內存、硬盤、網絡等,而且啟動速度很慢
  • 最主要的是,大部份情況下,我們一臺服務器上只需要運行一個主要對外提供服務的應用程序就行了,并不需要用到一個完整的操作系統所提供的所有功能,如下圖所示

在這里插入圖片描述

  • 上面的例子來說其實我們所需要的只是一個web服務器,但是虛擬機卻要啟動一個完整的操作系統,包括操作系統內核,各種系統服務,各種工具,甚至圖形界面等等,這些我們并不需要的服務會占用大量的資源,導致了資源的浪費和啟動速度慢的問題
  • 于是容器技術應運而生,但是要注意,Docker并不是容器!
  • Docker只是容器的一種實現,是一個容器化的解決方案和平臺;而容器是一種虛擬化技術,和虛擬機類似,也是一個獨立的環境,可以在這個環境中運行應用程序,但是和虛擬機不同的是它并不需要運行一個完整的操作系統,而是使用宿主機的操作系統,所以啟動速度非常快,通常只需要幾秒鐘,同時因為所需要的資源更少,所以可以在一臺物理服務器上運行更多的容器,這樣就可以更加充分地利用服務器的資源,減少資源的閑置和浪費。

在這里插入圖片描述
在這里插入圖片描述

# 虛擬機架構硬件
│
└── Hypervisor (KVM / VMware / Hyper-V)│├── Guest OS (Linux / Windows)│    └── App A├── Guest OS (Linux / Windows)│    └── App B
# 容器架構硬件
│
└── 宿主機 OS (Linux內核)│└── Docker Engine / containerd├── Container A (App + libs)├── Container B (App + libs)
  • 容器不需要 Guest OS,進程直接運行在宿主機內核之上。
  • 虛擬機需要完整 Guest OS,有更高隔離,但更重。
  • 容器和虛擬機的主要聯系是都實現了應用隔離,方便跨平臺部署。區別在于虛擬機是通過 Hypervisor 提供系統級虛擬化,每個VM都有完整的操作系統,啟動慢、資源占用大,隔離性強;而容器是基于宿主機內核,通過 Linux 的 Namespace 和 Cgroups 技術提供進程級隔離,啟動快、資源占用小,非常適合微服務和大規模部署。容器與虛擬機是互補關系,通常混合使用,比如在公有云上用VM作為物理隔離基礎,容器作為上層彈性計算單位。
  • 虛擬機提供系統級隔離,容器提供進程級隔離;VM 啟動慢資源重隔離強,容器啟動快資源輕靈活高效,兩者可以結合使用,滿足不同場景需求。

基本原理和概念

  • Docker 鏡像是應用程序和依賴的靜態打包模板,容器是鏡像運行時的隔離進程,倉庫用于存儲和分發鏡像。三者配合實現了應用的一鍵打包、快速部署和跨環境一致運行,是現代 DevOps 流水線的核心組件。
Dockerfile → docker build → 鏡像 (Image)docker push → 倉庫 (Registry)docker run↓容器 (Container)

鏡像

  • 鏡像是一個只讀的模版,可以用來創建容器。
  • 鏡像和容器的關系,就好比Java中類和實例的關系一樣,我們可以定義一個類中有哪些屬性和方法,這個定義好的類就是模版,然后我們可以根據這個模版來創建多個實例,這些實例就是這個類的對象,對應到Docker中,鏡像就是一個模版,容器就是這個模版的一個實例,可以有一個也可以有多個。
  • 鏡像是一個靜態的模板,包含了應用程序和所有依賴、庫、工具、配置等。
  • 容器運行時會在鏡像上加一個可寫層(Writable Layer)
  • 可以理解成容器的快照,容器運行時是基于鏡像啟動出來的。
  • 特點:
    • 分層結構,每一層是只讀的
    • 可復用,相同基礎層不會重復存儲
    • 版本可控,便于回滾和管理
docker images              # 查看本地鏡像
docker pull nginx          # 拉取遠程鏡像
docker build -t myapp:v1 . # 構建鏡像
docker rmi <image_id>      # 刪除鏡像

容器

  • 容器是Docker的運行實例,提供了一個獨立的可移植的環境。
  • 鏡像和容器的關系,就好比Java中類和實例的關系一樣,我們可以定義一個類中有哪些屬性和方法,這個定義好的類就是模版,然后我們可以根據這個模版來創建多個實例,這些實例就是這個類的對象,對應到Docker中,鏡像就是一個模版,容器就是這個模版的一個實例,可以有一個也可以有多個。
  • 容器是鏡像的運行時實例,本質上是一個受限隔離的進程,它運行在宿主機內核之上。
  • 容器 = 運行中受限隔離的進程 + 分層文件系統。
  • 特點:
    • 容器之間互相隔離,與宿主機隔離
    • 輕量,共享宿主機內核(不像 VM 需要 Guest OS)
    • 可以隨時創建 / 啟動 / 停止 / 刪除
    • 容器是臨時的,可以隨時銷毀,也可以通過數據卷持久化數據
docker run -d -p 8080:80 nginx   # 啟動容器
docker ps                        # 查看運行中的容器
docker stop <container_id>       # 停止容器
docker rm <container_id>         # 刪除容器
docker exec -it <container_id> /bin/bash  # 進入容器

倉庫

  • 鏡像如何分享給別人呢?這就涉及到Docker倉庫的概念了。
  • Docker倉庫是用來存儲Docker鏡像的地方,最流行和最常用的倉庫就是DockerHub,這是一個公共的Docker倉庫,用來集中存儲和管理Docker鏡像,可以在這里下載各種鏡像,也可以將鏡像上傳到倉庫實現鏡像的共享和復用。
  • 倉庫(Registry)是用來存放和分發鏡像的服務器。1、公共倉庫(Public):如 Docker Hub。2、私有倉庫(Private):企業內部自建 Registry,保障鏡像安全、加快拉取速度。
  • 倉庫(Registry)里可以有很多 倉庫名(Repository),一個 Repository 中可以有多個 標簽(Tag),每個標簽對應一個鏡像版本。
nginx:1.25.2
nginx:latest
mycompany/myapp:v1.0.0docker.io/nginx:latest    # Docker Hub
registry.example.com/myapp:v1.0  # 私有倉庫
docker login registry.example.com   # 登錄私有倉庫
docker push myapp:v1                # 推送鏡像
docker pull myapp:v1                # 拉取鏡像

在這里插入圖片描述

Docker安裝配置

  • 官網:https://www.docker.com/
  • 安裝完成之后記得啟動Docker,Windows系統記得開啟Hyper-V功能
  • Docker使用Client-Server架構模式,Docker Client和Docker Daemon之間使用socket或者RESTful API進行通信,Docker Daemon就是服務端的守護進程,負責管理Docker的各種資源,Docker Client負責向Docker Daemon發送請求,Docker Daemon接收到請求之后進行處理,然后將結果返回給Docker Client,Docker Daemon是一個后臺進程,用來接收并處理來自Docker客戶端度請求,然后將結果返回給Docker客戶端,所以我們在終端中輸入各種Docker命令,實際上都是通過Docker客戶端發送給Docker Daemon的,然后Docker Daemon進行處理再將結果返回給客戶端,就可以在終端中看到執行結果了。

容器化和Dockerfile

  • 容器化Containerization,顧名思義就是將應用程序打包成容器,然后在容器中執行應用程序的過程,主要有三步
    • 創建一個Dockerfile,告訴Docker創建應用程序鏡像所需要的步驟和配置
    • 使用Dockerfile構建鏡像
    • 使用鏡像創建和運行容器

在這里插入圖片描述

  • Dockerfile是一個文本文件,里面包含了一條一條的指令,用來告訴Docker如何來構建鏡像,這個鏡像包括了我們應用程序執行的所有命令,也就是剛剛提到的各種依賴,配置環境和運行應用程序所需要的所有內容:
    • 精簡版操作系統
    • 應用程序的運行時環境
    • 應用程序
    • 第三方依賴庫或者包
    • 應用程序的配置文件和環境變量等

在這里插入圖片描述

實踐環節

  • 寫一個js腳本文件,輸出"Hello World!"

  • 沒有Docker之前,我們在其他機器要運行代碼,只能通過以下步驟:

    • Step1: 安裝操作系統
    • Step2: 安裝JavaScript運行環境(NodeJS)
    • Step3: 復制應用程序、依賴包、配置文件
    • Step4: 執行啟動命令運行程序
  • 有了Docker后我們可以把下面的步驟給寫入Dockerfile里面,剩下的工作就交給Docker來自動完成

在這里插入圖片描述

  • 需要先指定一個基礎鏡像,鏡像是按層次結構來構建的,每一層都是基于上一層的,所以要先指定一個基礎鏡像然后在這個鏡像的基礎上再添加我們的應用程序
  • 比如可以在一個基礎的linux鏡像開始然后安裝nodejs,也可以直接使用nodejs的鏡像,FROM node:14-alpine
  • 然后需要把我們的應用程序復制到鏡像中,可以使用copy命令來復制文件,COPY source dest,比如COPY index.js /index.js
  • 接下來需要在鏡像中運行應用程序,可以使用 CMD 命令來運行應用程序,CMD是個方括號,里面第一個參數表示可執行程序的名字,第二個參數表示可執行程序接收到的參數 CMD [ "node", "/index,js" ],也可以不用方括號,如 CMD node /index.js
  • 回到終端使用 docker build -t 鏡像名字 . 來構建鏡像,后面加的一個點表示的是當前目錄,也就是Dockerfile所在的目錄
  • docker image ls 或者是 docker images,查看所有的鏡像,latest表示最新版本
  • docker run 鏡像名字,即可執行當前鏡像文件

Docker Compose

  • 用于定義和運行多容器Docker應用程序的工具
  • 使用YAML文件來配置應用程序的服務
  • 一條命令即可創建并啟動所有服務

在這里插入圖片描述

  • 實際開發環境中這些服務是需要相互關聯著才能工作的,Docker Compose解決的就是這個問題,通過一個單獨的docker-compose.yaml的配置文件來將這一組互相關聯的容器組合在一起,形成一個項目,然后使用一條命令就可以啟動、停止或者重建這些服務,docker compose up

在這里插入圖片描述

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

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

相關文章

阿里云云原生數據庫PolarDB和普通云數據庫的區別?

文章目錄 前言一、云數據庫的演進&#xff1a;從“托管”到“原生”的跨越二、PolarDB的核心創新&#xff1a;重新定義云數據庫的能力邊界1. 存算分離架構&#xff1a;打破資源綁定的“枷鎖”2. 多模引擎與兼容生態&#xff1a;降低應用遷移成本3. 智能化運維&#xff1a;讓數據…

SNN學習(4):真實的生物神經學中神經元和人腦結構學習

目錄 一、基礎知識 1 簡單神經元回路中的信號運作 2 高級功能相關的復雜神經元回路 3 細胞體、樹突和軸突 3.1 神經元細胞 3.2 非神經元細胞 3.3 神經膠質細胞 3.4 神經細胞的信號傳遞 3.4.1 動作電位的特性 3.4.2 興奮和抑制 3.4.3 電傳遞 二、大腦皮層及視覺系統…

第六天 界面操作及美化(6.1 建立菜單及異步調用)

6.1 建立菜單及異步調用 在程序中&#xff0c;菜單&#xff08;Menu&#xff09;是一種常見的用戶界面元素&#xff0c;在程序中起到了組織功能、提高用戶體驗、提供快捷方式和幫助文檔等重要作用。通過合理使用菜單&#xff0c;可以使程序的功能更加清晰、操作更加便捷&#…

論文解析:一文弄懂ResNet(圖像識別分類、目標檢測)

目錄 一、相關資源 二、Motivation 三、技術細節 1.殘差學習過程 2.快捷連接類型 (1)Identity Shortcuts&#xff08;恒等捷徑&#xff09; (2)Projection Shortcuts&#xff08;投影捷徑&#xff09; (3)兩種捷徑對比 3.深層瓶頸結構Deeper Bottleneck Architectures…

動態規劃算法的歡樂密碼(二):路徑問題

專欄&#xff1a;算法的魔法世界 個人主頁&#xff1a;手握風云 一、例題講解 1.1. 不同路徑 題目要求是計算從網格的左上角&#xff08;起點&#xff09;到右下角&#xff08;終點&#xff09;的所有不同路徑的數量。機器人每次只能向下或向右移動一步。如下圖所示&#xff0…

嵌入式相關開源項目、庫、資料------持續更新中

嵌入式相關開源項目、庫、資料------持續更新中 學習初期最難找的就是找學習資料了&#xff0c;本貼精心匯總了一些嵌入式相關資源&#xff0c;包括但不限于編程語言、單片機、開源項目、物聯網、操作系統、Linux、計算機等資源&#xff0c;并且在不斷地更新中&#xff0c;致力…

圖像處理與機器學習項目:特征提取、PCA與分類器評估

圖像處理與機器學習項目:特征提取、PCA與分類器評估 項目概述 本項目將完成一個完整的圖像處理與機器學習流程,包括數據探索、特征提取、主成分分析(PCA)、分類器實現和評估五個關鍵步驟。我們將使用Python的OpenCV、scikit-learn和scikit-image庫來處理圖像數據并實現機器…

MATLAB | 如何使用MATLAB獲取《Nature》全部繪圖 (附23-25年圖像)

文末有全部圖片資源 我在兩年前更過如何用 MATLAB 爬取 《Nature》全部插圖&#xff0c;最近又有人問我有沒有下載好的24&#xff0c;25年插圖的壓縮包&#xff0c;于是又去拿代碼運行了一下&#xff0c;發現兩年前寫的代碼今天居然還能用&#xff0c;代碼如下&#xff1a; f…

中國老年健康調查(CLHLS)數據挖掘教程(1)--CLHLS簡介和數據下載

北京大學“中國老年健康影響因素跟蹤調查&#xff08;簡稱‘中國老年健康調查’&#xff1b;英文名稱為Chinese Longitudinal Healthy Longevity Survey (CLHLS)&#xff09;”及交叉學科研究由國家自然科學基金委主任基金應急項目、重大項目、重點項目及國際合作項目。1998-20…

基本多線程編譯make命令

背景&#xff1a; 在ffmpeg源碼編譯的時候要等很久&#xff0c;快下班了&#xff0c;等不及。 解決方法&#xff1a; 使用多線程編譯。 make -j{n} 如&#xff1a; make -j8詳解&#xff1a;&#xff08;沒時間看的可以返回了&#xff01;&#xff09; 在編譯 FFmpeg 時使用…

MNIST數據集上樸素貝葉斯分類器(MATLAB例)

MNIST數據集上樸素貝葉斯分類器 Naive Bayes Classification fitcnb Train multiclass naive Bayes model Syntax Mdl fitcnb(Tbl,ResponseVarName) Mdl fitcnb(Tbl,formula) Mdl fitcnb(Tbl,Y) Mdl fitcnb(X,Y) Mdl fitcnb(___,Name,Value) [Mdl,AggregateOptimization…

網站設計小技巧:利用交互設計提升用戶體驗

現在很多企業朋友都會感覺到&#xff0c;做網站設計掌握不好設計網頁的魂&#xff0c;換了很多設計方式可能效果都不理想。蒙特網站專注高端網站建設20多年&#xff0c;基于為華為、字節跳動、海康威視等頭部企業打造網站的經驗&#xff0c;今天將近期用戶比較喜歡的網頁設計方…

Github指南-Add .gitignore和Choose a license

Add .gitignore&#xff08;添加忽略文件列表&#xff09; &#x1f4cc; 作用&#xff1a; .gitignore 文件用于告訴 Git 哪些文件或文件夾**不要被上傳&#xff08;版本控制&#xff09;**&#xff0c;例如&#xff1a; 編譯生成的臨時文件&#xff08;如 .exe, .o&#x…

如何打造沉浸式文件操作體驗

在操作系統長期運行后&#xff0c;本地文件系統往往會面臨一個常見卻棘手的問題&#xff1a;元數據管理效率下降&#xff0c;導致用戶在海量文件中檢索目標內容時出現顯著的延遲與操作成本。這種現象在未使用標簽化或語義化管理系統的情況下尤為明顯。 而 Oversis 的出現&…

企業AI深水區突圍:從星辰大海到腳下泥濘的進化論

一、業務價值旅程&#xff1a;從降本增效到價值躍遷 1.1 技術落地的"甜蜜陷阱" 企業在AI應用初期往往陷入"高配用不起&#xff0c;低配用不了"的困境。一臺8卡A100服務器每月電費超3萬元的成本&#xff0c;對制造業利潤形成巨大擠壓。即便跨過算力門檻&a…

PostgreSQL的擴展moddatetime

PostgreSQL的擴展moddatetime moddatetime 是 PostgreSQL 的一個內置擴展&#xff0c;用于自動維護表的最后修改時間字段。這個擴展可以自動更新指定字段為當前時間戳&#xff0c;非常適合需要跟蹤記錄最后修改時間的應用場景。 一、moddatetime 基本功能 核心特性 自動更新…

自己的電腦搭建外網訪問網站服務器的步驟

文章目錄 PC電腦做網站服務器的步驟1.前言2. 網站服務器系統的安裝2.1個人電腦安裝IIS&#xff08;Windows7系統安裝IIS7.0&#xff09;2.1.1&#xff1a;打開控制面板&#xff0c;給Windows安裝插件 2.2網站配置&#xff1a;2.2.1打開網站配置項&#xff1a;2.2.2開始配置&…

基于深度學習的智能語音合成系統:技術與實踐

前言 隨著人工智能技術的飛速發展&#xff0c;智能語音合成&#xff08;Text-to-Speech, TTS&#xff09;技術已經成為人機交互領域的重要組成部分。從智能助手到有聲讀物&#xff0c;語音合成技術正在改變我們與數字內容的交互方式。近年來&#xff0c;深度學習技術為語音合成…

鑄鐵平臺的制造工藝復雜而精細

鑄鐵平臺的制造工藝確實復雜而精細。首先&#xff0c;需要選擇合適的鑄鐵材料&#xff0c;通常是灰鑄鐵或球墨鑄鐵&#xff0c;以滿足平臺的強度和耐磨性要求。然后&#xff0c;根據設計要求&#xff0c;制作模具&#xff0c;并在高溫下將鐵液倒入模具中進行鑄造。在鑄造過程中…

ArcPy 與 ArcGIS .NET SDK 讀取 GDB 要素類坐標系失敗?GDAL 外掛方案詳解

ArcPy 與 ArcGIS .NET SDK 讀取 GDB 要素類坐標系失敗&#xff1f;GDAL 外掛方案詳解 在ArcGIS Pro中正常顯示的坐標系&#xff0c;為何通過ArcPy或.NET SDK卻無法正確讀取&#xff1f;本文將分享我在處理CGCS2000坐標系時的踩坑經歷&#xff0c;以及最終通過GDAL外掛方案解決問…