整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

docker中部署项目

、简介

这里介绍在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简单

jenkins自动部署前端静态页面

点击新建任务



输入任务名称,选择构建自由风格软件项目,然后点击确定

丢弃旧的构建配置


源码选择你前端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