一文快速了解Docker和命令詳解

本文讓你快速了解Docker是什么的東西,在我們程序開發的時候到底有什么作用,為什么需要去學習它。本文章只是做一個簡單的概述配套黑馬課程讓你快速了解、使用Docker。

一、什么是Docker?

Docker是一個開源的容器化平臺,允許開發者把應用和其所有的依賴項打包成一個單獨的標準化單元(即容器),并且可以在任何支持Docker環境下運行,相當于一次部署,終生運行。通過Docker部署,開發者就可以避免由電腦環境不一致導致——編寫的程序自己電腦可以運行,部署到別人的電腦就不可以運行。它使得應用在不同的計算環境中具有更高的一致性,減少了環境配置和依賴管理的問題。

如何理解這段話呢?就是相當于,一個容器就是一臺電腦,每個電腦可以安裝相應的依賴項。所以說他是一個獨立的環境,那么為什么說可以在任何支持Docker環境下運行,因為所有依賴都在Docker部署容器里面,只要支持Docker環境,Docker容器技術就可以根據程序所需要依賴自動實現部署。但是有個問題每個容器都需自己下載依賴嗎?有沒有一個統一的像Maven庫一樣,只需要一次下載,后續其他容器無需下載直接安裝?

二、Docker 的主要組成部

  1. Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心組件,負責構建、運行和管理容器。它分為兩部分:
    • Docker Daemon:后臺服務,管理容器的生命周期。
    • Docker CLI(命令行界面):用戶與 Docker 交互的命令行工具。
  2. 鏡像(Image):鏡像是構建 Docker 容器的模板,包含運行應用所需的操作系統、庫、依賴和應用本身。鏡像是不可變的,一旦創建便不會改變。
  3. 容器(Container):容器是鏡像的一個實例,它運行在 Docker 引擎上。容器具有輕量性、可移植性和隔離性。
  4. Docker Hub:一個公共的 Docker 鏡像倉庫,提供了大量的公共鏡像(例如:nginx、mysql 等),用戶也可以將自己創建的鏡像上傳到這里。
  5. Dockerfile:是一個文本文件,包含了一系列指令,用來描述如何構建 Docker 鏡像。通過 Dockerfile,開發者可以自動化地構建鏡像。

鏡像就是容器的一個運行環境,不僅僅包括依賴和應用本身,還包括可以自己設置容器的操作系統等,其中Docker Hub,就是我之前第一段提出的問題——有沒有一個統一的像Maven庫一樣,只需要一次下載,后續其他容器無需下載直接安裝?Docker Hub就是解決這個問題的,提供了大量的公共鏡像(例如:nginx、mysql 等),用戶也可以將自己創建的鏡像上傳到這里。

三、Docker的基礎

3.1.1 常見的命令

命令說明文檔地址
docker pull拉取鏡像docker pull
docker push推送鏡像到 Docker Registrydocker push
docker images查看本地鏡像docker images
docker rmi刪除本地鏡像docker rmi
docker run創建并運行容器(不能重復創建)docker run
docker stop停止指定容器docker stop
docker start啟動指定容器docker start
docker restart重新啟動容器docker restart
docker rm刪除指定容器docker rm
docker ps查看容器docker ps
docker logs查看容器運行日志docker logs
docker exec進入容器docker exec
docker save保存鏡像到本地壓縮文件docker save
docker load加載本地壓縮文件到鏡像docker load
docker inspect查看容器詳細信息docker inspect

詳細的說明可以去命令文檔

3.1.2 圖解Docker命令

