maven项目中如何直接访问某一个页面_整一个自己的docker镜像
獲取鏡像的途徑有兩個(gè),一是從鏡像倉庫獲取,如官方的Docker Hub,二是自定義。上文已經(jīng)介紹如何從鏡像倉庫獲取鏡像,本文基于一個(gè)Springboot項(xiàng)目,來介紹自定義一個(gè)鏡像的基本流程。
1. 定制鏡像的本質(zhì)
我們知道鏡像是分層存儲(chǔ)的,鏡像的構(gòu)建也是一層一層進(jìn)行的,一層構(gòu)建完后,就變?yōu)橹蛔x,在其上再構(gòu)建下一層。因此定制鏡像,實(shí)際上就是定義每一層要干的事,比如執(zhí)行某個(gè)命令,設(shè)置一個(gè)環(huán)境變量,聲明一個(gè)暴露端口等等。然后在構(gòu)建時(shí),按照各層的定義,一層一層地完成構(gòu)建,最終形成一個(gè)包含這些層的鏡像。
2. Dockerfile文件
Docker中定義各層要干的事的文件叫Dockerfile,它是一個(gè)文本文件,包含了一條條的指令,每一條指令對(duì)應(yīng)一層鏡像,指令的內(nèi)容就描述了這一層該如何構(gòu)建。如下示例了一個(gè)非常簡單的Dockerfile,
FROM nginxRUN echo 'Hello jboost!
' > /usr/share/nginx/html/index.html我們定制鏡像,必須要以某一個(gè)鏡像為基礎(chǔ),在其上構(gòu)建自己需要的層,如上示例中,我們是以nginx鏡像為基礎(chǔ),然后在第二層定制了我們自己的內(nèi)容——修改index.html的內(nèi)容為
Hello jboost!
,這樣運(yùn)行容器打開nginx主頁時(shí)就不會(huì)顯示默認(rèn)的頁面內(nèi)容了。上面示例中接觸了Dockerfile的兩個(gè)指令
- FROM:FROM指令指定基礎(chǔ)鏡像,每一個(gè)定制鏡像必須要有一個(gè)基礎(chǔ)鏡像,所以必須要有一條FROM指令,并且是Dockerfile的第一條指令
- RUN:RUN指令指定需要執(zhí)行的命令,后面接的命令就像是shell腳本一樣可執(zhí)行
Dockerfile還提供了許多其它指令,后續(xù)我們?cè)偌薪榻B,本文只對(duì)接觸到的指令做簡單說明。
3. 自定義一個(gè)鏡像
這部分以一個(gè)Springboot項(xiàng)目為基礎(chǔ),介紹自定義一個(gè)鏡像涉及的基本環(huán)節(jié)。項(xiàng)目地址為:https://github.com/ronwxy/swagger-register ,該項(xiàng)目是一個(gè)Swagger API文檔注冊(cè)服務(wù),其它項(xiàng)目可將Swagger API信息注冊(cè)到該服務(wù),進(jìn)行統(tǒng)一查看與管理。
3.1 定義Dockerfile文件
首先,我們?cè)陧?xiàng)目的根目錄下創(chuàng)建一個(gè)Dockerfile文件(文件名就叫Dockerfile),其內(nèi)容為:
FROM openjdk:8-jdk-alpineENV PROFILE=devRUN mkdir /app /logsCOPY ./target/swagger-register-1.0.0-SNAPSHOT.jar /app/app.jarWORKDIR /appVOLUME /register-dataEXPOSE 11090CMD ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "app.jar"]從上往下依次介紹如下
- 第一行:FORM openjdk:8-jdk-alpine, 表示以openjdk:8-jdk-alpine這個(gè)鏡像為基礎(chǔ)鏡像,因?yàn)檫@是一個(gè)Springboot項(xiàng)目所以必須要有jdk支持,我們?cè)诙ㄖ歧R像時(shí),可以找一個(gè)最適合的鏡像作為基礎(chǔ)鏡像。
- 第二行:ENV PROFILE=dev, 定義了一個(gè)環(huán)境變量,這個(gè)環(huán)境變量可以在后面被引用
- 第三行:RUN mkdir /app /logs,通過mkdir命令創(chuàng)建了兩個(gè)目錄,用來保存jar執(zhí)行文件及日志
- 第四行:COPY ./target/swagger-register-1.0.0-SNAPSHOT.jar /app/app.jar 將target目錄下的jar包復(fù)制到/app目錄下,并且進(jìn)行重命名
- 第五行:WORKDIR /app, 指定工作目錄為/app,后面各層的當(dāng)前目錄就是指定的工作目錄
- 第六行:VOLUME /register-data, 定義一個(gè)匿名數(shù)據(jù)卷,前面說過寫操作不要直接在容器內(nèi)進(jìn)行,而要改為寫掛載的數(shù)據(jù)卷目錄,這個(gè)定義可在運(yùn)行容器時(shí)通過 -v 來覆蓋。
- 第七行:EXPOSE 11090, 聲明了運(yùn)行容器時(shí)提供的服務(wù)端口,也僅僅是個(gè)聲明而已,只是告訴使用的人要映射這個(gè)端口,通過 -p 可映射端口。
- 第八行:CMD [“java”, “-Dspring.profiles.active=${PROFILE}”, “-jar”, “app.jar”], 指定了容器啟動(dòng)命令,因?yàn)槭且粋€(gè)Springboot項(xiàng)目,所以就是一個(gè)java -jar的執(zhí)行命令,容器啟動(dòng)的時(shí)候就會(huì)執(zhí)行該命令來運(yùn)行Springboot服務(wù),這里引用了第二行定義的環(huán)境變量PROFILE
3.2 配置maven插件
定義好Dockerfile后,為了方便構(gòu)建鏡像,我們可以借助maven的dockerfile插件dockerfile-maven-plugin,在pom.xml的build部分加入配置如下
org.springframework.boot spring-boot-maven-plugin com.spotify dockerfile-maven-plugin 1.4.10${docker.image.prefix}/${project.artifactId}target/${project.build.finalName}.jarrepository指定了鏡像的名稱,docker.image.prefix需要properties部分進(jìn)行定義,我這里是springboot。
3.3 構(gòu)建鏡像
下載源碼:https://github.com/ronwxy/swagger-register.git ,然后在項(xiàng)目的根目錄下執(zhí)行如下命令(前提是本地已經(jīng)裝好了docker與maven及jdk)
mvn clean package -Dmaven.test.skip=true dockerfile:build該命令首先會(huì)執(zhí)行mvn clean package -Dmaven.test.skip=true對(duì)項(xiàng)目進(jìn)行打包,生成./target/swagger-register-1.0.0-SNAPSHOT.jar文件,然后基于當(dāng)前目錄下的Dockerfile文件進(jìn)行構(gòu)建,如下圖所示
由上圖可看出,該鏡像構(gòu)建分八步(對(duì)應(yīng)Dockerfile的八行指令),每一步生成一個(gè)鏡像層,每一層都有唯一的ID。由圖中也可以看出,除了COPY之類的命令外,每一層的構(gòu)建實(shí)際上是先基于上一層啟動(dòng)一個(gè)容器,然后執(zhí)行該層定義的操作,再移除這個(gè)容器來實(shí)現(xiàn)的,如第八步中
Step 8/8 : CMD ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "app.jar"][INFO] [INFO] ---> Running in f4acd0b53bca[INFO] Removing intermediate container f4acd0b53bca[INFO] ---> a9ee579f2d62先啟動(dòng)一個(gè)ID為f4acd0b53bca的容器,在其中執(zhí)行CMD所定義的命令,然后再移除容器f4acd0b53bca,最后生成ID為a9ee579f2d62的鏡像。
構(gòu)建完后,我們就可以在本地鏡像中通過docker iamges看到我們定制的鏡像了,如圖
圖中springboot/swagger-register鏡像即為我們剛剛構(gòu)建好的定制鏡像。
3.4 啟動(dòng)容器
我們可以通過以下命令來啟動(dòng)一個(gè)剛才定制鏡像的容器
docker run -d --name swagger-register -p 11090:11090 -v /home/jenkins/swagger-register/register-data:/register-data -v /home/jenkins/swagger-register/logs:/logs --restart=always springboot/swagger-register:latest其中:
- -d 表示以后臺(tái)進(jìn)程方式運(yùn)行
- –name 指定容器名稱
- -p 指定端口映射,左邊為宿主機(jī)端口,右邊為容器服務(wù)端口
- -v 指定數(shù)據(jù)卷掛載,左邊為宿主機(jī)目錄,右邊為容器目錄
- –restart=always 表示在docker啟動(dòng)時(shí)自動(dòng)啟動(dòng)該容器
關(guān)于容器相關(guān)的內(nèi)容后面詳細(xì)介紹,這里不展開說明了。啟動(dòng)容器后, 我們就可以瀏覽器打開地址 http://宿主機(jī)ip:11090/doc.html 來訪問服務(wù)了(打開頁面后內(nèi)容是空的,因?yàn)闆]有任何服務(wù)注冊(cè)Swagger API, 相關(guān)內(nèi)容可參考 swagger api文檔集中化注冊(cè)管理)
4. 總結(jié)
本文介紹了一個(gè)基于Springboot項(xiàng)目的Docker鏡像定制及使用過程,對(duì)鏡像的構(gòu)建過程,及Dockerfile的基本指令以及容器的運(yùn)行做了基本介紹。后續(xù)會(huì)對(duì)Dockerfile的其它指令及Dockerfile的一些最佳實(shí)踐進(jìn)行更為詳細(xì)的介紹,歡迎關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的maven项目中如何直接访问某一个页面_整一个自己的docker镜像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 圣剑神域单机版服务器维护,圣剑神域单机版
- 下一篇: 太阳的光和灯光有什么区别_墙体彩绘机UV