前言
jenkins作用,docker是干什么的,持续化集成有什么好处,这里不多说,如果不明白你也不会看到这篇文章
docker-maven-plugin
想成功部署docker,这个插件配置必需掌握,一般使用 Maven 编译打包,然后生成镜像,通过镜像上线。
一个简单的配置如下:
<!-- tag::plugin[] -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
Maven内置隐式变量:
project暴露了POM,可以使用点标记.
的路径来引用POM元素的值
1. ${basedir}
: 项目根目录
2. ${project.build.directory}
:构建目录,缺省为target
3. ${project.build.outputDirectory}
: 构建过程输出目录,缺省为target/classes
4. ${project.build.finalName}
:产出物名称,缺省为${project.artifactId}-${project.version}
5. ${project.packaging}
:打包类型,缺省为jar
6. ${project.xxx}
:当前pom文件的任意节点的内容
7. ${project.artifactId}
:项目名
8. ${project.version}
:项目版本号
上面配置docker-maven-plugin插件:
${docker.image.prefix}
是docker前缀,这里指定为<docker.image.prefix>forezp</docker.image.prefix>
,其它都是maven内置变量。
resources
:构建时会生成docker文件夹,这里指生成文件夹的内容来源,包含了mvn clean package 之后的target的文件和生成的jar包。
dockerDirectory
:指定Dockerfile文件地址
imagename
:本地仓库名,镜像划归这个仓库里,相当于项目名,即docker images
命令展示的REPOSITORY字段,,一定要是符合正则[a-z0-9-_.]的,否则构建不会成功
最简单的部署例子
要具体jenkins使用基础,不会的移步Jenkins自动部署Maven +tomcat+linux环境java项目并自动部署到外网
源码地址
最简单的部署过程:代码向git上提交,使用maven命令clean package -Dmaven.test.skip=true docker:build
构建镜像文件,然后在阿里云服务器上使用命令提交到阿里云仓库。
创建仓库
创建阿里云仓库地址。
创建一个镜像仓库,一个主账号最多可以创建五个命名空间,每个项目对应一个镜像仓库,镜像仓库里可查看项目的版本号
推送镜像命令:
//登陆
docker login --username=yiying122912 registry.cn-hangzhou.aliyuncs.com
//docker tag重命名镜像,指定镜像版版本号
docker tag [镜像id/镜像名] registry.cn-hangzhou.aliyuncs.com/cjzlwl/oil:[镜像版本号]
//推送镜像
docker push registry.cn-hangzhou.aliyuncs.com/cjzlwl/oil:[镜像版本号]
仓库地址
这里的registry.cn-hangzhou.aliyuncs.com
公用外网地址,如果服务器是用阿里云,则建议使用内网,网速将大大提升,大部分ECS是VPC虚拟网络。
经典网络内网地址:registry-internal.cn-hangzhou.aliyuncs.com
vpc网络内网地址:registry-vpc.cn-hangzhou.aliyuncs.com
docker tag/push使用
docker push
:将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker tag
: 重命名镜像,标记本地镜像,将其归入某一仓库。tag后不一定非要是IMAGEID
,是REPOSITORY
值也可以。
在执行docker tag
,它还是本地镜像,只是归入到registry.cn-hangzhou.aliyuncs.com/cjzlwl/oil
仓库下,直到docker push
提到这个仓库里,才与外网通过。docker push
可以提到镜像或仓库。
每个刚生成的镜像都会随机生成一串无规则的字符串代表此次生成的imageId,tag作用就是重命名镜像,由registry.cn-hangzhou.aliyuncs.com/cjzlwl/oil:[镜像版本号]
我们可以看出,仓库域名是registry.cn-hangzhou.aliyuncs.com
,命名空间是cjzlwl
,镜像仓库名是oil
,镜像版本号是镜像的版本号,镜像仓库下罗列这个项目的所以版本号,这个形成一个完整的提交地址url。
在jenkins上配置
由于这是最简单的配置,使用的过程是由程序提交镜像到仓库,故没有jenkins关于docker插件
新建项目TestDocker
,配置如下:
1.添加指定git地址
2.构建
构造命令:mvn clean package -Dmaven.test.skip=true docker:build
,注意在jenkis里不用mvn
.
3.执行上传镜像shell命令
docker login --username=用户名 --password=密码 registry-vpc.cn-hangzhou.aliyuncs.com
docker tag 镜像id registry-vpc.cn-hangzhou.aliyuncs.com/cjzlwl/oil:[版本号,默认latest]
docker push registry-vpc.cn-hangzhou.aliyuncs.com/cjzlwl/oil:[版本号,默认latest]
执行结果
结果如下,说明配置成功
运行镜像试试
docker run -d -p 8280:8761 -it --name eureka-server registry-vpc.cn-hangzhou.aliyuncs.com/cjzlwl/oil:[版本号,默认latest]
最简单的部署优化
上面虽然能成功,但有个缺点,即版本号不自由。版本号是必需写死的或者默认latest的,每次升级版本都要修改jenkins配置,这不是我们想看到的,我们想在项目里能配置。
修改pom.xml
<!-- tag::plugin[] -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<imageName>registry-vpc.cn-hangzhou.aliyuncs.com/cjzlwl/oil</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<serverId>aliyuncs-docker-registry-vpc</serverId>
</configuration>
</plugin>
- 增加了imageTag配置,配置了2个镜像版本号,一个最新的,一个0.0.1-SNAPSHOT,当然这些可修改
- imageName镜像名修改成registry-vpc.cn-hangzhou.aliyuncs.com/cjzlwl/oil,如果你看过我上面分析你会明白,构建好的镜像是划归到本地仓库的,你可以理解了项目名,本地仓库名即
registry-vpc.cn-hangzhou.aliyuncs.com/cjzlwl/oil
,也是一个完整的外网仓库地址url,注意这里没带版本号,版本号由imageTag指定 - serverId帐户信息,登陆阿里云仓库地址, 这个是maven里配置。
maven配置帐户信息
Maven 的配置文件 setting.xml 中增加相关 server 配置,配置如下:
<server>
<id>aliyuncs-docker-registry-vpc</id>
<username>名字</username>
<password>密码</password>
<configuration>
<email>[email protected]</email>
</configuration>
</server>
不需要重启服务器。
jenkins配置
命令:
mvn clean package docker:build
: 只执行 build 操作
mvn clean package docker:build -DpushImage
: 执行 build 完成后 push 镜像。
mvn clean package docker:build -DpushImageTag
: 执行 build 并 push 指定 tag 的镜像
注意:这里必须指定至少一个 imageTag,它可以配置到 POM 中,也可以在命令行指定。
命令行指定如下:mvn clean package docker:build -DpushImageTags -DdockerImageTags=imageTag_1 -DdockerImageTags=imageTag_2
,命令行指定的TAG是新的TAG,和上面xml里配置的不冲突。其实就是指定推送的TAG名。
build命令:
mvn clean package docker:build -DpushImageTag -DdockerImageTags=latest
指定提交的版本号,如果不指定,在pom.xml里配置的2个版本号都会提交。
问题
mvn docker:build fails with “{}->unix://localhost:80: Connection reset by peer
答:docker-maven-plugin插件默认是连接docker的2375端口,如果我们有修改端口的情况,需要设置DOCKER_HOST。
打开
vi /etc/profile
在文件末尾添加(如果默认端口2375修改成了9000)
export DOCKER_HOST=tcp://0.0.0.0:9000
让配置生效:
source /etc/profile
备注:修改docker默认端口