Docker部署项目是指使用Docker容器化技术将应用程序及其依赖项打包成一个独立的、可移植的运行环境,并在各种操作系统和平台上进行部署和运行。
使用Docker的主要原因是解决了应用程序在不同环境中部署和运行的问题。传统上,应用程序在部署时需要考虑操作系统、软件版本、依赖项等因素,不同环境之间存在差异,导致部署和运维变得复杂。
Docker可以将应用程序及其所有依赖项打包成一个独立的容器,该容器包含了应用程序运行所需的所有组件,如操作系统、库、运行时环境等。这样,无论在哪个环境中部署,只需要安装Docker并运行容器,就可以保证应用程序在各个环境中的一致性和可移植性。
Docker 安装成功之后,首先需要修改 Docker 配置来开启允许远程访问 Docker 的功能。
文件位置:/lib/systemd/system/docker.service
修改内容: 加入如下内容:
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
服务器开放2375端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
systemctl restart firewalld
重启docker
systemctl daemon-reload
systemctl restart docker
dockerfile文件用来生成docker镜像,镜像就像安装包,可以运行为一个个的容器。
将dockerfile文件放到resource文件夹下。
FROM openjdk:11
# 将jar包添加到容器中,并命名为 demo.jar
COPY merit-excitation-*.jar /home/admin/merit-backend/merit-excitation-*.jar
#COPY agent /home/admin/agent
# 设置环境变量
ENV SPRING_NACOS_SERVERADDRESS='nacos.tfjy.tech:8848'
ENV SPRING_NACOS_NAMESPACE='merit-test'
# 设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 启动jar包命令
#CMD java -javaagent:/home/admin/agent/skywalking-agent.jar -DSW_AGENT_NAME=merit-excitation -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.tfjy.tech:11800 -Xms228m -Xmx228m -Dspring.cloud.nacos.config.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.config.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.config.username=merit -Dspring.cloud.nacos.config.password=merit -Dspring.cloud.nacos.discovery.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.discovery.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.discovery.username=merit -Dspring.cloud.nacos.discovery.password=merit -jar /home/admin/merit-backend/merit-excitation-*.jar
CMD java -Xms228m -Xmx228m -Dspring.cloud.nacos.config.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.config.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.config.username=merit -Dspring.cloud.nacos.config.password=merit -Dspring.cloud.nacos.discovery.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.discovery.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.discovery.username=merit -Dspring.cloud.nacos.discovery.password=merit -jar /home/admin/merit-backend/merit-excitation-*.jar
# SpringBoot项目配置的端口号为9001,需要将9001暴露出去
EXPOSE 9071
父pom:
<profiles>
<profile>
<!--不同环境Profile的唯一id-->
<id>dev</id>
<properties>
<!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
<profiles.active>dev</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
<docker-url>http://192.168.0.100:2375</docker-url>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
<docker-url>http://192.168.0.200:2375</docker-url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
子pom
<parent>
<artifactId>merit-backend</artifactId>
<groupId>com.xxx</groupId>
<version>1.0.15</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>merit-template</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<registry-url>192.168.0.xxx:8083</registry-url>
<skipTests>true</skipTests><!--编译打包跳过测试类-->
</properties>
<build>
<finalName>${project.artifactId}-${project.parent.version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<serverId>docker-local</serverId>
<dockerHost>${docker-url}</dockerHost>
<imageName>${registry-url}/${project.artifactId}-${profiles.active}:${project.parent.version}</imageName>
<!--nexus3 hosted 仓库地址-->
<registryUrl>${registry-url}</registryUrl>
<!-- 在生成图像后将其推入的标志。默认为false -->
<pushImage>true</pushImage>
<imageTags>
<!-- 指定镜像标签,可以排至多个标签 -->
<imageTag>${project.version}</imageTag>
</imageTags>
<!--是否强制覆盖已有镜像-->
<forceTags>true</forceTags>
<!--方式一:1、指定Dockerfile文件所在目录,通过文件执行打包上传nexus私服-->
<dockerDirectory>src/main/resources</dockerDirectory>
<!-- 指定docker镜像打包参数,即dockerfile中使用的参数,通过${参数名}取值 -->
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<resources>
<resource>
<targetPath>/</targetPath>
<!--指定需要复制的根目录,${project.build.directory}表示target目录-->
<directory>${project.build.directory}</directory>
<!--用于指定需要复制的文件,${project.build.finalName}.jar表示打包后的jar包文件-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
新建一个maven项目的任务
#!/bin/bash
echo admin | sudo -S docker stop merit-excitation
# 删除旧的容器
echo admin | sudo -S docker rm -f merit-excitation
# 删除旧版镜像
echo admin | sudo -S docker rmi 192.168.0.xxx:8083/merit-excitation-prod:${old_version}
#删除所有悬空镜像
echo admin | sudo -S docker rmi $(echo admin | sudo -S docker images -f "dangling=true" -q)
# 启动镜像
echo admin | sudo -S docker run --net=host --restart=always -d --name merit-excitation -p 9071:9071 -e SPRING_NACOS_NAMESPACE=merit-prod -v /home/admin/logs:/logs 192.168.0.xxx:8083/merit-excitation-prod:${new_version}
exit
构建时要删除旧版镜像,根据版本号删除镜像,防止占用服务器空间。
配置好以后把镜像推到服务器上运行就很简单了。