Docker入門指南(超詳細)

一、什么是docker

????????在云計算和微服務架構盛行的今天,Docker 作為容器技術的標桿,徹底改變了應用部署和運行的方式。簡單來說,Docker 是一個開源的容器化平臺,它通過將應用程序及其依賴環境打包成一個輕量級、可移植的容器,實現了 “一次構建,到處運行” 的終極目標。

二、為什么需要Docker?

在學習技術之前,我們先搞懂一個問題:為什么要用 Docker?

如果你經歷過這些場景,那 Docker 就是為你準備的:

  • 開發時:“我本地能跑啊,怎么到你那就報錯了?”
  • 部署時:“服務器環境少了個依賴,等我裝一下... 哦不對,版本不對!”
  • 運維時:“這臺服務器跑了 10 個應用,資源互相搶占,崩潰了都不知道是誰的鍋。”

????????Docker 的出現就是為了解決這些問題。它通過容器化技術,把應用和依賴 “打包” 成一個獨立的 “容器”,實現了 “一次構建,到處運行”。無論在開發機、測試環境還是生產服務器,容器里的應用運行結果完全一致,徹底告別 “環境不一致” 的噩夢。

三、Docker 的核心概念

要理解 Docker,需先掌握以下核心概念:

1.?鏡像(Image)

  • 定義:鏡像可以理解為一個 “只讀模板”,包含了運行應用所需的代碼、庫、環境變量、配置文件等所有依賴。例如,一個 Nginx 鏡像包含了 Nginx 服務器的所有運行文件。
  • 特性
    • 只讀性:鏡像一旦構建完成,就無法修改,確保環境一致性。
    • 分層存儲:鏡像由多個只讀層疊加而成,相同層可被多個鏡像共享,節省存儲空間。
    • 可繼承性:通過?Dockerfile?基于基礎鏡像(如?ubuntucentos)構建新鏡像,簡化配置。

2.?容器(Container)

  • 定義:容器是鏡像的運行實例,是鏡像在內存中的動態表現形式。它在鏡像的只讀層之上添加了一個可寫層,所有運行時的修改(如文件創建、配置變更)都保存在這一層。
  • 特性
    • 隔離性:容器之間通過 namespace 隔離進程、網絡、文件系統等資源,互不干擾。
    • 輕量級:容器共享宿主機的內核,無需像虛擬機一樣模擬完整操作系統,啟動速度快(秒級)、資源占用低。
    • 可移植性:相同鏡像在任何支持 Docker 的環境中運行結果一致,解決 “開發環境能跑,生產環境報錯” 的問題。

