springBoot項(xiàng)目的docker鏡像

1、docker簡(jiǎn)介

Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的鏡像中,然后發(fā)布到任何流行的 Linux或Windows 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口

2、docker優(yōu)點(diǎn)

  • 簡(jiǎn)化配置
    虛擬機(jī)的最大好處是能在你的硬件設(shè)施上運(yùn)行各種配置不一樣的平臺(tái)(軟件, 系統(tǒng)), Docker在降低額外開銷的情況下提供了同樣的功能. 它能讓你將運(yùn)行環(huán)境和配置放在代碼匯總?cè)缓蟛渴? 同一個(gè)Docker的配置可以在不同的環(huán)境環(huán)境中使用, 這樣就降低了硬件要求和應(yīng)用環(huán)境之間耦合度.

  • 代碼流水線管理
    代碼從開發(fā)者的機(jī)器到最終在生產(chǎn)環(huán)境上的部署, 需要經(jīng)過很多的中間環(huán)境. 而每一個(gè)中間環(huán)境都有自己微小的差別, Docker給應(yīng)用提供了一個(gè)從開發(fā)到上線均一致的環(huán)境, 讓代碼的流水線變得簡(jiǎn)單不少.

  • 提升開發(fā)效率
    不同環(huán)境中, 開發(fā)者的共同目標(biāo):
    1)想讓開發(fā)環(huán)境盡量貼近生產(chǎn)環(huán)境.
    2)想快速搭建開發(fā)環(huán)境
    開發(fā)環(huán)境的機(jī)器通常內(nèi)存比較小, 使用虛擬機(jī), 經(jīng)常需要為開發(fā)環(huán)境的機(jī)器加內(nèi)存, 而現(xiàn)在Docker可以輕易的讓幾十個(gè)服務(wù)在Docker中跑起來.

  • 隔離應(yīng)用
    開發(fā)時(shí)會(huì)在一個(gè)臺(tái)機(jī)器上運(yùn)行不同的應(yīng)用:
    1)為了降低成本, 進(jìn)行服務(wù)器整合
    2) 將一個(gè)整體式的應(yīng)用拆分成低耦合的單個(gè)服務(wù)(微服務(wù)架構(gòu))

  • 整合服務(wù)器
    Docker隔離應(yīng)用的能力使得Docker可以整合多個(gè)服務(wù)器以降低成本. 由于沒有多個(gè)操作系統(tǒng)的內(nèi)存占用, 以及能在多個(gè)實(shí)例之間共享沒有使用的內(nèi)存, Docker可以比虛擬機(jī)提供更好的服務(wù)器整合解決方案.

  • 快速部署
    Docker為進(jìn)程創(chuàng)建一個(gè)容器, 不需要啟動(dòng)一個(gè)操作系統(tǒng), 時(shí)間縮短為秒級(jí)別.
    可以在數(shù)據(jù)中心創(chuàng)建銷毀資源而無須擔(dān)心重新啟動(dòng)帶來的開銷. 通常數(shù)據(jù)中心的資源利用率只有30% , 通過使用Docker并進(jìn)行有效的資源分配可以提高資源的利用率.

3、準(zhǔn)備工作

環(huán)境條件:

  • linux系統(tǒng),不建議windows
  • docker最新版本
  • jdk 1.8
  • maven3.0

采用maven的方式去構(gòu)建項(xiàng)目,并采用docker-maven-plugin去構(gòu)建docker鏡像。

4、構(gòu)建eureka服務(wù)鏡像

1)在pom文件加上插件:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.3</version>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

Spotify 的 docker-maven-plugin 插件是用maven插件方式構(gòu)建docker鏡像的。

  • imageName指定了鏡像的名字
  • dockerDirectory指定 Dockerfile 的位置
  • resources是指那些需要和 Dockerfile 放在一起,在構(gòu)建鏡像時(shí)使用的文件,一般應(yīng)用 jar 包需要納入。

2)修改下配置文件:

server:
  port: 8761
