Docker實用篇

Docker實用篇

0.學習目標

1.初識Docker

1.1.什么是Docker

微服務雖然具備各種各樣的優勢,但服務的拆分通用給部署帶來了很大的麻煩。

  • 分布式系統中,依賴的組件非常多,不同組件之間部署時往往會產生一些沖突。
  • 在數百上千臺服務中重復部署,環境不一定一致,會遇到各種問題

1.1.1.應用部署的環境問題

大型項目組件較多,運行環境也較為復雜,部署時會碰到一些問題:

  • 依賴關系復雜,容易出現兼容性問題

  • 開發、測試、生產環境有差異

image-20210731141907366

例如一個項目中,部署時需要依賴于node.js、Redis、RabbitMQ、MySQL等,這些服務部署時所需要的函數庫、依賴項各不相同,甚至會有沖突。給部署帶來了極大的困難。

1.1.2.Docker解決依賴兼容問題

而Docker確巧妙的解決了這些問題,Docker是如何實現的呢?

Docker為了解決依賴的兼容問題的,采用了兩個手段:

  • 將應用的Libs(函數庫)、Deps(依賴)、配置與應用一起打包

  • 將每個應用放到一個隔離容器去運行,避免互相干擾

image-20210731142219735

這樣打包好的應用包中,既包含應用本身,也保護應用所需要的Libs、Deps,無需再操作系統上安裝這些,自然就不存在不同應用之間的兼容問題了。

雖然解決了不同應用的兼容問題,但是開發、測試等環境會存在差異,操作系統版本也會有差異,怎么解決這些問題呢?

1.1.3.Docker解決操作系統環境差異

要解決不同操作系統環境差異問題,必須先了解操作系統結構。以一個Ubuntu操作系統為例,結構如下:

image-20210731143401460

結構包括:

  • 計算機硬件:例如CPU、內存、磁盤等
  • 系統內核:所有Linux發行版的內核都是Linux,例如CentOS、Ubuntu、Fedora等。內核可以與計算機硬件交互,對外提供內核指令,用于操作計算機硬件。
  • 系統應用:操作系統本身提供的應用、函數庫。這些函數庫是對內核指令的封裝,使用更加方便。

應用于計算機交互的流程如下:

1)應用調用操作系統應用(函數庫),實現各種功能

2)系統函數庫是對內核指令集的封裝,會調用內核指令

3)內核指令操作計算機硬件

Ubuntu和CentOSpringBoot都是基于Linux內核,無非是系統應用不同,提供的函數庫有差異:

image-20210731144304990

此時,如果將一個Ubuntu版本的MySQL應用安裝到CentOS系統,MySQL在調用Ubuntu函數庫時,會發現找不到或者不匹配,就會報錯了:

image-20210731144458680

Docker如何解決不同系統環境的問題?

  • Docker將用戶程序與所需要調用的系統(比如Ubuntu)函數庫一起打包
  • Docker運行到不同操作系統時,直接基于打包的函數庫,借助于操作系統的Linux內核來運行

如圖:

image-20210731144820638

1.1.4.小結

Docker如何解決大型項目依賴關系復雜,不同組件依賴的兼容性問題?

  • Docker允許開發中將應用、依賴、函數庫、配置一起打包,形成可移植鏡像
  • Docker應用運行在容器中,使用沙箱機制,相互隔離

Docker如何解決開發、測試、生產環境有差異的問題?

  • Docker鏡像中包含完整運行環境,包括系統函數庫,僅依賴系統的Linux內核,因此可以在任意Linux操作系統上運行

Docker是一個快速交付應用、運行應用的技術,具備下列優勢:

  • 可以將程序及其依賴、運行環境一起打包為一個鏡像,可以遷移到任意Linux操作系統
  • 運行時利用沙箱機制形成隔離容器,各個應用互不干擾
  • 啟動、移除都可以通過一行命令完成,方便快捷

1.2.Docker和虛擬機的區別

Docker可以讓一個應用在任何操作系統中非常方便的運行。而以前我們接觸的虛擬機,也能在一個操作系統中,運行另外一個操作系統,保護系統中的任何應用。

