本章目标
IDEA使用Docker插件实现springboot项目的一键部署
要开两个虚拟机
server
registry
Docker开启远程api端口(注意这种配置方式只适用于开发和学习,在公共网络中不要这样配置,容易引发安全问题)
默认情况下dokcer是不支持远程访问的,需要修改配置,开启Docker的远程访问
#1.修改Docker服务文件,需要先切换到root用户
vim /lib/systemd/system/docker.service
#2.注释掉"ExecStart"这一行,并添加下面这一行信息
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
#3.重新加载配置文件
systemctl daemon-reload
#4.重启服务
systemctl restart docker.service
#5.查看配置的端口号(2375)是否开启(非必要)
netstat -nlpt
#6.修改防火墙添加2375端口(必需)
firewall-cmd --zone=public --add-port=2375/tcp --permanent &&
firewall-cmd --reload &&
firewall-cmd --list-ports
注1:“Docker”插件仅仅是一个图形化管理工具,一键部署另有其人
镜像的拉取(略)
idea可以通过可视化的方式拉取镜像,不用自己去敲命令
注1:有时候会出现拉取的时间超时的情况,可以配置一下国内的镜像获取阿里云的加速器
容器的创建与运行(略)
1.创建springboot项目test1启动并测试
2.将test1项目打成jar包
版本指定为1.x.0
3.上传test1jar到linux服务器
mkdir /usr/local/mytools && cd /usr/local/mytools
rz
4.创建并编辑dockerfile
cd /usr/local/mytools
vim Dockerfile
#1.指定基础镜像
FROM openjdk:8-jdk-alpine
#2.维护者信息
MAINTAINER xyz "[email protected]"
#3.创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录
VOLUME /tmp
#4.复制test1.jar到容器里
#此处与之后的idea中使用docker插件一键发布是不一样的
ADD test1.jar /test1.jar
#5.设置时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#6.声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 8080
#7.指定容器启动程序及参数(相当于在容器中用cmd命令执行jar包)
ENTRYPOINT ["java","-jar","/test1.jar"]
#下面的写法指定springboot项目启动时指定的额外参数
#ENTRYPOINT ["java","-jar","/test1.jar","--spring.config.location=/usr/local/project/docker/xxl-job/config/application.yml"]
5.执行dockerfile创建对应版本的镜像(x换成对应版本即可)
docker build -t test1:1.0.0 .
6.使用test1:l.x.0镜像启动容器(x换成对应版本即可)
docker run -d
-p 8080:8080
–name test1
–restart=always
test1:1.0.0
docker stop test1 && docker rm test1
注1:如果8080端口无法访问,请修改防火墙添加8080端口(必需)
firewall-cmd --zone=public --add-port=8080/tcp --permanent && \
firewall-cmd --reload && \
firewall-cmd --list-ports
7.打开postman进行测试
小结:传统的docker部署springboot项目,需要自己手动配置Dockerfile文件,还需要将生成的jar包跟Dockerfile文件一起上传到服务器,再创建镜像,然后启动容器,整个流程下来很麻烦,如果用idea的dockerfile-maven-plugin插件就可以实现一键部署springboot项目,简单方便
私有镜像仓库
1.关键概念
仓库(Repository):就是存放镜像的地方。类似于 Node 的 npm; java 的 Maven。
注册服务器(Registry):它的概念比较容易与仓库混淆。实际上注册服务器是用来管理仓库的服务器,一个服务器上可以存在多个仓库,而每个仓库下可以有多个镜像。例如对于仓库地址 hub.dockerpool.com/nginx 来说,hub.dockerpool.com 是注册服务器的地址,nginx 是仓库名。
私有仓库:公司的项目一般不予许我们上传到 Docker Hub 这类的公共仓库中,所有学会创建一个私有仓库也是非常必要的
2.私服搭建两种方案
docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,
harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求
注1:harbor翻译成中文就是码头的意思
3.docker官方提供的私有仓库registry的搭建与使用
1).拉取Registry镜像(这里选择搭建2.7版本的registry)
docker pull registry:2.7
2).创建并运行Registry容器
docker run -d
–name myregistry
-p 5000:5000
-v /usr/local/docker/registry:/var/lib/registry
–restart=always
registry:2.7
注1:使用-v /usr/local/docker/registry:/var/lib/registry将宿主机/usr/local/docker/registry挂载到容器/var/lib/registry,即将上传的镜像放到本地的/usr/local/docker/registry目录下
3).验证是否搭建成功
#访问私有镜像仓库地址,仓库目前为空
curl http://127.0.0.1:5000/v2/_catalog
curl http://192.168.183.165:5000/v2/_catalog
4).让docker信任私有镜像仓库地址
# 1.vi编辑器打开/etc/docker/daemon.json
vi /etc/docker/daemon.json
#2.在daemon.json中添加以下内容,其值为注册服务器(registry)的IP及端口(注:IP及端口改成自己机器上的相关IP及端口)
“insecure-registries”:[“192.168.238.134:5000”]
#3.daemon.json修改完成后结果如下,其中阿里云加速地址不要修改,IP要修改成docker registry的IP
{
“registry-mirrors”:[“加速地址”],
“insecure-registries”:[“192.168.238.134:5000”]
}
#4.然后重启Docker服务
systemctl restart docker && systemctl status docker
5).在私有仓库的使用
上传、下载镜像
创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 127.0.0.1:5000
#1.先在本机查看已有的镜像,选择其中一个进行上传
docker images
#2.镜像标记(push前必须先标记镜像)
##镜像标记语法,自定义repository 不能有大写字母
docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
docker tag 自定义镜像名[:版本] 私服IP:端口/仓库名[:版本]
例如:
docker tag test1:1.0.0 192.168.238.134:5000/test1:1.0.0
#标记完后再执行查看所有镜像,会多出一个镜像
docker images
#3.镜像上传
docker push 192.168.238.134:5000/test1:1.0.0
#4.注册服务器查看命令
#用curl 查看注册服务器的所有镜像
curl 192.168.238.134:5000/v2/_catalog
#列出指定镜像有哪些tag
curl 192.168.238.134:5000/v2/test1/tags/list
#5.删除本地的镜像(server1)
#删除指定镜像
docker rmi 192.168.238.134:5000/test1:1.0.0
#删除所有镜像
docker rmi -f $(docker images -qa)
注1:通过docker images命令可以看到,本地已经没有了192.168.217.143:5000/test1:1.0.0
#6.再从registry下载镜像
docker pull 192.168.238.134:5000/test1:1.0.0
<pluginGroups>
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>
2.在与pom.xml同目录创建Dockerfile文件
#1.指定基础镜像
FROM openjdk:8-jdk-alpine
#2.维护者信息
MAINTAINER xyz "[email protected]"
#3.创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录
VOLUME /tmp
#4.复制test1-latest.jar到容器里
ADD test1.jar /test1.jar
#5.设置时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#6.声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 8080
#7.指定容器启动程序及参数(相当于在容器中用cmd命令执行jar包)
ENTRYPOINT ["java","-jar","/test1.jar"]
#下面的写法指定springboot项目启动时指定的额外参数
#ENTRYPOINT ["java","-jar","/job.jar","--spring.config.location=/usr/local/project/docker/xxl-job/config/application.yml"]
附录一:使用openjdk:8-jdk-alpine镜像启动容器,并解决时区问题
附录二:dockerfile-maven-plugin和docker-maven-plugin的区别(重点)
在dockerfile-maven-plugin插件出现之前,还有一个maven插件是docker-maven-plugin,是由同一个作者创造,作者明确表示推荐使用dockerfile-maven-plugin,并会持续升级;
而docker-maven-plugin不在添加任何新功能,只接受修复bug。
两个插件的设计思想是有差别的,前者需要独立编写Dockerfile文件,后者允许没有Dockerfile文件,所有的docker相关配置都写在pom文件的plugin中,这样使maven插件显得很笨重,
并且如果脱离了这个maven插件还得重写编写Dockerfile,不够灵活。
因此,推荐使用maven插件:dockerfile-maven-plugin。
附:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>default</id>
<!-- 如果package时不想用docker打包,就注释掉这个goal-->
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!--<repository>注册服务器IP(push镜像的地址):5000/仓库名</repository>-->
<repository>192.168.238.133:5000/test1</repository>
<!-- 不指定tag默认为latest -->
<tag>${project.version}</tag>
<buildArgs>
<!-- 提供参数JAR_FILE向Dockerfile传递 -->
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>