3.?倉庫(Repository)

  • 定義:倉庫是用于存放和分發 Docker 鏡像的平臺,類似代碼倉庫(如 GitHub),你可以從倉庫拉取別人做好的鏡像,也可以把自己構建的鏡像推到倉庫分享。。
  • 常見倉庫
    • Docker Hub:官方公共倉庫Docker Hub(https://hub.docker.com/),里面有數十萬現成的鏡像(比如 MySQL、Redis、Nginx 等),直接拿來就能用。。
    • 私有倉庫:企業或團隊內部搭建的倉庫(如 Harbor),用于存儲私有鏡像,保障安全性。

四、Docker 安裝:3 步搞定環境搭建

接下來我們動手安裝 Docker,支持 Windows、macOS 和 Linux,步驟都很簡單:

1. Windows 安裝

  • 系統要求:Windows 10/11 專業版 / 企業版(需開啟 Hyper - V),或使用 WSL2;
  • 下載地址:Docker Desktop for Windows;
  • 安裝:雙擊安裝包,一路 “下一步”,安裝完成后啟動 Docker(桌面會出現鯨魚圖標)。

2. Linux 安裝(以 Ubuntu 為例)

# 更新包索引
sudo apt-get update
# 安裝依賴
sudo apt-get install ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 設置穩定版倉庫
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安裝Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 驗證安裝(運行hello-world)
sudo docker run hello-world

安裝完成后,運行docker --version查看版本,出現類似Docker version 24.0.6, build ed223bc的輸出就說明安裝成功了!

五、Docker 的基本工作流程

  1. 構建鏡像
    通過編寫?Dockerfile?定義鏡像的構建步驟(如基礎鏡像選擇、依賴安裝、應用部署等),然后執行?docker build?命令生成鏡像。
    示例?Dockerfile?片段:

    FROM python:3.9  # 基礎鏡像
    WORKDIR /app      # 工作目錄
    COPY . .          # 復制本地文件到容器
    RUN pip install -r requirements.txt  # 安裝依賴
    CMD ["python", "app.py"]  # 容器啟動命令
    

  2. 分發鏡像
    將構建好的鏡像推送到倉庫(如 Docker Hub 或私有倉庫),供其他環境或團隊成員使用。

  3. 運行容器
    從倉庫拉取鏡像,通過?docker run?命令創建并啟動容器,指定端口映射、數據卷掛載等參數。
    示例:docker run -d -p 8080:80 --name myapp myapp:v1
    (-d 后臺運行,-p 端口映射,--name 容器名稱)

  4. 管理容器生命周期
    通過命令停止(docker stop)、啟動(docker start)、刪除(docker rm)容器,或查看日志(docker logs)、進入容器(docker exec)等。

六、Docker 常用命令

操作場景命令示例說明
鏡像相關docker pull [鏡像名]從倉庫拉取鏡像
docker build -t [鏡像名:版本] .基于 Dockerfile 構建鏡像
docker images查看本地鏡像列表
容器相關docker run -d -p 80:80 --name [容器名] [鏡像名]創建并啟動容器(-d 后臺運行,-p 端口映射)
docker ps查看運行中的容器
docker ps -a查看所有容器(包括停止的)
docker stop [容器名/ID]停止容器
docker rm [容器名/ID]刪除容器
倉庫相關docker push [鏡像名:版本]推送鏡像到倉庫

六、實戰:用 Docker 部署一個 Node.js Web 應用

光說不練假把式,我們來實戰部署一個簡單的 Node.js Web 應用,體驗完整的 Docker 流程:

1. 準備應用代碼

創建一個簡單的 Node.js 應用,目錄結構如下:

myapp/
├── app.js       # 應用代碼
├── package.json # 依賴配置
└── Dockerfile   # Docker構建文件

app.js內容:

const http = require('http');
const port = 3000;
const server = http.createServer((req, res) => {res.statusCode = 200;res.setHeader('Content-Type', 'text/plain');res.end('Hello Docker! This is my Node.js app.\n');
});
server.listen(port, () => {console.log(`Server running at http://localhost:${port}/`);
});

package.json內容:

{"name": "my-docker-app","version": "1.0.0","main": "app.js","dependencies": {}
}

2. 編寫 Dockerfile:定義鏡像構建規則

Dockerfile是構建鏡像的 “說明書”,內容如下:

# 基礎鏡像:使用Node.js官方鏡像(包含Node環境)
FROM node:16-alpine# 設置工作目錄(容器內的目錄)
WORKDIR /app# 復制本地文件到容器的工作目錄
COPY package*.json ./
COPY app.js ./# 安裝依賴(因為package.json中無依賴,這步可省略,但保留規范)
RUN npm install# 暴露容器的3000端口(告訴Docker容器會使用這個端口)
EXPOSE 3000# 容器啟動命令(運行Node應用)
CMD ["node", "app.js"]

3. 構建鏡像與運行容器

# 進入myapp目錄,構建鏡像(-t指定鏡像名和版本)
docker build -t my-node-app:v1 .# 查看構建好的鏡像
docker images | grep my-node-app
# 輸出:my-node-app   v1        abc123456789   1 minute ago   110MB# 運行容器(映射宿主機3000端口到容器3000端口)
docker run -d -p 3000:3000 --name myapp-container my-node-app:v1# 訪問應用:打開瀏覽器訪問 http://localhost:3000,能看到“Hello Docker! This is my Node.js app.”就成功了!

4. 推送鏡像到倉庫(可選)

如果你想把鏡像分享給團隊或部署到服務器,可以推送到 Docker Hub(需先注冊賬號并登錄):

# 登錄Docker Hub
docker login# 給鏡像打標簽(格式:用戶名/鏡像名:版本)
docker tag my-node-app:v1 你的用戶名/my-node-app:v1# 推送鏡像到倉庫
docker push 你的用戶名/my-node-app:v1

?七、Docker 進階:數據持久化與網絡配置

實際應用中,我們還需要解決數據持久化(容器刪除后數據不丟失)和容器間通信的問題。

1. 數據卷(Volume):讓數據 “長生不老”

容器內的數據默認是臨時的,容器刪除后數據會丟失。用數據卷可以將容器內的目錄映射到宿主機,實現數據持久化:

# 創建數據卷
docker volume create nginx-data# 運行Nginx容器并掛載數據卷(將容器的/usr/share/nginx/html目錄映射到nginx-data卷)
docker run -d -p 8080:80 -v nginx-data:/usr/share/nginx/html --name mynginx nginx# 現在往宿主機的數據卷目錄寫文件,容器內會同步(數據卷在宿主機的路徑可通過docker inspect查看)

2. 網絡配置:讓容器 “互聯互通”

Docker 默認提供了橋接網絡,容器可以通過名稱或 IP 通信:

# 創建自定義網絡
docker network create my-network# 運行兩個容器并加入同一網絡
docker run -d --name app1 --network my-network my-node-app:v1
docker run -d --name app2 --network my-network nginx# 在app1容器中訪問app2(通過容器名)
docker exec -it app1 ping app2
# 能ping通說明網絡連通成功

八、總結與后續學習方向

通過這篇文章,你已經掌握了 Docker 的核心概念、安裝方法、基礎命令和實戰部署流程。Docker 的核心價值在于環境一致性、輕量級隔離和快速部署,這些特性讓它成為現代軟件開發和云原生架構的基石。

后續可以深入學習這些內容:

  • Docker Compose:多容器應用編排工具,通過 yaml 文件定義多個容器的關系;
  • Docker Swarm:Docker 原生的容器集群管理工具;
  • Kubernetes(K8s):容器編排王者,用于大規模容器集群的管理(Docker 是基礎);
  • Docker 進階技巧:鏡像優化(減小體積)、多階段構建、私有倉庫搭建等。

Docker 不難,多動手實踐就能熟練掌握。從今天開始,用 Docker 規范你的開發環境,提升部署效率吧!如果有問題,歡迎在評論區交流~

?

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

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

相關文章

學習秒殺系統-實現秒殺功能(商品列表,商品詳情,基本秒殺功能實現,訂單詳情)

文章目錄前言數據庫設計秒殺商品列表頁秒殺商品詳情實現簡單秒殺訂單詳情前言 由于慕課課程中是先實現最基本的功能然后對其壓測,壓測那個地方出問題,然后在對其優化。所以本文記錄的也是實現的是簡單的秒殺功能沒有涉及到高并發的優化。 數據庫設計 …

React 的常用鉤子函數在Vue中是如何設計體現出來的。

1、定義響應式數據: React 通過 useState 和 useReducer Vue 通過 ref 和 reactiveconst [state, setState] useState(initialState)const [state, dispatch] useReducer(reducer, initialState)2、定義緩存數據: React 通過 memo 和 useMemo useCal…

開源的 H.264/AVC 視頻編碼器庫-x264 的交叉編譯 和 程序測試

一、環境準備 安裝交叉編譯工具鏈 根據目標ARM架構選擇對應工具鏈(如arm-linux-gnueabihf-):# Ubuntu/Debian系統 sudo apt-get install gcc-arm-linux-gnueabihf g-arm-linux-gnueabihf# 驗證安裝 arm-linux-gnueabihf-gcc --version或者手動…

自由學習記錄(69)

RectToPolar() 是 將直角坐標系 (笛卡爾坐標系) 的 uv 坐標,轉化為極坐標系(θ,r) uv - centerUV:將坐標原點平移,使 (0.5, 0.5) 變成原點。 r length(uv):距離中心點的半徑(從中…

Spring Boot 敏感信息入庫加密全面解決方案

Spring Boot 敏感信息入庫加密全面解決方案 在當今數據驅動的時代,保護用戶隱私數據已成為系統設計的必備要求。本文將詳細介紹 Spring Boot 應用中敏感數據加密存儲的完整方案,涵蓋從基礎實現到生產級落地的全流程。 一、加密方案選型 1.1 常見加密類型對比 加密類型特點…

docker0網卡沒有ip一步解決

正常查看ip的時候一直顯示沒有ip這里先刪除docker0網卡ip link delete docker0然后重啟服務systemctl restart docker再次查看顯示有ip了并且查看配置文件也是正常的cat /etc/docker/daemon.json {"registry-mirrors": ["https://docker.m.daocloud.io",&q…

MYSQL-索引篇

索引結構概述MySQL 的索引是在存儲引擎層實現的,不同的存儲引擎有不同的索引結構,主要包含以下幾種:索引結構描述BTree索引最常見的索引類型,大部分引擎都支持 B 樹索引Hash索引底層數據結構是用哈希表實現的,只有精確…

(純新手教程)HTML零基礎教學

(下一章:python網絡爬蟲)HTML 簡介HTML(HyperText Markup Language,超文本標記語言)是用于創建網頁的標準標記語言。什么是 HTML?HTML 不是編程語言,而是一種標記語言使用標簽來描述…

前端面試寶典---項目難點2-智能問答對話框采用虛擬列表動態渲染可視區域元素(10萬+條數據)

引言 在我參與智能問答項目中一個智能體回話并不會像豆包一樣,每次新建會話都是是從頭開始,而項目中你想創建新會話就像chatbox一樣,是點擊橡皮擦開啟新的聊天上下文,但是直接的聊天記錄依然存在,針對超過十萬&#xf…

Python元組:不可變數據的強大用法

文章目錄元組概念1.基本特性2.創建元組3.訪問元素4.元組的不可變性5.元組操作6.元組解包7.命名元組8.元組與列表的比較9.元組的優勢10.適用場景11.常用方法小結元組 概念 元組是 Python 中一個非常重要的內置數據結構,它與列表(list)相似但具有關鍵差異。下面我將…

若爾蓋濕地的花湖

花湖位于若爾蓋縣和甘肅的郎木寺之間的213國道旁,屬于若爾蓋濕地國家級自然保護區內。又名“梅朵湖”,因陽光照射下湖面色彩斑斕如絢麗的花瓣得名。花湖的大門是梯形高大石柱搭成,我們需要過天橋到對面檢票坐小交通。通過車窗看到一層一層的云…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DoubleClickHeart(雙擊愛心)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DoubleClickHeart組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script se…

1-緒論-1-數據結構的基本概念

&#x1f389; 數據結構的魔法世界&#x1f4da;&#x1f468;?&#x1f393;“數據就像大海中的浪花&#xff0c;結構則是那神秘的洋流。掌握數據結構&#xff0c;就是掌握在信息海洋中自由航行的力量&#xff01;”引言&#xff1a;為什么要學數據結構&#xff1f;&#x1f…

linux網絡相關命令簡介

目錄 一、IP命令 1、Link或L:管理網絡接口(網卡) 2、Address或Addr,A:管理Ip地址 3、Route或R:管理路由表

教育培訓機構如何為課程視頻添加防盜錄的強水印?

在知識付費時代&#xff0c;教育培訓機構的課程視頻是核心資產&#xff0c;但盜錄、非法傳播等問題卻讓機構防不勝防。如何在不影響學員觀看體驗的前提下&#xff0c;為課程視頻添加“強效防盜水印”&#xff0c;精準追蹤泄露源頭&#xff1f;本文將為您揭秘高安全性水印的添加…

python的形成性考核管理系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 摘要 隨著…

A*算法詳解

A*算法詳解一、A*算法基礎概念1.1 算法定位1.2 核心評估函數1.3 關鍵數據結構二、A*算法的核心步驟三、啟發函數設計3.1 網格地圖中的啟發函數3.2 啟發函數的選擇原則三、Java代碼實現四、啟發函數的設計與優化4.1 啟發函數的可采納性4.2 啟發函數的效率影響4.3 常見啟發函數對…

.net winfrom 獲取上傳的Excel文件 單元格的背景色

需求&#xff1a;根據Excel某行標注了黃色高亮顏色&#xff0c;說明該行數據已被用戶選中(Excel文件中并沒有“已選中”這一列&#xff0c;純粹用顏色表示)&#xff0c;導入數據到數據庫時標注此行已選中直接上代碼&#xff1a;//選擇Excel文件private void btnBrowse_Click(ob…

OpenAI GPT-4o技術詳解:全能多模態模型的架構革新與生態影響

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; ?? 一、核心定義與發布背景 官方定位 GPT-4o&#xff08;“o”代表“…

? 構建真正的高性能即時通訊服務:基于 Netty 集群的架構設計與實現

引子 在前面的文章中&#xff0c;我們基于 Netty 構建了一套單體架構的即時通訊服務。雖然單體架構在開發初期簡單高效&#xff0c;但隨著用戶量的增長和業務規模的擴大&#xff0c;其局限性逐漸顯現。當面對高并發場景時&#xff0c;單體 Netty 服務很容易觸及性能天花板&…