兩者有什么差異呢?

虛擬機(virtual machine)是在操作系統中模擬硬件設備,然后運行另一個操作系統,比如在 Windows 系統里面運行 Ubuntu 系統,這樣就可以運行任意的Ubuntu應用了。

Docker僅僅是封裝函數庫,并沒有模擬完整的操作系統,如圖:

image-20210731145914960

對比來看:

image-20210731152243765

小結:

Docker和虛擬機的差異:

  • docker是一個系統進程;虛擬機是在操作系統中的操作系統

  • docker體積小、啟動速度快、性能好;虛擬機體積大、啟動速度慢、性能一般

1.3.Docker架構

1.3.1.鏡像和容器

Docker中有幾個重要的概念:

鏡像(Image):Docker將應用程序及其所需的依賴、函數庫、環境、配置等文件打包在一起,稱為鏡像。

容器(Container):鏡像中的應用程序運行后形成的進程就是容器,只是Docker會給容器進程做隔離,對外不可見。

一切應用最終都是代碼組成,都是硬盤中的一個個的字節形成的文件。只有運行時,才會加載到內存,形成進程。

鏡像,就是把一個應用在硬盤上的文件、及其運行環境、部分系統函數庫文件一起打包形成的文件包。這個文件包是只讀的。

容器呢,就是將這些文件中編寫的程序、函數加載到內存中允許,形成進程,只不過要隔離起來。因此一個鏡像可以啟動多次,形成多個容器進程。

image-20210731153059464

例如你下載了一個QQ,如果我們將QQ在磁盤上的運行文件及其運行的操作系統依賴打包,形成QQ鏡像。然后你可以啟動多次,雙開、甚至三開QQ,跟多個妹子聊天。

1.3.2.DockerHub

開源應用程序非常多,打包這些應用往往是重復的勞動。為了避免這些重復勞動,人們就會將自己打包的應用鏡像,例如Redis、MySQL鏡像放到網絡上,共享使用,就像GitHub的代碼共享一樣。

  • DockerHub:DockerHub是一個官方的Docker鏡像的托管平臺。這樣的平臺稱為Docker Registry。

  • 國內也有類似于DockerHub 的公開服務,比如 網易云鏡像服務、阿里云鏡像庫等。

我們一方面可以將自己的鏡像共享到DockerHub,另一方面也可以從DockerHub拉取鏡像:

image-20210731153743354

1.3.3.Docker架構

我們要使用Docker來操作鏡像、容器,就必須要安裝Docker。

Docker是一個CS架構的程序,由兩部分組成:

  • 服務端(server):Docker守護進程,負責處理Docker指令,管理鏡像、容器等

  • 客戶端(client):通過命令或RestAPI向Docker服務端發送指令。可以在本地或遠程向服務端發送指令。

如圖:

image-20210731154257653

1.3.4.小結

鏡像:

  • 將應用程序及其依賴、環境、配置打包在一起

容器:

  • 鏡像運行起來就是容器,一個鏡像可以運行多個容器

Docker結構:

  • 服務端:接收命令或遠程請求,操作鏡像或容器

  • 客戶端:發送命令或者請求到Docker服務端

DockerHub:

  • 一個鏡像托管的服務器,類似的還有阿里云鏡像服務,統稱為DockerRegistry

1.4.安裝Docker

企業部署一般都是采用Linux操作系統,而其中又數CentOS發行版占比最多,因此我們在CentOS下安裝Docker。參考課前資料中的文檔:

image-20210731155002425

2.Docker的基本操作

2.1.鏡像操作

2.1.1.鏡像名稱

首先來看下鏡像的名稱組成:

  • 鏡名稱一般分兩部分組成:[repository]:[tag]。
  • 在沒有指定tag時,默認是latest,代表最新版本的鏡像

如圖:

image-20210731155141362

這里的mysql就是repository,5.7就是tag,合一起就是鏡像名稱,代表5.7版本的MySQL鏡像。

2.1.2.鏡像命令

常見的鏡像操作命令如圖:

