Stories

Detail Return Return

【Spring開發】SpringCloud服務端基礎框架第2篇:3.Dockerfile自定義鏡像,4.Docker-C - Stories Detail

🏆🏆🏆教程全知識點簡介:Docker實用篇 0.學習目標 1.初識Docker 1.2.Docker和虛擬機的區別 2.Docker的基本操作 2.1.鏡像操作 2.1.3.案例1-拉取、查看鏡像 2.1.5.練習 3.Dockerfile自定義鏡像 3.3.構建Java項目 3.4.小結 4.Docker-Compose 4.3.部署微服務集羣 4.3.1.compose文件 4.3.3.打包 設置docker鏡像源 關閉 禁止開機啓動防火牆 安裝 修改權限 補全命令 RabbitMQ 1.初識MQ 1.1.同步和異步通訊 1.2.技術對比: 2.快速入門 2.2.RabbitMQ消息模型 2.3.導入Demo工程 2.4.入門案例 2.4.1.publisher實現 3.1.3.測試 3.2.WorkQueue 3.2.1.消息發送 3.2.4.能者多勞 3.3.發佈/訂閲 3.4.Fanout 3.4.1.聲明隊列和交換機 3.5.Direct 3.6.Topic 3.6.1.説明 SpringCloud01 1.認識微服務 1.1.單體架構 2.服務拆分和遠程調用 2.1.服務拆分原則 2.3.實現遠程調用案例 2.3.1.案例需求: 2.3.2.註冊RestTemplate 3)啓動多個user-service實 4.Ribbon負載均衡 4.1.負載均衡原理 4.2.源碼跟蹤 1)LoadBalancerIntercepor 3)負載均衡策略IRule 5.Nacos註冊中心 5.1.認識和安裝Nacos 5.2.服務註冊到nacos 1)引入依賴 2)配置nacos地址 3)重啓 5.3.服務分級存儲模型 5.3.2.同集羣優先的負載均衡 5.4.權重配置 Nacos安裝指南 1.Windows安裝 1.1.下載安裝包 1.2.解壓 1.3.端口配置 1.4.啓動 1.5.訪問 2.Linux安裝 2.1.安裝JDK 3.Gateway服務網關 3.1.為什麼需要網關 3.3.斷言工廠

<!-- start:bj1 -->

📚📚👉👉👉code git倉庫:   https://gitee.com/xiaoshuai112/Backend/blob/master/Spring/Spr... 直接get🍅🍅

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

3.Dockerfile自定義鏡像

常見的鏡像在DockerHub就能找到,但是 自己寫的項目就必須自己構建鏡像了。

而要自定義鏡像,就必須先了解鏡像的結構才行。

3.1.鏡像結構

鏡像是將應用程序及其需要的系統函數庫、環境、配置、依賴打包而成。

以MySQL為例,來看看鏡像的組成結構:

簡單來説,鏡像就是在系統函數庫、運行環境基礎上,添加應用程序文件、配置文件、依賴文件等組合,然後編寫好啓動腳本打包在一起形成的文件。

要構建鏡像,其實就是實現上述打包的過程。

3.2.Dockerfile語法

構建自定義的鏡像時,並不需要一個個文件去拷貝,打包。

只需要告訴Docker, 的鏡像的組成,需要哪些BaseImage、需要拷貝什麼文件、需要安裝什麼依賴、啓動腳本是什麼,將來Docker會幫助 構建鏡像。

而描述上述信息的文件就是Dockerfile文件。

Dockerfile就是一個文本文件,其中包含一個個的指令(Instruction),用指令來説明要執行什麼操作來構建鏡像。每一個指令都會形成一層Layer。

更新詳細語法説明,請參考官網文檔: https://docs.docker.com/engine/reference/builder

3.3.構建Java項目

3.3.1.基於Ubuntu構建Java項目

需求:基於Ubuntu鏡像構建一個新鏡像,運行一個java項目

  • 步驟1:新建一個空文件夾docker-demo

  • 步驟2:拷貝課前資料中的docker-demo.jar文件到docker-demo這個目錄

  • 步驟3:拷貝課前資料中的jdk8.tar.gz文件到docker-demo這個目錄

  • 步驟4:拷貝課前資料提供的Dockerfile到docker-demo這個目錄