在這里插入圖片描述

  • docker pulldocker push 表明可以從官方的鏡像倉庫中拉取和上傳鏡像到本地
  • docker savedocker load 表明也可以從自己虛擬機中加載虛擬機內的鏡像。(Docker一般是部署到虛擬機內)
  • DOCKERFILE ,是定義鏡像構建過程的腳本文件,里面描述了基礎鏡像、安裝軟件、拷貝代碼、暴露端口等操作。這塊后面和提及到,其命令 docker build 是 然后按照文件里的指令,一步步生成一個新的 Docker 鏡像
  • docker images 表示可以查看自己的鏡像,docker rmi 表示刪除自己的鏡像
  • docker run 表示運行一個容器,配置鏡像相關的配置文件掛載
  • 其中命令在上面已經很詳細的介紹了
示例命令流程(以Nginx為例)
# 第1步,查看Nginx鏡像
https://hub.docker.com/_/nginx# 第2步,拉取鏡像
docker pull nginx# 第3步,查看鏡像
docker images# 第4步,運行容器
docker run -d --name nginx -p 80:80 nginx# 第5步,查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第6步,訪問網頁
http://<虛擬機地址># 第7步,停止容器
docker stop nginx# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第9步,重新啟動容器
docker start nginx# 第10步,查看詳情
docker inspect nginx# 第11步,進入容器
docker exec -it nginx bash# 第12步,刪除容器
docker rm -f nginx

3.2.1 數據卷

數據卷是Docker提供的一種持久數據化的機制,當容器被刪除的時候,里面數據文件(日志、數據庫數據)也全部刪除,而且一般想打開容器中的文件,都是需要命令行,這樣操作起來很不方便,數據卷就是解決這些問題的,它可以實現將容器中的文件與部署的虛擬機的文件建立映射關系,也被稱做掛載。

舉一個Nginx的例子,掛載Nginx配置和HTML目錄
docker run -d \--name nginx \-p 80:80 \-v /host/html:/usr/share/nginx/html \-v /host/nginx.conf:/etc/nginx/nginx.conf \nginx
  • html:放置一些靜態資源
  • conf:放置配置文件

如果我們要讓Nginx代理我們的靜態資源,最好是放到html目錄;如果我們要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

但遺憾的是,容器運行的Nginx所有的文件都在容器內部。所以我們必須利用數據卷將兩個目錄與宿主機目錄關聯,方便我們操作。如圖:

相當于把Nginx容器中的目錄文件和宿主機(虛擬機)建立聯系,這樣我修改宿主機的文件就相當于修改Nginx容器中的文件。

注意:/var/lib/docker/volumes這個目錄就是默認的存放所有容器數據卷的目錄,也再根據數據卷名稱創建新目錄,格式為/數據卷名/_data

其實不建議指定宿主機的自定義目錄,這樣就和宿主機建立強耦合,換一臺宿主機就需要保證有這個自定義目錄

在這里插入圖片描述

數據卷常用命令
命令說明文檔地址
docker volume create創建數據卷docker volume create
docker volume ls查看所有數據卷docs.docker.com
docker volume rm刪除指定數據卷docs.docker.com
docker volume inspect查看某個數據卷的詳情docs.docker.com
docker volume prune清除數據卷docker volume prune

3.3 鏡像

鏡像這里我們之前也說了,這里主要是講一下,我們該怎么把我寫好的程序或者項目打包成鏡像上傳到Docker

3.3.1 鏡像結構

Docker鏡像是由多層結構組成的,每一層代表鏡像構建過程中的一個步驟。它使用的是一種叫UnionFS(聯合文件系統)的技術。

鏡像是一堆文件的集合,但是這些文件不是隨便放的,而是需要根據操作步驟進行疊放起來,形成一個邏輯上的文件系統。通常是通過Dockerfile文件創建的,而Dockerfile文件每一條命令(如RUN、COPY、ADD)都會創建一層。

在這里插入圖片描述

為什么要采用分層結構,其實這樣是為了共享公共層,**例如:**當我們需要構建一個 Java 應用的鏡像時,第一步通常是基于某個 Linux 系統鏡像(比如 Ubuntu、Alpine)作為基礎層。如果我們已經有這個 Linux 層,那么在構建 Java 鏡像時,就可以直接在這個公共基礎層上“疊加” Java 運行環境和應用層。