image-20210731155649535

2.1.3.案例1-拉取、查看鏡像

需求:從DockerHub中拉取一個nginx鏡像并查看

1)首先去鏡像倉庫搜索nginx鏡像,比如DockerHub:

image-20210731155844368

2)根據查看到的鏡像名稱,拉取自己需要的鏡像,通過命令:docker pull nginx

image-20210731155856199

3)通過命令:docker images 查看拉取到的鏡像

image-20210731155903037

2.1.4.案例2-保存、導入鏡像

需求:利用docker save將nginx鏡像導出磁盤,然后再通過load加載回來

1)利用docker xx --help命令查看docker save和docker load的語法

例如,查看save命令用法,可以輸入命令:

docker save --help

結果:

image-20210731161104732

命令格式:

docker save -o [保存的目標文件名稱] [鏡像名稱]

2)使用docker save導出鏡像到磁盤

運行命令:

docker save -o nginx.tar nginx:latest

結果如圖:

image-20210731161354344

3)使用docker load加載鏡像

先刪除本地的nginx鏡像:

docker rmi nginx:latest

然后運行命令,加載本地文件:

docker load -i nginx.tar

結果:

image-20210731161746245

2.1.5.練習

需求:去DockerHub搜索并拉取一個Redis鏡像

目標:

1)去DockerHub搜索Redis鏡像

2)查看Redis鏡像的名稱和版本

3)利用docker pull命令拉取鏡像

4)利用docker save命令將 redis:latest打包為一個redis.tar包

5)利用docker rmi 刪除本地的redis:latest

6)利用docker load 重新加載 redis.tar文件

2.2.容器操作

2.2.1.容器相關命令

容器操作的命令如圖:

image-20210731161950495

容器保護三個狀態:

  • 運行:進程正常運行
  • 暫停:進程暫停,CPU不再運行,并不釋放內存
  • 停止:進程終止,回收進程占用的內存、CPU等資源

其中:

  • docker run:創建并運行一個容器,處于運行狀態

  • docker pause:讓一個運行的容器暫停

  • docker unpause:讓一個容器從暫停狀態恢復運行

  • docker stop:停止一個運行的容器

  • docker start:讓一個停止的容器再次運行

  • docker rm:刪除一個容器

2.2.2.案例-創建并運行一個容器

創建并運行nginx容器的命令:

docker run --name containerName -p 80:80 -d nginx

命令解讀:

  • docker run :創建并運行一個容器
  • –name : 給容器起一個名字,比如叫做mn
  • -p :將宿主機端口與容器端口映射,冒號左側是宿主機端口,右側是容器端口
  • -d:后臺運行容器
  • nginx:鏡像名稱,例如nginx

這里的-p參數,是將容器端口映射到宿主機端口。

默認情況下,容器是隔離環境,我們直接訪問宿主機的80端口,肯定訪問不到容器中的nginx。

現在,將容器的80與宿主機的80關聯起來,當我們訪問宿主機的80端口時,就會被映射到容器的80,這樣就能訪問到nginx了:

image-20210731163255863

2.2.3.案例-進入容器,修改文件

需求:進入Nginx容器,修改HTML文件內容,添加“傳智教育歡迎您”

提示:進入容器要用到docker exec命令。

步驟

1)進入容器。進入我們剛剛創建的nginx容器的命令為:

docker exec -it mn bash

命令解讀:

  • docker exec :進入容器內部,執行一個命令

  • -it : 給當前進入的容器創建一個標準輸入、輸出終端,允許我們與容器交互

  • mn :要進入的容器的名稱

  • bash:進入容器后執行的命令,bash是一個linux終端交互命令

2)進入nginx的HTML所在目錄 /usr/share/nginx/html

容器內部會模擬一個獨立的Linux文件系統,看起來如同一個linux服務器一樣:

image-20210731164159811

nginx的環境、配置、運行文件全部都在這個文件系統中,包括我們要修改的html文件。

查看DockerHub網站中的nginx頁面,可以知道nginx的html目錄位置在/usr/share/nginx/html