Maven 官方文檔

其中的內容如下:

# 指定基礎鏡像
FROM ubuntu:16.04
# 配置環境變量,JDK的安裝目錄
ENV JAVA_DIR=/usr/local

# 拷貝jdk和java項目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安裝JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置環境變量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 入口,java項目的啓動命令
ENTRYPOINT java -jar /tmp/app.jar

Apache HttpClient 文檔

  • 步驟5:進入docker-demo

    將準備好的docker-demo上傳到虛擬機任意目錄,然後進入docker-demo目錄下

  • 步驟6:運行命令:

    docker build -t javaweb:1.0 .

W3Schools Java

最後訪問 http://192.168.150.101:8090/hello/count,其中的ip改成你的虛擬機ip

3.3.2.基於java8構建Java項目

雖然 可以基於Ubuntu基礎鏡像,添加任意自己需要的安裝包,構建鏡像,但是卻比較麻煩。所以大多數情況下, 都可以在一些安裝了部分軟件的基礎鏡像上做改造。

例如,構建java項目的鏡像,可以在已經準備了JDK的基礎鏡像基礎上構建。

需求:基於java:8-alpine鏡像,將一個Java項目構建為鏡像

實現思路如下:

  • ① 新建一個空的目錄,然後在目錄中新建一個文件,命名為Dockerfile
  • ② 拷貝課前資料提供的docker-demo.jar到這個目錄中
  • ③ 編寫Dockerfile文件:

    • a )基於java:8-alpine作為基礎鏡像
    • b )將app.jar拷貝到鏡像中
    • c )暴露端口
    • d )編寫入口ENTRYPOINT

      內容如下:

      FROM java:8-alpine
      COPY ./app.jar /tmp/app.jar
      EXPOSE 8090
      ENTRYPOINT java -jar /tmp/app.jar
  • ④ 使用docker build命令構建鏡像
  • ⑤ 使用docker run創建容器並運行

3.4.小結

小結:

  1. Dockerfile的本質是一個文件,通過指令描述鏡像的構建過程
  2. Dockerfile的第一行必須是FROM,從一個基礎鏡像來構建
  3. 基礎鏡像可以是基本操作系統,如Ubuntu。也可以是其他人制作好的鏡像,例如:java:8-alpine

4.Docker-Compose

Docker Compose可以基於Compose文件幫 快速的部署分佈式應用,而無需手動一個個創建和運行容器!

4.1.初識DockerCompose

Compose文件是一個文本文件,通過指令定義集羣中的每個容器如何運行。格式如下:

version: "3.8"
 services:
  mysql:
    image: mysql:5.7.25
    environment:
     MYSQL_ROOT_PASSWORD: 123 
    volumes:
     - "/tmp/mysql/data:/var/lib/mysql"
     - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
  web:
    build: .
    ports:
     - "8090:8090"

上面的Compose文件就描述一個項目,其中包含兩個容器:

  • mysql:一個基於mysql:5.7.25鏡像構建的容器,並且掛載了兩個目錄
  • web:一個基於docker build臨時構建的鏡像容器,映射端口時8090

DockerCompose的詳細語法參考官網:https://docs.docker.com/compose/compose-file/

其實DockerCompose文件可以看做是將多個docker run命令寫到一個文件,只是語法稍有差異。

4.2.安裝DockerCompose

參考課前資料

4.3.部署微服務集羣

需求:將之前學習的cloud-demo微服務集羣利用DockerCompose部署

實現思路

① 查看課前資料提供的cloud-demo文件夾,裏面已經編寫好了docker-compose文件

② 修改自己的cloud-demo項目,將數據庫、nacos地址都命名為docker-compose中的服務名

③ 使用maven打包工具,將項目中的每個微服務都打包為app.jar

④ 將打包好的app.jar拷貝到cloud-demo中的每一個對應的子目錄中