eureka:
  instance:
    prefer-ip-address: true
  client:
    registerWithEureka: false
    fetchRegistry: false

3)編寫dockerfile文件:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD eureka-server-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8761

4)docker file編寫指令:

  • FROM
    FROM <image>
    FROM <image>:<tag>
    FROM <image> <digest>

FROM指令必須指定且需要在Dockerfile其他指令的前面,指定的基礎(chǔ)image可以是官方遠(yuǎn)程倉(cāng)庫中的,也可以位于本地倉(cāng)庫。后續(xù)的指令都依賴于該指令指定的image。當(dāng)在同一個(gè)Dockerfile中建立多個(gè)鏡像時(shí),可以使用多個(gè)FROM指令。

  • VOLUME
    格式為:
     VOLUME ["/data"]

使容器中的一個(gè)目錄具有持久化存儲(chǔ)數(shù)據(jù)的功能,該目錄可以被容器本身使用,也可以共享給其他容器。當(dāng)容器中的應(yīng)用有持久化數(shù)據(jù)的需求時(shí)可以在Dockerfile中使用該指令。

  • ADD
    從src目錄復(fù)制文件到容器的dest。其中src可以是Dockerfile所在目錄的相對(duì)路徑,也可以是一個(gè)URL,還可以是一個(gè)壓縮包

  • ENTRYPOINT
    指定Docker容器啟動(dòng)時(shí)執(zhí)行的命令,可以多次設(shè)置,但是只有最后一個(gè)有效。

  • EXPOSE
    為Docker容器設(shè)置對(duì)外的端口號(hào)。在啟動(dòng)時(shí),可以使用-p選項(xiàng)或者-P選項(xiàng)。

5) 構(gòu)建鏡像

執(zhí)行構(gòu)建docker鏡像maven命令:

mvn clean
mvn package docker:build

構(gòu)建eureka-server鏡像成功。

5、構(gòu)建service-hi鏡像

  • pom文件導(dǎo)入同eurek-server
  • 修改下配置文件:
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka-server:8761/eureka/
server:
  port: 8763
spring:
  application:
    name: service-hi

在這里說下:defaultZone發(fā)現(xiàn)服務(wù)的host改為鏡像名。

  • dockefile 編寫同eureka-server
  • 構(gòu)建鏡像:
mvn clean
mvn package docker:build

這時(shí)我們運(yùn)行docke的eureka-server 和service-hi鏡像:

docker run -p 8761: 8761 -t forezp/eureka-server
docker run -p 8763: 8763 -t forezp/service-hi

訪問localhost:8761


6、采用docker-compose啟動(dòng)鏡像

Compose 是一個(gè)用于定義和運(yùn)行多容器的Docker應(yīng)用的工具。使用Compose,你可以在一個(gè)配置文件(yaml格式)中配置你應(yīng)用的服務(wù),然后使用一個(gè)命令,即可創(chuàng)建并啟動(dòng)配置中引用的所有服務(wù)。下面我們進(jìn)入Compose的實(shí)戰(zhàn)吧。

采用docker-compose的方式編排鏡像,啟動(dòng)鏡像:

version: '3'
services:
  eureka-server:
    image: forezp/eureka-server
    restart: always
    ports:
      - 8761:8761
  service-hi:
    image: forezp/service-hi
    restart: always
    ports:
      - 8763:8763

輸入命令: docker-compose up


7、采用docker-compose編排并啟動(dòng)鏡像

docker-compose也可以構(gòu)建鏡像,現(xiàn)在我們采用docker-compose的方式構(gòu)建鏡像。
現(xiàn)在以eureka-server為例: 將Dockerfile移到eureka-server的主目錄,改寫ADD的相對(duì)路徑:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD ./target/eureka-server-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8761

同理修改service-hi目錄;
編寫構(gòu)建鏡像docker-compose-dev文件:

version: '3'
services:
  eureka-server:
    build: eureka-server
    ports:
      - 8761:8761

  service-hi:
    build: service-hi
    ports:
      - 8763:8763

命令構(gòu)建鏡像并啟動(dòng):

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容