1 2 3 4

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
View Code

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>
View Code

第四步:在项目根目录下编写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
View Code

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"},改为:{},保存并退出,然后重新打包即可。

posted @ 2022-05-20 17:52  一缕清风丶  阅读(646)  评论(0编辑  收藏  举报