3.3.2 Dockerfile

Dockerfile 是用于構建鏡像的腳本文件,里面定義了如何一步步構建鏡像,每一條指令都會生成鏡像的一層。

Dockerfile 示例:SpringBoot項目
# 使用官方 Java 運行時基礎鏡像
FROM openjdk:17-jdk-slim# 設置工作目錄
WORKDIR /app# 將打包后的 jar 文件復制到容器中
COPY target/springboot-docker-demo-0.0.1-SNAPSHOT.jar app.jar# 容器啟動時運行 Spring Boot 應用
ENTRYPOINT ["java", "-jar", "app.jar"]# 可選:聲明端口(不代表實際映射)
EXPOSE 8080

3.4 網絡

前面說了,Docker容器相當于一個計算機,那么如何實現容器之間的通信,這里就需要借助Docker網絡,用于管理容器之間的通信,大致流程:

  • Docker 啟動時會創建一個虛擬網橋(docker0);
  • 每個容器都會分配一個虛擬網卡(veth pair);
  • Docker 通過 NAT(iptables)轉發容器網絡請求;
  • 內部使用 libnetwork 管理網絡驅動、端點等資源。
常見的命令
命令說明文檔地址
docker network create創建一個網絡docker network create
docker network ls查看所有網絡docs.docker.com
docker network rm刪除指定網絡docs.docker.com
docker network prune清除未使用的網絡docs.docker.com
docker network connect使指定容器連接加入某網絡docs.docker.com
docker network disconnect使指定容器連接離開某網絡docker network disconnect
docker network inspect查看網絡詳細信息docker network inspect

在一個集成了 Spring Boot、MySQL、Redis、Nginx 等組件的項目中,如果將每個服務都分別封裝為獨立的容器,那么為了確保它們之間能夠正常通信,我們通常會為該項目創建一個自定義 Docker 網絡。這樣一來,所有相關服務容器都可以在該網絡中通過容器名互相訪問,同時也實現了與其他項目或容器的網絡隔離,提高了系統的安全性和可維護性。

四、項目部署例子

當我們需要部署一個 Spring Boot、MySQL、Redis、Nginx項目,我們可以借助docker-compose.yml(這個創建每個容器的命令和加入相同的網絡)

version: '3.8'services:mysql:image: mysql:8.0container_name: mysqlenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: mydbMYSQL_USER: userMYSQL_PASSWORD: passports:- "3306:3306"volumes:- mysql_data:/var/lib/mysqlnetworks:- backendredis:image: redis:7container_name: redisports:- "6379:6379"networks:- backendspringboot:build:context: ./appdockerfile: Dockerfilecontainer_name: springbootdepends_on:- mysql- redisports:- "8080:8080"environment:SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydbSPRING_DATASOURCE_USERNAME: userSPRING_DATASOURCE_PASSWORD: passSPRING_REDIS_HOST: redisnetworks:- backendnginx:image: nginx:latestcontainer_name: nginxports:- "80:80"volumes:- ./nginx/default.conf:/etc/nginx/conf.d/default.confdepends_on:- springbootnetworks:- backendvolumes:mysql_data:networks:backend:driver: bridge

五、小結

  • Docker 解決了應用跨平臺部署問題
  • 容器技術讓環境隔離、安全、可復制
  • 使用 Docker Compose 可輕松構建多服務架構
  • 鏡像構建、數據卷管理、網絡配置是核心技能

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

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

相關文章

【GaussDB】如何從GaussDB發布包中提取出內核二進制文件

【GaussDB】如何從GaussDB發布包中提取出內核二進制文件 背景 GaussDB 從505和506版本起&#xff08;前面的版本不清楚&#xff09;&#xff0c;華為官方不再提供用腳本安裝GaussDB的方式&#xff08;應該是基于運維交付標準化的角度考慮&#xff09;&#xff0c;僅支持使用T…