我們執行命令,進入該目錄:

cd /usr/share/nginx/html

查看目錄下文件:

image-20210731164455818

3)修改index.html的內容

容器內沒有vi命令,無法直接修改,我們用下面的命令來修改:

sed -i -e 's#Welcome to nginx#傳智教育歡迎您#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html

在瀏覽器訪問自己的虛擬機地址,例如我的是:http://192.168.150.101,即可看到結果:

image-20210731164717604

2.2.4.小結

docker run命令的常見參數有哪些?

  • –name:指定容器名稱
  • -p:指定端口映射
  • -d:讓容器后臺運行

查看容器日志的命令:

  • docker logs
  • 添加 -f 參數可以持續查看日志

查看容器狀態:

  • docker ps
  • docker ps -a 查看所有容器,包括已經停止的

2.3.數據卷(容器數據管理)

在之前的nginx案例中,修改nginx的html頁面時,需要進入nginx內部。并且因為沒有編輯器,修改文件也很麻煩。

這就是因為容器與數據(容器內文件)耦合帶來的后果。

image-20210731172440275

要解決這個問題,必須將數據與容器解耦,這就要用到數據卷了。

2.3.1.什么是數據卷

**數據卷(volume)**是一個虛擬目錄,指向宿主機文件系統中的某個目錄。

image-20210731173541846

一旦完成數據卷掛載,對容器的一切操作都會作用在數據卷對應的宿主機目錄了。

這樣,我們操作宿主機的/var/lib/docker/volumes/html目錄,就等于操作容器內的/usr/share/nginx/html目錄了

2.3.2.數據集操作命令

數據卷操作的基本語法如下:

docker volume [COMMAND]

docker volume命令是數據卷操作,根據命令后跟隨的command來確定下一步的操作:

  • create 創建一個volume
  • inspect 顯示一個或多個volume的信息
  • ls 列出所有的volume
  • prune 刪除未使用的volume
  • rm 刪除一個或多個指定的volume

2.3.3.創建和查看數據卷

需求:創建一個數據卷,并查看數據卷在宿主機的目錄位置

① 創建數據卷

docker volume create html

② 查看所有數據

docker volume ls

結果:

image-20210731173746910

③ 查看數據卷詳細信息卷

docker volume inspect html

結果:

image-20210731173809877

可以看到,我們創建的html這個數據卷關聯的宿主機目錄為/var/lib/docker/volumes/html/_data目錄。

小結

數據卷的作用:

  • 將容器與數據分離,解耦合,方便操作容器內數據,保證數據安全

數據卷操作:

  • docker volume create:創建數據卷
  • docker volume ls:查看所有數據卷
  • docker volume inspect:查看數據卷詳細信息,包括關聯的宿主機目錄位置
  • docker volume rm:刪除指定數據卷
  • docker volume prune:刪除所有未使用的數據卷

2.3.4.掛載數據卷

我們在創建容器時,可以通過 -v 參數來掛載一個數據卷到某個容器內目錄,命令格式如下:

docker run \--name mn \-v html:/root/html \-p 8080:80nginx \

這里的-v就是掛載數據卷的命令:

  • -v html:/root/htm :把html數據卷掛載到容器內的/root/html這個目錄中

2.3.5.案例-給nginx掛載數據卷

需求:創建一個nginx容器,修改容器內的html目錄內的index.html內容

分析:上個案例中,我們進入nginx容器內部,已經知道nginx的html目錄所在位置/usr/share/nginx/html ,我們需要把這個目錄掛載到html這個數據卷上,方便操作其中的內容。

提示:運行容器時使用 -v 參數掛載數據卷

步驟:

① 創建容器并掛載數據卷到容器內的HTML目錄

docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx

② 進入html數據卷所在位置,并修改HTML內容

# 查看html數據卷的位置
docker volume inspect html
# 進入該目錄
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html

2.3.6.案例-給MySQL掛載本地目錄

容器不僅僅可以掛載數據卷,也可以直接掛載到宿主機目錄上。關聯關系如下:

  • 帶數據卷模式:宿主機目錄 --> 數據卷 —> 容器內目錄
  • 直接掛載模式:宿主機目錄 —> 容器內目錄

