docker打包部署实战二
cloud-alibaba手动生成镜像示例
1.将手动打的jar包和Dockerfile放在同一linux目录下
# jdk版本 FROM java:8 # 临时文件目录 VOLUME /tmp # 把demo-0.0.1-SNAPSHOT.jar添加到容器里,并重命名为app.jar ADD csd-gateway-1.0.0.jar csd-gateway-1.0.0.jar # 开放8080端口 EXPOSE 6061 # ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 "/dev/urandom" 作为 Entropy Source. # ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom --spring.profiles.active=prod","-jar","/csd-gateway-1.0.0.jar"] CMD java -Xms400m -Xmx400m -Dcsp.sentinel.app.type=1 -jar csd-gateway-1.0.0.jar --spring.profiles.active=prod
2.打包命令
docker build -t gateway:V1.0.0 .
3.导出镜像
docker save 44cefcff7286 > gateway.tar
4.在新服务器上加载镜像 生成标签
docker load < gateway.tar
docker tag 44cefcff7286 gateway:V1.0.0
5.启动命令 解决读取不到宿主机hosts
Docker容器运行的时候有 host 、 bridge 、 none 三种网络可供配置。默认是 bridge ,即桥接网络,以桥接模式连接到宿主机; host 是宿主网络,即与宿主机共用网络; none 则表示无网络,容器将无法联网。
解决方案:
只要让容器使用宿主机的host网络即可。
在docker中使用 --network host 来为容器配置 host 网络:
docker run -d --name gateway --network host -p 6061:6061 gateway:V1.0.0
6.查看容器运行日志
docker logs -f gateway
7.查看docker容器运行资源消耗
docker stats
idea连接docker服务器生成镜像示例
参考文献:https://www.jianshu.com/p/5955d06dbe48
第一步:修改Docker服务配置文件,使Idea可以远程访问
-
首先我们可以通过
systemctl status docker
命令,来确定docker的配置文件所在的位置 -
通过上图可以确定,我们的
docker.service
文件在/usr/lib/systemd/system/
路径下 -
编辑docker.service
vim /usr/lib/systemd/system/docker.service
在 ExecStart=/usr/bin/dockerd-current 后面添加 -H tcp://0.0.0.0:
port
-H unix:///var/run/docker.sock ,port为自定义端口号,默认是2375,不推荐使用
- 重启docker服务,使配置生效
systemctl daemon-reload && systemctl restart docker
- 记得开启对应端口的访问权限!!!!!!
第二步:在idea中安装docker插件并测试连接
第三步:配置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 http://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.2.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>hq-face-attend-platform</artifactId> <groupId>msdp-sdk</groupId> <version>1.0.0</version> <name>oeuvre</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>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 引入mybatis plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.7.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.1</version> </dependency> <!-- thymeleaf模板引擎和shiro框架的整合 --> <dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>2.0.0</version> </dependency> <!-- 引入aliyun OSS 对象存储 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency> <dependency> <groupId>org.jetbrains</groupId> <artifactId>annotations</artifactId> <version>20.1.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.1.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>1.6.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency> <!-- https://mvnrepository.com/artifact/org.eclipse.paho/org.eclipse.paho.client.mqttv3 --> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.43.Final</version> </dependency> <!--缓存依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--rabbitMQ--> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <scope>compile</scope> <exclusions> <exclusion> <artifactId>http-client</artifactId> <groupId>com.rabbitmq</groupId> </exclusion> </exclusions> </dependency> </dependencies> <!-- <build>--> <!-- <plugins>--> <!-- <plugin>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-maven-plugin</artifactId>--> <!-- <configuration>--> <!-- <excludes>--> <!-- <exclude>--> <!-- <groupId>org.projectlombok</groupId>--> <!-- <artifactId>lombok</artifactId>--> <!-- </exclude>--> <!-- </excludes>--> <!-- </configuration>--> <!-- </plugin>--> <!-- </plugins>--> <!-- </build>--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!--引入本地jar 既打包maven下jar包又打包lib下的jar包 --> <configuration> <includeSystemScope>true</includeSystemScope> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> </configuration> </plugin> <!-- 跳过单元测试 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> </plugin> <!--使用docker-maven-plugin插件--> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <!--将插件绑定在某个phase执行--> <executions> <execution> <id>build-image</id> <!--用户只需执行mvn package ,就会自动执行mvn docker:build--> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <!--指定生成的镜像名--> <imageName>${project.artifactId}-img</imageName> <!--指定标签--> <imageTags> <imageTag>latest</imageTag> </imageTags> <!-- 指定 Dockerfile 路径--> <dockerDirectory>${project.basedir}</dockerDirectory> <!--指定远程 docker api地址--> <dockerHost>http://192.168.1.140:2375</dockerHost> <!-- 这里是复制 jar 包到 docker 容器指定目录配置 --> <resources> <resource> <targetPath>/</targetPath> <!--jar 包所在的路径 此处配置的 即对应 target 目录--> <directory>${project.build.directory}</directory> <!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 --> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> </project>
第四步:在项目根目录下编写Dockerfile文件
# jdk版本 FROM java:8 # 临时文件目录 VOLUME /tmp # 把demo-0.0.1-SNAPSHOT.jar添加到容器里,并重命名为app.jar ADD hq-face-attend-platform-1.0.0.jar hq-face-attend-platform-1.0.0.jar # 开放900端口 EXPOSE 900 # ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 "/dev/urandom" 作为 Entropy Source. # ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom --spring.profiles.active=prod","-jar","/csd-gateway-1.0.0.jar"] CMD java -Xms400m -Xmx400m -Dcsp.sentinel.app.type=1 -jar hq-face-attend-platform-1.0.0.jar --spring.profiles.active=prod # 启动命令 # docker run -d --name hq-face-attend-platform -p 900:900 hq-face-attend-platform-img:latest # 查看日志 # docker logs -f hq-face-attend-platform # 查看端口 # netstat -nplt | grep 900
第五步:一键打包jar并生成镜像
使用maven clean + package打包, jar包会在本地target目录下生成,镜像文件则在远程docker服务器上生成
使用jenkins发布docker服务示例
1.项目下填写好指定的Dockerfile文件-放在项目根目录下
# jdk版本 FROM java:8 # 临时文件目录 VOLUME /tmp # 把demo-0.0.1-SNAPSHOT.jar添加到容器里,并重命名为app.jar ADD hq-face-attend-platform-1.0.0.jar hq-face-attend-platform-1.0.0.jar # 开放900端口 EXPOSE 900 # ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 "/dev/urandom" 作为 Entropy Source. # ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom --spring.profiles.active=prod","-jar","/csd-gateway-1.0.0.jar"] CMD java -Xms1024m -Xmx1024m -Dcsp.sentinel.app.type=1 -jar hq-face-attend-platform-1.0.0.jar --spring.profiles.active=prod # 启动命令 # docker run -d --name hq-face-attend-platform -p 900:900 hq-face-attend-platform-img:latest # 查看日志 # docker logs -f hq-face-attend-platform # 查看端口 # netstat -nplt | grep 900
2.配置好相关的jenkins配置
描述:测试环境-海清人脸考勤机平台
源码管理:GIT
构建触发器
Build whenever a SNAPSHOT dependency is built
构建环境
Delete workspace before build starts
Build Maven Version maven3.6.0
Root POM pom.xml
Goals and options clean package -Dmaven.test.skip=true
构建后操作
Name 华为云
Transfers
Source files Dockerfile
Remove prefix
Remote directory /opt/apphome/docker-hq/
Exec command
Source files target/*.jar
Remove prefix target/
Remote directory /opt/apphome/docker-hq/
Exec command
cd /opt/apphome/docker-hq/
mv HQ-Face-Attend-Platform-0.0.1.jar hq-face-attend-platform-1.0.0.jar
#项目名称
PROJECT_NAME="hq-face-attend-platform"
#版本
VERSION=1.0.0
#生成镜像
docker build -t $PROJECT_NAME:$VERSION . && sleep 5
#这里判断服务是否启动,如果启动需要停止并删除运行容器,然后重启启动
if [ $(docker ps -aq --filter name=$PROJECT_NAME) ]; then
#停止服务
docker stop $PROJECT_NAME && sleep 10
#删除启动容器
docker rm -f $PROJECT_NAME && sleep 5
#清空重复镜像
docker image prune -f
#清空未使用挂载缓存目录
docker volume prune -f
fi
echo "启动容器开始............."
#启动容器
docker run -dit --name $PROJECT_NAME -p 900:900 $PROJECT_NAME:$VERSION
echo "启动容器结束............."
3.jenkins自动构建
git服务器A jenkins服务器B 远程服务器C
B拉取A的项目源代码到B,B推送项目根目录上的Dockerfile到C,B使用项目源代码打包成jar包推送到C
C使用docker命令生成镜像,启动容器
4.运行容器之后查看日志
# 查看日志
# docker logs -f hq-face-attend-platform
# 查看端口
# netstat -nplt | grep 900
docker stats监控容器资源消耗
参考资料:https://blog.csdn.net/qq_40378795/article/details/121589928
注意:遇到的问题
问题:Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (build-image) on project HQ-Face-Attend-Platform: Exception caught
1.大写改成小写
2.win:在C盘的用户目录下,找到**.docker**文件夹,然后用文档编辑器打开config.json,然后将{"credsStore":"desktop","stackOrchestrator":"swarm"},改为:{},保存并退出,然后重新打包即可。