本文讓你快速了解Docker是什么的東西,在我們程序開發的時候到底有什么作用,為什么需要去學習它。本文章只是做一個簡單的概述配套黑馬課程讓你快速了解、使用Docker。
一、什么是Docker?
Docker是一個開源的容器化平臺,允許開發者把應用和其所有的依賴項打包成一個單獨的標準化單元(即容器),并且可以在任何支持Docker環境下運行,相當于一次部署,終生運行。通過Docker部署,開發者就可以避免由電腦環境不一致導致——編寫的程序自己電腦可以運行,部署到別人的電腦就不可以運行。它使得應用在不同的計算環境中具有更高的一致性,減少了環境配置和依賴管理的問題。
如何理解這段話呢?就是相當于,一個容器就是一臺
電腦
,每個電腦
可以安裝相應的依賴項。所以說他是一個獨立的環境,那么為什么說可以在任何支持Docker環境下運行,因為所有依賴都在Docker部署容器里面,只要支持Docker環境,Docker容器技術就可以根據程序所需要依賴自動實現部署。但是有個問題每個容器都需自己下載依賴嗎?有沒有一個統一的像Maven庫一樣,只需要一次下載,后續其他容器無需下載直接安裝?
二、Docker 的主要組成部
- Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心組件,負責構建、運行和管理容器。它分為兩部分:
- Docker Daemon:后臺服務,管理容器的生命周期。
- Docker CLI(命令行界面):用戶與 Docker 交互的命令行工具。
- 鏡像(Image):鏡像是構建 Docker 容器的模板,包含運行應用所需的操作系統、庫、依賴和應用本身。鏡像是不可變的,一旦創建便不會改變。
- 容器(Container):容器是鏡像的一個實例,它運行在 Docker 引擎上。容器具有輕量性、可移植性和隔離性。
- Docker Hub:一個公共的 Docker 鏡像倉庫,提供了大量的公共鏡像(例如:nginx、mysql 等),用戶也可以將自己創建的鏡像上傳到這里。
- Dockerfile:是一個文本文件,包含了一系列指令,用來描述如何構建 Docker 鏡像。通過 Dockerfile,開發者可以自動化地構建鏡像。
鏡像就是容器的一個運行環境,不僅僅包括依賴和應用本身,還包括可以自己設置容器的操作系統等,其中
Docker Hub
,就是我之前第一段提出的問題——有沒有一個統一的像Maven庫一樣,只需要一次下載,后續其他容器無需下載直接安裝?Docker Hub
就是解決這個問題的,提供了大量的公共鏡像(例如:nginx、mysql 等),用戶也可以將自己創建的鏡像上傳到這里。
三、Docker的基礎
3.1.1 常見的命令
命令 | 說明 | 文檔地址 |
---|---|---|
docker pull | 拉取鏡像 | docker pull |
docker push | 推送鏡像到 Docker Registry | docker 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 pull
和docker push
表明可以從官方的鏡像倉庫中拉取和上傳鏡像到本地docker save
和docker 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 可輕松構建多服務架構
- 鏡像構建、數據卷管理、網絡配置是核心技能