、簡介
這里介紹在docker中部署自定義項(xiàng)目。
二、部署流程
在docker中部署自定義項(xiàng)目,流程為創(chuàng)建自定義項(xiàng)目、生成自定義項(xiàng)目鏡像、docker容器中運(yùn)行項(xiàng)目鏡像。
2.1 創(chuàng)建自定義項(xiàng)目
這里略過,根據(jù)需要?jiǎng)?chuàng)建。
2.2 生成目標(biāo)鏡像
生成目標(biāo)鏡像有兩種方式,一種是根據(jù)maven插件生成,另一種根據(jù)定義Dockerfile文件生成。
2.2.1 根據(jù)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>
<!--將插件綁定在某個(gè)phase執(zhí)行-->
<executions>
<execution>
<id>build-image</id>
<!--綁定在package階段執(zhí)行插件,即執(zhí)行mvn package時(shí),就會(huì)自動(dòng)執(zhí)行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定鏡像名-->
<imageName>${project.artifactId}</imageName>
<!--指定標(biāo)簽,即鏡像版本-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--指定基礎(chǔ)鏡像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服務(wù)地址-->
<!-- <dockerHost>tcp://localhost:2375</dockerHost>-->
<!-- 復(fù)制生成的jar包到docker容器指定目錄-->
<resources>
<resource>
<!-- 將生成的jar包復(fù)制到容器指定路徑下-->
<targetPath>/home/app</targetPath>
<!--指定資源目錄,這里為maven打包后的target目錄-->
<directory>${project.build.directory}</directory>
<!-- 指定需要復(fù)制的文件,這里為生成的jar包 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
接著運(yùn)行mavan打包命令即可:
mvn clean package -Dmaven.test.skip=true
2.2.2 定義Dockerfile文件生成
Dockerfile文件用于生成鏡像,文件內(nèi)容可參數(shù)https://www.runoob.com/docker/docker-dockerfile.html。 常用定義含義如下:
FROM:指定新構(gòu)建鏡像的基礎(chǔ)鏡像,如java項(xiàng)目則依賴于基礎(chǔ)java鏡像,對(duì)應(yīng)書寫為:FROM java
RUN:在docker run 時(shí)運(yùn)行,用于執(zhí)行命令,格式為:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"],如:RUN ["java", "--version"],在shell下執(zhí)行命令:java --version
COPY:從上下文目錄中復(fù)制文件到指定目錄,格式為:COPY [--chown=<user>:<group>] <源路徑1>... <目標(biāo)路徑>,如:COPY target/hello-0.0.1-SNAPSHOT.jar / ,即將上下文下的target/hello-0.0.1-SNAPSHOT.jar文件復(fù)制到容器的/目錄下
ADD:和COPY類似,推薦使用COPY
CMD:和RUN類似,在 docker build時(shí)運(yùn)行
ENTRYPOINT:和CMD類似
ENV:設(shè)置環(huán)境變量,格式為:ENV <key> <value> 或 ENV <key1>=<value1> <key2>=<value2>...
ARG:構(gòu)建參數(shù),和ENV類似,僅在Dockerfile內(nèi)有效,即僅在docker build過程中有效
VOLUME:定義掛載數(shù)據(jù)卷,默認(rèn)會(huì)掛到匿名卷下,格式為:VOLUME ["<路徑1>", "<路徑2>"...] 或 VOLUME <路徑>
EXPOSE:聲明端口,方便在使用中映射,在使用中使用docker run -P隨機(jī)端口映射時(shí),會(huì)隨機(jī)映射EXPOSE端口
WORKDIR:指定工作目錄,格式如:WORKDIR <工作目錄路徑>
USER:指定后續(xù)命令執(zhí)行的用戶和用戶組,格式如:USER <用戶名>[:<用戶組>]
Dockerfile文件放于項(xiàng)目根目錄下,接著執(zhí)行格式如下的命令生成鏡像:
docker build -t 鏡像名稱:鏡像標(biāo)簽 上下文路徑(需要打包復(fù)制到鏡像的目錄,未指定則默認(rèn)是存放Dockerfile文件的所在目錄)
如:
docker build -t spring_boot_docker_image:latest .
2.3 運(yùn)行目標(biāo)鏡像
運(yùn)行目標(biāo)鏡像,可以直接命令運(yùn)行,也可以通過idea插件運(yùn)行。
2.3.1 命令運(yùn)行
命令運(yùn)行同其它鏡像運(yùn)行一樣,示例如下:
docker run -d -p 20004:8051 --name spring_boot_docker spring_boot_docker_image
2.3.2 通過idea插件運(yùn)行
idea中通過插件集成了docker功能,可以對(duì)docker中鏡像及容器進(jìn)行管理。在操作前,提前安裝好idea及docker插件。以項(xiàng)目部署為例,操作包含idea配置和目標(biāo)項(xiàng)目配置,具體如下:
idea配置
1、idea控制界面,安裝docker插件,Preferences | Plugins ->docker;
2、idea控制界面,添加docker,Preferences | Build, Execution, Deployment | Docker -> 添加docker,并連接成功
3、回到idea操作界面,選擇底部Services,在底部左則可看到安裝好的Docker,右鍵點(diǎn)擊連接。下拉選項(xiàng)可以看到已經(jīng)安裝的鏡像和容器
目標(biāo)項(xiàng)目配置
1、修改pom.xml,添加docker-maven-plugin插件
2、運(yùn)行maven package,生成項(xiàng)目鏡像
3、在idea操作界面services中的docker鏡像中,找到剛創(chuàng)建的項(xiàng)目鏡像,右鍵新建容器,在彈框中指定容器名稱、機(jī)器端口與容器端口映射關(guān)系
4、運(yùn)行新創(chuàng)建的容器,采用機(jī)器端口即可訪問docker容器中運(yùn)行的鏡像
三、示例
這里以部署自定義項(xiàng)目spring_boot_docker到docker為例,直接借助idea的docker插件部署。
3.1 創(chuàng)建自定義項(xiàng)目
示例自定義項(xiàng)目為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>
<!--將插件綁定在某個(gè)phase執(zhí)行-->
<executions>
<execution>
<id>build-image</id>
<!--綁定在package階段執(zhí)行插件,即執(zhí)行mvn package時(shí),就會(huì)自動(dòng)執(zhí)行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定鏡像名-->
<imageName>${project.artifactId}</imageName>
<!--指定標(biāo)簽,即鏡像版本-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--指定基礎(chǔ)鏡像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服務(wù)地址-->
<!-- <dockerHost>tcp://localhost:2375</dockerHost>-->
<!-- 復(fù)制生成的jar包到docker容器指定目錄-->
<resources>
<resource>
<!-- 將生成的jar包復(fù)制到容器指定路徑下-->
<targetPath>/home/app</targetPath>
<!--指定資源目錄,這里為maven打包后的target目錄-->
<directory>${project.build.directory}</directory>
<!-- 指定需要復(fù)制的文件,這里為生成的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";
}
}
啟動(dòng)類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 生成目標(biāo)鏡像
在idea中選擇maven的package,對(duì)自定義項(xiàng)目spring_boot_docker打包,打完包??梢栽赿ocker插件發(fā)現(xiàn)已經(jīng)生成的包。當(dāng)然也可以通過命令查看:
docker images
3.3 運(yùn)行目標(biāo)鏡像
在idea的docker插件中,選擇新生成的鏡像,并創(chuàng)建容器,指定端口映射(20004:8051)信息,運(yùn)行窗口即可,也可通過命令運(yùn)行行運(yùn)行,命令如下:
docker run -d -p 20004:8051 --name spring_boot_docker spring_boot_docker
3.4 測試
GET http://localhost:20004/hello
Accept: application/json
響應(yīng):
hello, nice to meet you
ocker隨手筆記第一節(jié) docker概念及安裝
docker隨手筆記第二節(jié) docker常用命令解析
docker隨手筆記第三節(jié) docker構(gòu)建java鏡像
docker隨手筆記第四節(jié) docker安裝mysql5.7
docker隨手筆記第五節(jié) docker安裝redis4.0
docker隨手筆記第六節(jié) docker安裝jenkins
docker隨手筆記第七節(jié) jenkins通過git部署java微服務(wù)插件安裝
docker隨手筆記第八節(jié) jenkins通過git自動(dòng)部署java微服務(wù)
docker隨手筆記第九節(jié) docker -v參數(shù) 目錄掛載總結(jié)
docker隨手筆記第十節(jié) docker 開啟遠(yuǎn)程訪問
docker隨手筆記第十一節(jié) portainer.io安裝使用,比k8s簡單
點(diǎn)擊新建任務(wù)
輸入任務(wù)名稱,選擇構(gòu)建自由風(fēng)格軟件項(xiàng)目,然后點(diǎn)擊確定
丟棄舊的構(gòu)建配置
源碼選擇你前端git倉庫地址,或者svn地址
配置Delete workspace before build starts
配置Post Steps,配置ssh,執(zhí)行ssh腳本
輸入ssh腳本
mkdir -p /home/web cd /home/web #由于/var/jenkins_home這個(gè)目錄我映射到宿主機(jī)/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
保存后點(diǎn)擊立即構(gòu)建,這樣自動(dòng)部署就成功了
就可以訪問了,http://服務(wù)ip:8081
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。