ETH 交易流程深度技術詳解

概述在前面對 PolkaVM 和 Revive 的文章中&#xff0c;我們介紹了很多技術細節&#xff0c;開發工具。還對比 EVM&#xff0c;知道了 PolkaVM 的優勢。很多同學還是對 Polkadot SDK 為什么可以運行 EVM 兼容的智能合約&#xff0c;以及交易處理的整個流程不太清楚。這篇文章將會…

【算法訓練營Day17】二叉樹part7

文章目錄二叉樹的最近公共祖先二叉搜索樹的最近公共祖先二叉搜索樹中的插入操作刪除二叉搜索樹中的節點二叉樹的最近公共祖先 題目鏈接&#xff1a;236. 二叉樹的最近公共祖先 解題邏輯&#xff1a; 最近公共祖先的定義為&#xff1a;對于有根樹 T 的兩個節點 p、q&#xff0c…

Vue插件與組件核心區別詳解

在 Vue 中&#xff0c;插件&#xff08;Plugin&#xff09; 和 組件&#xff08;Component&#xff09; 是兩種不同層次的概念&#xff0c;它們的主要區別如下&#xff1a;1. 組件 (Component) 定義&#xff1a; Vue 應用的基本構建單元&#xff0c;是可復用的 Vue 實例&#x…

基礎NLP | 02 深度學習基本原理

文章目錄 深度學習基本原理 數學基礎 線代 numpy 常用操作 導數, 梯度 梯度下降法 梯度下降代碼 GradientDescent.py 反向傳播 完整的反向傳播過程 權重更新方式 pytorch 網絡結構 全連接層 (線性層) 例子 - 手動實現模擬一個線性層 DNNforward.py 激活函數 激活函數-Sigmoid…

MySQL面試題及詳細答案 155道(001-020)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Ansible安裝與入門

目錄 Ansible ansible任務執行模式 ansible執行流程 ansible命令執行過程&#xff08;背會&#xff09; ansible的安裝方式 ansible的程序結構&#xff08;yum安裝為例&#xff09; ansible的配置文件查找順序&#xff08;背會&#xff09; 核心配置文件 ansible的配置…

【Spring】Spring Boot啟動過程源碼解析

目錄 一、啟動入口 二、SpringApplication的構造過程 2.1 設置應用類型 2.2 設置初始化器&#xff08;Initializer&#xff09; 2.2.1 獲取BootstrapRegistryInitializer對象 2.2.2 獲取ApplicationContextInitializer對象 2.3 設置監聽器&#xff08;Listener&#xff…

CDN架構全景圖

CDN架構全景圖 CDN&#xff08;內容分發網絡&#xff09;是一種通過在全球范圍內部署邊緣節點服務器&#xff0c;將內容緩存至離用戶最近的位置&#xff0c;從而加速內容分發、降低延遲并減輕源站壓力的分布式網絡架構。其核心設計目標是優化互聯網內容傳輸效率&#xff0c;提升…

【pytest高階】源碼的走讀方法及插件hook

一、pytest源碼走讀方法 依賴庫認知篇 &#x1f4e6;這是理解 pytest 源碼的 “前菜”&#xff0c;先認識 3 個超重要的小伙伴&#xff1a;iniconfig &#x1f4c4;&#xff1a;像個 “文件小管家”&#xff0c;專門負責讀取 ini 配置文件&#xff08;比如 pytest 的配置&#…

算法訓練營day32 動態規劃理論基礎、509. 斐波那契數、70. 爬樓梯、746. 使用最小花費爬樓梯

今天開始動態規劃的部分&#xff01; 其實說白了&#xff0c;動態規劃我感覺就是找類似遞歸的規律&#xff0c; 動態規劃理論基礎 動態規劃&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;簡稱DP&#xff0c;如果某一問題有很多重疊子問題&#xff0c;使用動態規…

基于神經網絡的手寫數字識別系統