⑤ 將cloud-demo上傳至虛擬機,利用 docker-compose up -d 來部署

4.3.1.compose文件

查看課前資料提供的cloud-demo文件夾,裏面已經編寫好了docker-compose文件,而且每個微服務都準備了一個獨立的目錄:

內容如下:

version: "3.2"

services:
  nacos:
    image: nacos/nacos-server
    environment:
      MODE: standalone
    ports:
      - "8848:8848"
  mysql:
    image: mysql:5.7.25
    environment:
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "$PWD/mysql/data:/var/lib/mysql"
      - "$PWD/mysql/conf:/etc/mysql/conf.d/"
  userservice:
    build: ./user-service
  orderservice:
    build: ./order-service
  gateway:
    build: ./gateway
    ports:
      - "10010:10010"

JDK 11 API 文檔

可以看到,其中包含5個service服務:

  • nacos:作為註冊中心和配置中心

    • image: nacos/nacos-server: 基於nacos/nacos-server鏡像構建
    • environment:環境變量

      • MODE: standalone:單點模式啓動
    • ports:端口映射,這裏暴露了8848端口
  • mysql:數據庫

    • image: mysql:5.7.25:鏡像版本是mysql:5.7.25
    • environment:環境變量

      • MYSQL_ROOT_PASSWORD: 123:設置數據庫root賬户的 為123
    • volumes:數據卷掛載,這裏掛載了mysql的data、conf目錄,其中有我提前準備好的數據
  • userserviceorderservicegateway:都是基於Dockerfile臨時構建的

查看mysql目錄,可以看到其中已經準備好了cloud_order、cloud_user表:

查看微服務目錄,可以看到都包含Dockerfile文件:

內容如下:

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar

4.3.2.修改微服務配置

因為微服務將來要部署為docker容器,而容器之間互聯不是通過IP地址,而是通過容器名。這裏 將order-service、user-service、gateway服務的mysql、nacos地址都修改為基於容器名的訪問。

如下所示:

spring:
  datasource:
    url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
    username: root
    password: 123
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: orderservice
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos服務地址

4.3.3.打包

接下來需要將 的每個微服務都打包。因為之前查看到Dockerfile中的jar包名稱都是app.jar,因此 的每個微服務都需要用這個名稱。

可以通過修改pom.xml中的打包名稱來實現,每個微服務都需要修改:

<build>
  <!-- 服務打包的最終名稱 -->
  <finalName>app</finalName>
  <plugins>
   

# 5.Docker鏡像倉庫 



## 5.1.搭建私有鏡像倉庫

參考課前資料《CentOS7安裝Docker.md》



## 5.2.推送、拉取鏡像

推送鏡像到私有鏡像服務必須先tag,步驟如下:

① 重新tag本地鏡像,名稱前綴為私有倉庫的地址:192.168.150.101:8080/

Feign 文檔

docker tag nginx:latest 192.168.150.101:8080/nginx:1.0




② 推送鏡像

docker push 192.168.150.101:8080/nginx:1.0




③ 拉取鏡像

docker pull 192.168.150.101:8080/nginx:1.0




# 0.安裝Docker

Docker 分為 CE 和 EE 兩大版本。CE 即社區版(免費,支持週期 7 個月),EE 即企業版,強調安全,付費使用,支持週期 24 個月。

Docker CE 分為 `stable` `test` 和 `nightly` 三個更新頻道。

官方網站上有各種環境下的 [安裝指南](https://docs.docker.com/install/),這裏主要介紹 Docker CE 在 CentOS上的安裝。

# 1.CentOS安裝Docker

Docker CE 支持 64 位版本 CentOS 7,並且要求內核版本不低於 3.10, CentOS 7 滿足最低內核的要求,所以 在CentOS 7安裝Docker。



## 1.1.卸載(可選)

如果之前安裝過舊版本的Docker,可以使用下面命令卸載:

Swagger/OpenAPI

SBT 文檔

yum remove docker \

              docker-client \
              docker-client-latest \
              docker-common \
              doc

Add a new Comments

Some HTML is okay.