如圖:

image-20210731175155453

語法

目錄掛載與數據卷掛載的語法是類似的:

  • -v [宿主機目錄]:[容器內目錄]
  • -v [宿主機文件]:[容器內文件]

需求:創建并運行一個MySQL容器,將宿主機目錄直接掛載到容器

實現思路如下:

1)在將課前資料中的mysql.tar文件上傳到虛擬機,通過load命令加載為鏡像

2)創建目錄/tmp/mysql/data

3)創建目錄/tmp/mysql/conf,將課前資料提供的hmy.cnf文件上傳到/tmp/mysql/conf

4)去DockerHub查閱資料,創建并運行MySQL容器,要求:

① 掛載/tmp/mysql/data到mysql容器內數據存儲目錄

② 掛載/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件

③ 設置MySQL密碼

2.3.7.小結

docker run的命令中通過 -v 參數掛載文件或目錄到容器中:

  • -v volume名稱:容器內目錄
  • -v 宿主機文件:容器內文
  • -v 宿主機目錄:容器內目錄

數據卷掛載與目錄直接掛載的

  • 數據卷掛載耦合度低,由docker來管理目錄,但是目錄較深,不好找
  • 目錄掛載耦合度高,需要我們自己管理目錄,不過目錄容易尋找查看

3.Dockerfile自定義鏡像

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

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

3.1.鏡像結構

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

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

image-20210731175806273

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

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

3.2.Dockerfile語法

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

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

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

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

image-20210731180321133

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

3.3.構建Java項目

3.3.1.基于Ubuntu構建Java項目

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

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

    image-20210801101207444

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

    image-20210801101314816

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

    image-20210801101410200

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

    image-20210801101455590

    其中的內容如下:

    # 指定基礎鏡像
    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
    
  • 步驟5:進入docker-demo

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

  • 步驟6:運行命令:

    docker build -t javaweb:1.0 .
    

最后訪問 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文件幫我們快速的部署分布式應用,而無需手動一個個創建和運行容器!

image-20210731180921742

4.1.初識DockerCompose

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

version: "3.8"services:mysql:image: mysql:5.7.25environment: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文件,而且每個微服務都準備了一個獨立的目錄:

image-20210731181341330

內容如下:

version: "3.2"services:nacos:image: nacos/nacos-serverenvironment:MODE: standaloneports:- "8848:8848"mysql:image: mysql:5.7.25environment:MYSQL_ROOT_PASSWORD: 123volumes:- "$PWD/mysql/data:/var/lib/mysql"- "$PWD/mysql/conf:/etc/mysql/conf.d/"userservice:build: ./user-serviceorderservice:build: ./order-servicegateway:build: ./gatewayports:- "10010:10010"

可以看到,其中包含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表:

image-20210801095205034

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

image-20210801095320586

內容如下:

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=falseusername: rootpassword: 123driver-class-name: com.mysql.jdbc.Driverapplication:name: orderservicecloud:nacos:server-addr: nacos:8848 # nacos服務地址

4.3.3.打包

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

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

<build><!-- 服務打包的最終名稱 --><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

打包后:

image-20210801095951030

4.3.4.拷貝jar包到部署目錄

編譯打包好的app.jar文件,需要放到Dockerfile的同級目錄中。注意:每個微服務的app.jar放到與服務名稱對應的目錄,別搞錯了。

user-service:

image-20210801100201253

order-service:

image-20210801100231495

gateway:

image-20210801100308102

4.3.5.部署

最后,我們需要將文件整個cloud-demo文件夾上傳到虛擬機中,理由DockerCompose部署。

上傳到任意目錄:

image-20210801100955653

部署:

進入cloud-demo目錄,然后運行下面的命令:

docker-compose up -d

5.Docker鏡像倉庫

5.1.搭建私有鏡像倉庫

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

5.2.推送、拉取鏡像

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

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

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 

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

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

相關文章

STM32入門筆記15_PWR電源管理模塊

