SpringBoot整合Docker實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行的操作方法
寫(xiě)在前面
本文講解的是 SpringBoot 引入容器化技術(shù) Docker 實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行,包括鏡像構(gòu)建、Docker倉(cāng)庫(kù)搭建使用、Docker倉(cāng)庫(kù)可視化UI等內(nèi)容。
PS:如果你是新手,可以跟著系列專(zhuān)欄的框架搭建先動(dòng)手把項(xiàng)目搭建起來(lái),然后在結(jié)合本期內(nèi)容繼續(xù)深入學(xué)習(xí),這樣會(huì)有更好的效果。
一、容器化部署的好處
Docker
作為一種新興的虛擬化方式,它可以更高效的利用系統(tǒng)資源,不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開(kāi)銷(xiāo)。
傳統(tǒng)的虛擬機(jī)技術(shù)啟動(dòng)應(yīng)用服務(wù)往往需要數(shù)分鐘,而 Docker
容器應(yīng)用,由于直接運(yùn)行宿主內(nèi)核,無(wú)需啟動(dòng)完整的操作系統(tǒng),因此可以做到秒級(jí)、甚至毫秒級(jí)的啟動(dòng)時(shí)間。大大的節(jié)約了開(kāi)發(fā)、測(cè)試、部署的時(shí)間。
最重要的是一致的運(yùn)行環(huán)境。 Docker
的鏡像提供了除內(nèi)核外完整的運(yùn)行時(shí)環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境一致性。從而達(dá)到真正意義上的 一次構(gòu)建,到處執(zhí)行
。
二、構(gòu)建鏡像
2.1、Dockerfile
接著我們開(kāi)始使用 Dockerfile
來(lái)定制我們的鏡像,從而達(dá)到容器化的目的。Dockerfile 的本質(zhì)就是將一系列修改、安裝、構(gòu)建、操作的命令整合到一起,去構(gòu)建一個(gè)個(gè)性化的鏡像,以達(dá)到**一次構(gòu)建,到處運(yùn)行。**接下來(lái)我們就來(lái)構(gòu)建自定義鏡像。
在my-project-server
模塊下創(chuàng)建docker
目錄,在docker
目錄下創(chuàng)建Dockerfile
。代碼如下:
FROM openjdk:8-jre MAINTAINER Micromaple <micromaple@qq.com> RUN mkdir /app COPY my-project-server-1.0.0-SNAPSHOT.jar /app/app.jar ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod,druid-prod"] EXPOSE 8899
- FROM:指定基礎(chǔ)鏡像,項(xiàng)目是使用jdk8開(kāi)發(fā)的項(xiàng)目,所以我們指定的基礎(chǔ)鏡像為openjdk:8-jre
- MAINTAINER:項(xiàng)目維護(hù)人員
- RUN:執(zhí)行命令,在根目錄下創(chuàng)建app目錄
- COPY:將宿主機(jī)當(dāng)前目錄下的my-project-server-1.0.0-SNAPSHOT.jar文件拷貝到app目錄下,并重命名為app.jar
- ENTRYPOINT:指定容器啟動(dòng)程序及參數(shù)
- EXPOSE:指定運(yùn)行時(shí)容器提供服務(wù)的端口
2.2、開(kāi)始構(gòu)建
在虛擬機(jī)創(chuàng)建目錄
mkdir -p /usr/local/docker/my-project/docker
將打包后的my-project-server-1.0.0-SNAPSHOT.jar
文件和Dockerfile
文件上傳至該目錄。
執(zhí)行鏡像構(gòu)建命令
docker build -t my-project-server:v1 .
構(gòu)建成功
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE my-project-server v1 ed30386b06d2 11 seconds ago 334MB openjdk 8-jre 26ac3f63d29f 9 months ago 273MB
三、搭建私服
3.1、搭建 Docker Registry
創(chuàng)建目錄
mkdir -p /usr/local/docker/registry
在該目錄下創(chuàng)建Docker Registry
的 docker-compose.yml
。內(nèi)容如下:
cd /usr/local/docker/registry
version: '3.1' services: registry: image: registry restart: always container_name: registry ports: - 5000:5000 volumes: - ./data:/var/lib/registry
啟動(dòng)容器
docker-compose up -d
3.2、搭建 Docker Registry WebUI
創(chuàng)建目錄
mkdir -p /usr/local/docker/docker-registry-frontend
在該目錄下創(chuàng)建Docker Registry
的 docker-compose.yml
。內(nèi)容如下:
cd /usr/local/docker/docker-registry-frontend
version: '3.1' services: frontend: image: konradkleine/docker-registry-frontend:v2 ports: - 8080:80 volumes: - ./certs/frontend.crt:/etc/apache2/server.crt:ro - ./certs/frontend.key:/etc/apache2/server.key:ro environment: - ENV_DOCKER_REGISTRY_HOST=192.168.110.158(Docker倉(cāng)庫(kù)的IP) - ENV_DOCKER_REGISTRY_PORT=5000
需要將
ENV_DOCKER_REGISTRY_HOST
的值更改為自己搭建的DockerRegistry
服務(wù)的IP
啟動(dòng)容器
docker-compose up -d
瀏覽器訪問(wèn)http://192.168.110.158:8080/
,效果如下:
3.3、客戶端配置
在需要上傳 Docker
鏡像的客戶端需配置daemon.json
,完整路徑在 /etc/docker/daemon.json
vi /etc/docker/daemon.json
需增加如下內(nèi)容:
"insecure-registries": [ "Docker倉(cāng)庫(kù)的IP:5000" ]
完整daemon.json
內(nèi)容:
{ "registry-mirrors": [ "https://xxx.mirror.aliyuncs.com" ], "insecure-registries": [ "192.168.110.158:5000" ] }
registry-mirrors
:為鏡像加速地址,這里為我自己申請(qǐng)的加速地址。大家可以自己申請(qǐng)一個(gè),也可以在網(wǎng)上找一個(gè)。insecure-registries
:Docker倉(cāng)庫(kù)的IP。
重新啟動(dòng)服務(wù)
systemctl daemon-reload systemctl restart docker
3.4、上傳私服
搭建以及配置完成后,需要將我們之前構(gòu)建的鏡像上傳至我們自己的Docker倉(cāng)庫(kù)。
查看鏡像
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE my-project-server v1 6af7d633afb7 5 seconds ago 334MB openjdk 8-jre 26ac3f63d29f 9 months ago 273MB
1)、鏡像標(biāo)記
使用 docker tag
將 my-project-server:v1
這個(gè)鏡像標(biāo)記為 192.168.110.158:5000/my-project-server:v1
。
192.168.110.158
為我的Docker倉(cāng)庫(kù)的IP。格式為:
docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
命令如下:
docker tag my-project-server:v1 192.168.110.158:5000/my-project-server:v1
標(biāo)記后,查看鏡像
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.110.158:5000/my-project-server v1 6af7d633afb7 3 minutes ago 334MB my-project-server v1 6af7d633afb7 3 minutes ago 334MB openjdk 8-jre 26ac3f63d29f 9 months ago 273MB
2)、鏡像上傳
使用 docker push
上傳鏡像。
$ docker push 192.168.110.158:5000/my-project-server The push refers to repository [192.168.110.158:5000/my-project-server] 5b9e874b9f9c: Pushed e87c042d22f8: Pushed b4cfcb8385a8: Pushed 2b730cf18c09: Pushed edeaba958753: Pushed 8bf42db0de72: Pushed 31892cc314cb: Pushed 11936051f93b: Pushed v1: digest: sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40 size: 2000
3)、查看鏡像
使用 curl
查看 192.168.110.158:5000/v2/_catalog
地址,可以看到上傳成功的鏡像
$ curl 192.168.110.158:5000/v2/_catalog {"repositories":["my-project-server"]}
這里我們可以成功的看到我們上傳的鏡像。
我們也可以在我們剛剛搭建的WebUI上可視化的查看我們的鏡像。效果圖如下:
4)、驗(yàn)證
此時(shí)我們將本地鏡像刪除,嘗試從私有倉(cāng)庫(kù)下載這個(gè)鏡像
先刪除已有鏡像
docker rmi my-project-server:v1 192.168.110.158:5000/my-project-server:v1
下載鏡像
docker pull 192.168.110.158:5000/my-project-server:v1
$ docker pull 192.168.110.158:5000/my-project-server:v1 v1: Pulling from my-project-server 0e29546d541c: Already exists 9b829c73b52b: Already exists cb5b7ae36172: Already exists 99ce012bef04: Already exists 22dc2a72d098: Already exists 9c69a57e10d9: Already exists 776f54050ab5: Pull complete 65a83a9a7871: Pull complete Digest: sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40 Status: Downloaded newer image for 192.168.110.158:5000/my-project-server:v1 192.168.110.158:5000/my-project-server:v1 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.110.158:5000/my-project-server v1 6af7d633afb7 15 minutes ago 334MB openjdk 8-jre 26ac3f63d29f 9 months ago 273MB
我們可以看到可以正常拉取。
四、容器啟動(dòng)
鏡像構(gòu)建并上傳至完成后,可以直接使用Docker Compose
來(lái)啟動(dòng)容器。實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行。
創(chuàng)建目錄
mkdir -p /usr/local/docker/my-project
在該目錄下創(chuàng)建Docker Registry
的 docker-compose.yml
。內(nèi)容如下:
cd /usr/local/docker/my-project
version: '3.1' services: my_project_server: image: 192.168.110.158:5000/my-project-server:v1 container_name: my-project-server restart: always ports: - 8899:8899 volumes: - ./logs:/logs environment: TZ: Asia/Shanghai
啟動(dòng)容器
docker-compose up -d
查看容器啟動(dòng)狀態(tài)
docker ps -a
訪問(wèn)查詢所有用戶接口
http://ip:8899/sys-user/get/all
到此這篇關(guān)于SpringBoot整合Docker實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行的文章就介紹到這了,更多相關(guān)SpringBoot整合Docker內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11eclipse下整合springboot和mybatis的方法步驟
這篇文章主要介紹了eclipse下整合springboot和mybatis的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03java開(kāi)發(fā)微服務(wù)架構(gòu)設(shè)計(jì)消息隊(duì)列的水有多深
今天我們說(shuō)說(shuō)消息隊(duì)列的問(wèn)題,來(lái)帶大家探一探消息隊(duì)列的水有多深,希望看完本文大家在引入消息隊(duì)列的時(shí)候先想一想,是不是一定要引入?引入消息隊(duì)列后產(chǎn)生的問(wèn)題能不能解決2021-10-10Java mutable對(duì)象和immutable對(duì)象的區(qū)別說(shuō)明
這篇文章主要介紹了Java mutable對(duì)象和immutable對(duì)象的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06