一、容器化部署的好处
Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
最重要的是一致的运行环境。Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。从而达到真正意义上的 一次构建,到处执行。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 视频教程:https://doc.iocoder.cn/video/
二、构建镜像
2.1、Dockerfile
接着我们开始使用 Dockerfile 来定制我们的镜像,从而达到容器化的目的。Dockerfile 的本质就是将一系列修改、安装、构建、操作的命令整合到一起,去构建一个个性化的镜像,以达到一次构建,到处运行。 接下来我们就来构建自定义镜像。
在my-project-server模块下创建docker目录,在docker目录下创建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
:指定基础镜像,项目是使用jdk8开发的项目,所以我们指定的基础镜像为openjdk:8-jre -
MAINTAINER
:项目维护人员 -
RUN
:执行命令,在根目录下创建app目录 -
COPY
:将宿主机当前目录下的my-project-server-1.0.0-SNAPSHOT.jar
文件拷贝到app目录下,并重命名为app.jar -
ENTRYPOINT
:指定容器启动程序及参数 -
EXPOSE
:指定运行时容器提供服务的端口
2.2、开始构建
在虚拟机创建目录
mkdir-p/usr/local/docker/my-project/docker
将打包后的my-project-server-1.0.0-SNAPSHOT.jar
文件和Dockerfile文件上传至该目录。
执行镜像构建命令
dockerbuild-tmy-project-server:v1.
构建成功
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
my-project-serverv1ed30386b06d211secondsago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
三、搭建私服
3.1、搭建 Docker Registry
创建目录
mkdir-p/usr/local/docker/registry
在该目录下创建Docker Registry 的 docker-compose.yml。内容如下:
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
启动容器
docker-composeup-d
3.2、搭建 Docker Registry WebUI
创建目录
mkdir-p/usr/local/docker/docker-registry-frontend
在该目录下创建Docker Registry 的 docker-compose.yml。内容如下:
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仓库的IP)
-ENV_DOCKER_REGISTRY_PORT=5000
需要将
ENV_DOCKER_REGISTRY_HOST
的值更改为自己搭建的DockerRegistry
服务的IP
启动容器
docker-composeup-d
浏览器访问http://192.168.110.158:8080/
,效果如下:
3.3、客户端配置
在需要上传 Docker 镜像的客户端需配置daemon.json,完整路径在 /etc/docker/daemon.json
vi/etc/docker/daemon.json
需增加如下内容:
"insecure-registries":[
"Docker仓库的IP:5000"
]
完整daemon.json内容:
{
"registry-mirrors":[
"https://xxx.mirror.aliyuncs.com"
],
"insecure-registries":[
"192.168.110.158:5000"
]
}
-
registry-mirrors
:为镜像加速地址,这里为我自己申请的加速地址。大家可以自己申请一个,也可以在网上找一个。 -
insecure-registries
:Docker仓库的IP。
重新启动服务
systemctldaemon-reload
systemctlrestartdocker
3.4、上传私服
搭建以及配置完成后,需要将我们之前构建的镜像上传至我们自己的Docker仓库。
查看镜像
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
my-project-serverv16af7d633afb75secondsago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB
1)、镜像标记
使用 docker tag 将 my-project-server:v1 这个镜像标记为 192.168.110.158:5000/my-project-server:v
1。
192.168.110.158为我的Docker仓库的IP。
格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
命令如下:
dockertagmy-project-server:v1192.168.110.158:5000/my-project-server:v1
标记后,查看镜像
$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)、验证
此时我们将本地镜像删除,尝试从私有仓库下载这个镜像
先删除已有镜像
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
我们可以看到可以正常拉取。
四、容器启动
镜像构建并上传至完成后,可以直接使用Docker Compose来启动容器。实现一次构建到处运行。
创建目录
mkdir-p/usr/local/docker/my-project
在该目录下创建Docker Registry 的 docker-compose.yml。内容如下:
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
启动容器
docker-composeup-d
查看容器启动状态
dockerps-a
访问查询所有用户接口
- http://ip:8899/sys-user/get/all
-
容器
+关注
关注
0文章
495浏览量
22061 -
spring
+关注
关注
0文章
340浏览量
14341 -
虚拟机
+关注
关注
1文章
916浏览量
28181 -
SpringBoot
+关注
关注
0文章
173浏览量
177
原文标题:SpringBoot + Docker 实现一次构建到处运行~
文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论