PWR和低功耗模式 PWR簡介 PWR(Power Control) 電源控制PWR負責管理STM32內部的電源供電部分&#xff0c;可以實現可編程電壓檢測器和低功耗模式的功能可編程電壓檢測器(PVD) 可以監控VDD電源電壓&#xff0c;當VDD下降到PVD閾值以下或上升到PVD閾值之上時&#xff0c;PVD會觸…

C++學習之路(一)什么是C++?如何循序漸進的學習C++?【純干貨】

C是一種高級編程語言&#xff0c;是對C語言的擴展和增強。它在C語言的基礎上添加了面向對象編程&#xff08;OOP&#xff09;的特性&#xff0c;使得開發者能夠更加靈活和高效地編寫代碼。 C的名字中的“”符號表示在C語言的基礎上向前發展一步&#xff0c;即“加加”&#x…

iOS APP包分析工具 | 京東云技術團隊

介紹 分享一款用于分析iOSipa包的腳本工具&#xff0c;使用此工具可以自動掃描發現可修復的包體積問題&#xff0c;同時可以生成包體積數據用于查看。這塊工具我們團隊內部已經使用很長一段時間&#xff0c;希望可以幫助到更多的開發同學更加效率的優化包體積問題。 工具下載…

LeeCode前端算法基礎100題(4)- 無重復字符的最長子串

一、問題詳情&#xff1a; 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc"&#xff0c;所以其長度為 3。示例 2: 輸入: s "bbbbb…

在VMware Workstation的Centos上實現KVM虛擬機的安裝部署:詳細安裝部署過程(保姆級)

KVM概述 ? 以色列qumranet公司研發&#xff0c;后被RedHad公司收購 &#xff08;1&#xff09;kvm只支持x86平臺 &#xff08;2&#xff09;依賴于 HVM,inter VT AMD-v ? KVM是&#xff08;Kernel-based Virtual Machine&#xff09;的簡稱&#xff0c;是一個開源的系統虛擬…

Spark---補充算子

一、Spark補充Transformation算子 1、join,leftOuterJoin,rightOuterJoin,fullOuterJoin 作用在K&#xff0c;V格式的RDD上。根據K進行連接&#xff0c;對&#xff08;K&#xff0c;V&#xff09;join&#xff08;K&#xff0c;W&#xff09;返回&#xff08;K&#xff0c;&a…

世界復合醫學雜志世界復合醫學雜志社世界復合醫學編輯部2023年第8期目錄

論著 能譜&#xff08;Revolution&#xff09;CT胸腹聯合胸痛三聯CTA掃描對急性胸痛患者疾病的差異分析 左明飛;溫麗娟;焦宇; 1-38 超聲引導下肩袖間隙注射及肩胛上神經阻滯聯合觸發點針刺治療粘連性肩關節囊炎的療效分析 余菲;王嫻;戴甫成;張維;劉武;孫勇; 4-8 神…

python tkinter 使用(六)

python tkinter 使用&#xff08;六&#xff09; 本文主要講述tkinter中進度條的使用。 1:確定的進度條 progressbar tkinter.ttk.Progressbar(root, mode"determinate", maximum100, value0) progressbar.pack()def updateProgressBar():for i in range(100):pr…

【Unity】 UGUI的PhysicsRaycaster (物理射線檢測)組件的介紹及使用

1. 什么是PhysicsRaycaster組件&#xff1f; PhysicsRaycaster是Unity UGUI中的一個組件&#xff0c;用于在UI元素上進行物理射線檢測。它可以檢測鼠標或觸摸事件是否發生在UI元素上&#xff0c;并將事件傳遞給相應的UI元素。 2. PhysicsRaycaster的工作原理 PhysicsRaycast…

【Proteus仿真】【51單片機】智能垃圾桶設計

文章目錄 一、功能簡介二、軟件設計三、實驗現象聯系作者 一、功能簡介 本項目使用Proteus8仿真51單片機控制器&#xff0c;使用報警模塊、LCD1602液晶模塊、按鍵模塊、人體紅外傳感器、HCSR04超聲波、有害氣體傳感器、SG90舵機等。 主要功能&#xff1a; 系統運行后&#xf…

