一、容器化部署的好處
Docker 作為一種新興的虛擬化方式,它可以更高效的利用系統(tǒng)資源,不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開(kāi)銷。
傳統(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í)行。
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
- 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
二、構(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。代碼如下:
FROMopenjdk:8-jre
MAINTAINERMicromaple@qq.com>
RUNmkdir/app
COPYmy-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"]
EXPOSE8899
-
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)建命令
dockerbuild-tmy-project-server:v1.
構(gòu)建成功
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
my-project-serverv1ed30386b06d211secondsago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
三、搭建私服
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-composeup-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-composeup-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ù)
systemctldaemon-reload
systemctlrestartdocker
3.4、上傳私服
搭建以及配置完成后,需要將我們之前構(gòu)建的鏡像上傳至我們自己的Docker倉(cāng)庫(kù)。
查看鏡像
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
my-project-serverv16af7d633afb75secondsago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB
1)、鏡像標(biāo)記
使用 docker tag 將 my-project-server:v1 這個(gè)鏡像標(biāo)記為 192.168.110.158:5000/my-project-server:v
1。
192.168.110.158為我的Docker倉(cāng)庫(kù)的IP。
格式為:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
命令如下:
dockertagmy-project-server:v1192.168.110.158:5000/my-project-server:v1
標(biāo)記后,查看鏡像
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
192.168.110.158:5000/my-project-serverv16af7d633afb73minutesago334MB
my-project-serverv16af7d633afb73minutesago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB
2)、鏡像上傳
使用 docker push 上傳鏡像。
$dockerpush192.168.110.158:5000/my-project-server
Thepushreferstorepository[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:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40size:2000
3)、查看鏡像
使用 curl 查看 192.168.110.158:5000/v2/_catalog
地址,可以看到上傳成功的鏡像
$curl192.168.110.158:5000/v2/_catalog
{"repositories":["my-project-server"]}
這里我們可以成功的看到我們上傳的鏡像。
我們也可以在我們剛剛搭建的WebUI上可視化的查看我們的鏡像。效果圖如下:

4)、驗(yàn)證
此時(shí)我們將本地鏡像刪除,嘗試從私有倉(cāng)庫(kù)下載這個(gè)鏡像
先刪除已有鏡像
dockerrmimy-project-server:v1192.168.110.158:5000/my-project-server:v1
下載鏡像
dockerpull192.168.110.158:5000/my-project-server:v1
$dockerpull192.168.110.158:5000/my-project-server:v1
v1:Pullingfrommy-project-server
0e29546d541c:Alreadyexists
9b829c73b52b:Alreadyexists
cb5b7ae36172:Alreadyexists
99ce012bef04:Alreadyexists
22dc2a72d098:Alreadyexists
9c69a57e10d9:Alreadyexists
776f54050ab5:Pullcomplete
65a83a9a7871:Pullcomplete
Digest:sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40
Status:Downloadednewerimagefor192.168.110.158:5000/my-project-server:v1
192.168.110.158:5000/my-project-server:v1
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
192.168.110.158:5000/my-project-serverv16af7d633afb715minutesago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB
我們可以看到可以正常拉取。
四、容器啟動(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-composeup-d
查看容器啟動(dòng)狀態(tài)
dockerps-a
訪問(wèn)查詢所有用戶接口
- http://ip:8899/sys-user/get/all

-
容器
+關(guān)注
關(guān)注
0文章
507瀏覽量
22369 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14887 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
962瀏覽量
29068 -
SpringBoot
+關(guān)注
關(guān)注
0文章
175瀏覽量
321
原文標(biāo)題:SpringBoot + Docker 實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行~
文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
參考STM32 MPU生態(tài)資源利用Yocto構(gòu)建STM32MP2芯片鏡像運(yùn)行docker
一次消諧裝置與二次消諧裝置區(qū)別、一次消諧器與二次消諧器的區(qū)別

Docker Compose的常用命令
【技術(shù)案例】Android in Docker

請(qǐng)問(wèn)init_ipc_shm() 是否只初始化一次?
基于Docker鏡像逆向生成Dockerfile

基于 Docker 與 Jenkins 實(shí)現(xiàn)自動(dòng)化部署

Docker運(yùn)行環(huán)境安裝
一次電源與二次電源有什么不同
一次電池分類以及應(yīng)用場(chǎng)景詳解

無(wú)線時(shí)鐘一秒轉(zhuǎn)一次思路怎么設(shè)置
labview如何做到一次觸發(fā)采集一次
手動(dòng)構(gòu)建Docker鏡像的方法

評(píng)論