基于神經網絡的手寫數字識別系統 結合模板匹配和神經網絡兩種方法進行手寫數字識別。這個系統包括圖像預處理、特征提取、神經網絡訓練和可視化分析。 %% 基于神經網絡的手寫數字識別系統%% 清理工作區 clear; clc; close all;%% 加載手寫數字數據集 % 使用MATLAB自帶的手寫數字…

機器學習?一文看懂這門熱門技術

&#x1f31f; 什么是機器學習&#xff1f;一文看懂這門熱門技術在人工智能&#xff08;AI&#xff09;的大潮中&#xff0c;機器學習&#xff08;Machine Learning, ML&#xff09; 無疑是最耀眼的明星之一。它讓計算機具備了 “自我學習” 的能力&#xff0c;讓自動駕駛、智能…

Spring的初始化鉤子

1. PostConstruct JSR-250 標準注解&#xff08;不是 Spring 獨有&#xff09;&#xff0c;用來標記 Bean 初始化完成后要執行的方法。會在 Bean 的構造方法執行完、依賴注入完成后執行。 使用實例&#xff1a; Component public class Demo {PostConstructpublic void init() …

【AI】Java生態對接大語言模型:主流框架深度解析

文章目錄1. Deep Java Library (DJL)2. LangChain4j&#xff08;LLM&#xff09;3. HuggingFace Inference API4. OpenAI Java Client技術對比矩陣架構設計建議在人工智能浪潮下&#xff0c;大語言模型&#xff08;LLM&#xff09;已成為技術核心。Java生態通過以下框架實現高效…

【06】C#入門到精通——C# 多個 .cs文件項目 同一項目下添加多個 .cs文件

文章目錄1 單個 .cs文件2 創建 多個 .cs文件2.1 添加Hero類2.1 添加ShowInfo類2.3 關于命名空間的引用2.4 所有.cs文件代碼3 test3項目文件下載1 單個 .cs文件 上一講中 描述游戲中英雄的角色 所有代碼在一個.cs文件中&#xff0c; 如果代碼很多&#xff0c;類很多&#xff0…

【MySQL基礎篇】:MySQL常用數據類型的選擇邏輯與正確使用

?感謝您閱讀本篇文章&#xff0c;文章內容是個人學習筆記的整理&#xff0c;如果哪里有誤的話還請您指正噢? ? 個人主頁&#xff1a;余輝zmh–CSDN博客 ? 文章所屬專欄&#xff1a;MySQL篇–CSDN博客 文章目錄數據類型1.數據類型分類2.數值類型int整形類型bit位類型float小…

三、搭建springCloudAlibaba2021.1版本分布式微服務-springcloud loadbalancer負載均衡

什么是負責均衡 Spring Cloud LoadBalancer是一個客戶端負載均衡器&#xff0c;類似于Ribbon&#xff0c;但是由于Ribbon已經進入維護模式&#xff0c;并且Ribbon 2并不與Ribbon 1相互兼容&#xff0c;所以Spring Cloud全家桶在Spring Cloud Commons項目中&#xff0c;添加了Sp…

Oracle不完全恢復實戰指南:從原理到操作詳解

核心提示&#xff1a;當誤刪表、日志損壞或控制文件丟失時&#xff0c;Oracle的不完全恢復是DBA最后的救命稻草。掌握關鍵恢復技術&#xff0c;可在數據災難中力挽狂瀾。一、不完全恢復核心概念 1. 核心特點 必須關閉數據庫&#xff1a;在MOUNT狀態下執行重做日志恢復權限要求&…

Linux之shell腳本篇(二)

一、shell編程之if語句引言Linux在shell編程中&#xff0c;通常都是以自上而下運行&#xff0c;但是為了提高其代碼嚴謹性&#xff0c;我們即引入了多條件 控制語句例如&#xff1a;if、for、while、case等語句&#xff0c;有時候針對條件我們還會結合正則表達式去運用。將這些…