基于GPRS的汽車碰撞自動報警系統(論文+源碼)

1. 系統設計 本次基于GPRS的汽車碰撞自動報警系統的設計中&#xff0c;其主要的目標功能如下&#xff1a;1、實時檢測當前的GPS精度和緯度坐標&#xff1b;2.當發生碰撞后系統自動將當前的信息通過GPRS數據發送到遠端數據進行報警&#xff1b;3、系統在碰撞后一方面進行本地報警…

聽GPT 講Rust源代碼--src/tools(2)

題圖來自AI生成 File: rust/src/tools/rust-analyzer/crates/hir-def/src/src.rs rust-analyzer 是一個 Rust 語言的語法分析器和語義分析器&#xff0c;用于提供代碼補全、導航、重構等開發工具。而 rust-analyzer 的代碼實現存儲在 rust/src/tools/rust-analyzer 這個文件夾中…

010 OpenCV中的4種平滑濾波

目錄 一、環境 二、平滑濾波 2.1、均值濾波 2.2、高斯濾波 2.3、中值濾波 2.4、雙邊濾波 三、完整代碼 一、環境 本文使用環境為&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、平滑濾波 2.1、均值濾波 在OpenCV庫中&#xff0c;blur函數是一種簡…

遞歸剪枝題

期中考終于考完了&#xff0c;整道題獎勵下自己 我一北大同學問我的&#xff0c;說他遞歸超時了&#xff0c;叫我想一個辦法 后面他說他加了個剪枝就過了&#xff0c;然后我自己嘗試了一個方法&#xff1a; 就是先把城市按1到n排列&#xff0c;然后考慮互換&#xff0c;如果互…

考過了PMP,面試的時候應該怎么辦?

近期喜番在后臺收到了很多同學們的私信&#xff0c;表示自己已經過了8月份的PMP考試&#xff0c;開始著手往項目管理崗位轉型&#xff0c;但是對于項目管理崗位的面試卻一籌莫展。放輕松&#xff0c;大家的需求喜番都了解了&#xff0c;喜番給大家總結了一些項目經理在面試的時…

SpringCloud 微服務全棧體系(十七)

第十一章 分布式搜索引擎 elasticsearch 七、搜索結果處理 搜索的結果可以按照用戶指定的方式去處理或展示。 1. 排序 elasticsearch 默認是根據相關度算分&#xff08;_score&#xff09;來排序&#xff0c;但是也支持自定義方式對搜索結果排序。可以排序字段類型有&#…

【Python】Fastapi swagger-ui.css 、swagger-ui-bundle.js 無法加載,docs無法加載,redocs無法使用

使用fastapi的時候&#xff0c;swagger-ui.css 、swagger-ui-bundle.js、redoc.standalone.js 有時候無法加載&#xff08;國內環境原因或者是局域網屏蔽&#xff09;&#xff0c;此時就需要自己用魔法下載好對應文件&#xff0c;然后替換到fastapi里面去。 fastapi里面依靠這…

計算機視覺(CV)技術的優勢:

計算機視覺&#xff08;CV&#xff09;技術的優勢&#xff1a; 自動化&#xff1a;計算機視覺技術可以自動化處理大量的視覺數據。 精度和速度&#xff1a;計算機視覺技術可以在很短的時間內對大量的圖像數據進行處理&#xff0c;并且可以達到非常高的精度。 可靠性&#xff…

【微軟技術棧】使用(TAP)基于任務的異步模式

本文內容 使用 Await 掛起執行取消異步操作監視進度使用內置的基于任務的連結符構建基于任務的連結符構建基于任務的數據結構 c#使用基于任務的異步模式 (TAP) 處理異步操作時&#xff0c;可以使用回叫實現等待&#xff0c;而不會阻塞。 對于任務&#xff0c;這可通過 Task.C…

java學習part07數組工具類

1比較內容 2輸出信息 3值填充 4快速排序 5二分查找 負數沒找到&#xff0c;其他表示下標