Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、簡介
這里介紹在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小時內與您取得聯系。