、简介
这里介绍在docker中部署自定义项目。
二、部署流程
在docker中部署自定义项目,流程为创建自定义项目、生成自定义项目镜像、docker容器中运行项目镜像。
2.1 创建自定义项目
这里略过,根据需要创建。
2.2 生成目标镜像
生成目标镜像有两种方式,一种是根据maven插件生成,另一种根据定义Dockerfile文件生成。
2.2.1 根据maven插件生成镜像
在pom.xml的插件模块,添加类似如下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker 部署插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--绑定在package阶段执行插件,即执行mvn package时,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定镜像名-->
<imageName>${project.artifactId}</imageName>
<!--指定标签,即镜像版本-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--指定基础镜像jdk1.8-->
<baseImage>java</baseImage>
<!-- 镜像制作人本人信息 -->
<maintainer>author_name</maintainer>
<!--切换到指定目录下,这里为/home/app目录-->
<workdir>/home/app</workdir>
<!--${project.build.finalName}.jar是打包后生成的jar包的名字-->
<!-- jar包部署-->
<entryPoint>["java", "-jar", "/home/app/${project.build.finalName}.jar"]</entryPoint>
<!--指定docker服务地址-->
<!-- <dockerHost>tcp://localhost:2375</dockerHost>-->
<!-- 复制生成的jar包到docker容器指定目录-->
<resources>
<resource>
<!-- 将生成的jar包复制到容器指定路径下-->
<targetPath>/home/app</targetPath>
<!--指定资源目录,这里为maven打包后的target目录-->
<directory>${project.build.directory}</directory>
<!-- 指定需要复制的文件,这里为生成的jar包 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
接着运行mavan打包命令即可:
mvn clean package -Dmaven.test.skip=true
2.2.2 定义Dockerfile文件生成
Dockerfile文件用于生成镜像,文件内容可参数https://www.runoob.com/docker/docker-dockerfile.html。 常用定义含义如下:
FROM:指定新构建镜像的基础镜像,如java项目则依赖于基础java镜像,对应书写为:FROM java
RUN:在docker run 时运行,用于执行命令,格式为:RUN ["可执行文件", "参数1", "参数2"],如:RUN ["java", "--version"],在shell下执行命令:java --version
COPY:从上下文目录中复制文件到指定目录,格式为:COPY [--chown=<user>:<group>] <源路径1>... <目标路径>,如:COPY target/hello-0.0.1-SNAPSHOT.jar / ,即将上下文下的target/hello-0.0.1-SNAPSHOT.jar文件复制到容器的/目录下
ADD:和COPY类似,推荐使用COPY
CMD:和RUN类似,在 docker build时运行
ENTRYPOINT:和CMD类似
ENV:设置环境变量,格式为:ENV <key> <value> 或 ENV <key1>=<value1> <key2>=<value2>...
ARG:构建参数,和ENV类似,仅在Dockerfile内有效,即仅在docker build过程中有效
VOLUME:定义挂载数据卷,默认会挂到匿名卷下,格式为:VOLUME ["<路径1>", "<路径2>"...] 或 VOLUME <路径>
EXPOSE:声明端口,方便在使用中映射,在使用中使用docker run -P随机端口映射时,会随机映射EXPOSE端口
WORKDIR:指定工作目录,格式如:WORKDIR <工作目录路径>
USER:指定后续命令执行的用户和用户组,格式如:USER <用户名>[:<用户组>]
Dockerfile文件放于项目根目录下,接着执行格式如下的命令生成镜像:
docker build -t 镜像名称:镜像标签 上下文路径(需要打包复制到镜像的目录,未指定则默认是存放Dockerfile文件的所在目录)
如:
docker build -t spring_boot_docker_image:latest .
2.3 运行目标镜像
运行目标镜像,可以直接命令运行,也可以通过idea插件运行。
2.3.1 命令运行
命令运行同其它镜像运行一样,示例如下:
docker run -d -p 20004:8051 --name spring_boot_docker spring_boot_docker_image
2.3.2 通过idea插件运行
idea中通过插件集成了docker功能,可以对docker中镜像及容器进行管理。在操作前,提前安装好idea及docker插件。以项目部署为例,操作包含idea配置和目标项目配置,具体如下:
idea配置
1、idea控制界面,安装docker插件,Preferences | Plugins ->docker;
2、idea控制界面,添加docker,Preferences | Build, Execution, Deployment | Docker -> 添加docker,并连接成功
3、回到idea操作界面,选择底部Services,在底部左则可看到安装好的Docker,右键点击连接。下拉选项可以看到已经安装的镜像和容器
目标项目配置
1、修改pom.xml,添加docker-maven-plugin插件
2、运行maven package,生成项目镜像
3、在idea操作界面services中的docker镜像中,找到刚创建的项目镜像,右键新建容器,在弹框中指定容器名称、机器端口与容器端口映射关系
4、运行新创建的容器,采用机器端口即可访问docker容器中运行的镜像
三、示例
这里以部署自定义项目spring_boot_docker到docker为例,直接借助idea的docker插件部署。
3.1 创建自定义项目
示例自定义项目为spring_boot_docker,包含文件如下:
maven配置文件pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dragon.study</groupId>
<artifactId>spring_boot_docker</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring_boot_docker</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker 部署插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--绑定在package阶段执行插件,即执行mvn package时,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定镜像名-->
<imageName>${project.artifactId}</imageName>
<!--指定标签,即镜像版本-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--指定基础镜像jdk1.8-->
<baseImage>java</baseImage>
<!-- 镜像制作人本人信息 -->
<maintainer>author_name</maintainer>
<!--切换到指定目录下,这里为/home/app目录-->
<workdir>/home/app</workdir>
<!--${project.build.finalName}.jar是打包后生成的jar包的名字-->
<!-- jar包部署-->
<entryPoint>["java", "-jar", "/home/app/${project.build.finalName}.jar"]</entryPoint>
<!--指定docker服务地址-->
<!-- <dockerHost>tcp://localhost:2375</dockerHost>-->
<!-- 复制生成的jar包到docker容器指定目录-->
<resources>
<resource>
<!-- 将生成的jar包复制到容器指定路径下-->
<targetPath>/home/app</targetPath>
<!--指定资源目录,这里为maven打包后的target目录-->
<directory>${project.build.directory}</directory>
<!-- 指定需要复制的文件,这里为生成的jar包 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yaml文件
spring:
application:
name: spring-boot-docker
server:
port: 8051
HelloController.java类
package com.dragon.study.spring_boot_docker.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping
public class HelloController {
@RequestMapping("hello")
public String hello(){
return "hello, nice to meet you";
}
}
启动类SpringBootDockerApplication.java
package com.dragon.study.spring_boot_docker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDockerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDockerApplication.class, args);
}
}
3.2 生成目标镜像
在idea中选择maven的package,对自定义项目spring_boot_docker打包,打完包。可以在docker插件发现已经生成的包。当然也可以通过命令查看:
docker images
3.3 运行目标镜像
在idea的docker插件中,选择新生成的镜像,并创建容器,指定端口映射(20004:8051)信息,运行窗口即可,也可通过命令运行行运行,命令如下:
docker run -d -p 20004:8051 --name spring_boot_docker spring_boot_docker
3.4 测试
GET http://localhost:20004/hello
Accept: application/json
响应:
hello, nice to meet you
ocker随手笔记第一节 docker概念及安装
docker随手笔记第二节 docker常用命令解析
docker随手笔记第三节 docker构建java镜像
docker随手笔记第四节 docker安装mysql5.7
docker随手笔记第五节 docker安装redis4.0
docker随手笔记第六节 docker安装jenkins
docker随手笔记第七节 jenkins通过git部署java微服务插件安装
docker随手笔记第八节 jenkins通过git自动部署java微服务
docker随手笔记第九节 docker -v参数 目录挂载总结
docker随手笔记第十节 docker 开启远程访问
docker随手笔记第十一节 portainer.io安装使用,比k8s简单
点击新建任务
输入任务名称,选择构建自由风格软件项目,然后点击确定
丢弃旧的构建配置
源码选择你前端git仓库地址,或者svn地址
配置Delete workspace before build starts
配置Post Steps,配置ssh,执行ssh脚本
输入ssh脚本
mkdir -p /home/web cd /home/web #由于/var/jenkins_home这个目录我映射到宿主机/jenkins/jenkins-data目录 cp -R /jenkins/jenkins-data/workspace/web/html html cat > Dockerfile << EOF FROM nginx EXPOSE 80 COPY ./html /usr/share/nginx/html ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone EOF docker build -t web:0.1 . d1=$(date "+%Y%m%d%H%M") name="web" appName=$name$d1 docker stop $(docker ps | grep $name | awk '{print $1}') docker run --name $appName -d -p 8081:80 $appName:0.1
保存后点击立即构建,这样自动部署就成功了
就可以访问了,http://服务ip:8081
*请认真填写需求信息,我们会在24小时内与您取得联系。