记录一下我的部署之路

625 阅读5分钟

2019年,我用打包好的jar包,拖到服务器上进行部署,那命令我甚至忘了,好像是java -jar。

2020年,我已经忘记哪里学来的docker,还是打包成jar包,拖到服务器上,配合Dockerfile打包成docker部署。

很骚的是,我只记得一个事情,网上抄来的Dockerfile,试了很多个,都不能用,最后好不容易找到一个帖子,还因为换了电脑找不到那个帖子了,只抄了个Dockerfile的内容,然后这个Dockerfile一直用到现在,哈哈。

image.png

从去年开始,我尝试过两次换成jenkins自动部署,但是没有一次成功的。

第一次死于我熟悉的springboot,具体的记不太清了。

第二次印象特别深,死于前端的vue项目部署,我周末在家里花了一整天搞jenkins部署vue,尝试无果之后想直接手动部署,但就是手动部署都在隔天的工作日把我搞到了凌晨1点才弄完,从那次之后我就对npm run有阴影了。

image.png

啊,突然想起来我也不是前端,那没事了。

好像部署这类的教程,要找到适合自己的实际情况非常难。

本篇文章先记录下用docker部署springboot的流程,接下来我打算再尝试一遍用jenkins部署,但是这次不急,想好好学学再开始整。

即学即用、现学现卖有个好处,那就是能快速地解决问题,但也有个坏处,就是出了意料之外的问题时,无法快速定位出问题所在。

如果一个月之后,这篇文章没有介绍jenkins部署的流程,那就当我又一次失败了吧,哈哈。

使用docker部署springboot项目

首先在pom.xml下添加这些东西,注意build标签是在project标签下:

<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>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.1.0</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
    </plugins>
</build>

为什么要加呢?

哈哈,因为年代久远,我也忘了,只记得不加好像不能打包成功,而且里面有些不是必须的,但是我也实在想不起来了,保险起见还是全粘过来。

这可能是一篇不太靠谱的教程,但好歹我自己是能跑通的。

image.png

接着编写Dockerfile:

# 基于java8
FROM java:8
VOLUME /tmp
# 前面的jar是你打包好的jar包名,后面的jar是放在docker容器里的jar名,可以随意取
ADD demo-0.0.1-SNAPSHOT.jar /app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

按下图步骤生成打包好jar包

image.png

Dockerfile无所谓放哪里其实,一般我们放项目里其实只是为了好找,这种部署方式放到服务器上,Dockerfile都会和jar包放同一个目录下:

image.png

然后接下来就是无脑的一堆docker命令啦:

# 制作docker镜像
docker build -t [镜像名] .

# 启动docker容器并初始化本地网络
docker run -p 服务器端口号:docker端口号 -d --net=host --name [容器名] [镜像名]

举个栗子就是:

# 制作docker镜像
docker build -t demo .

# 启动docker容器并初始化本地网络
docker run -p 8080:8080 -d --net=host --name demo demo

注意制作docker镜像的时候docker build -t [镜像名] .,镜像名后面是有个空格和一个点的,表示在当前目录下制作。

docker的端口号一般也是不能改的,看你springboot项目里怎么写的,但是服务器端口号你爱怎么改怎么改,配合nginx,可以搞很多个服务。

这里还用了--net=host,让docker容器直接用了宿主机的网络,因为之前发现不这么做好像连不到服务器上同样放在docker的MySQL。

现在想来或许可以直接在springboot项目的配置里把MySQL的链接写成公网的ip,这样的话就可以去掉--net=host了。

不过我也没试过,因为让docker容器直接用宿主机的网络,我用了这么久也没出什么问题,或者你可以自己试试。

假如你不是第一次部署这个项目,那么可能把之前的项目删了会让你更爽一点:

# 停止docker容器
docker stop [容器名]

# 删除docker容器
docker rm -f [容器名]

# 删除docker镜像
docker rmi [镜像id]

# 制作docker镜像
docker build -t [镜像名] .

# 启动docker容器并初始化本地网络
docker run -p 服务器端口号:docker端口号 -d --net=host --name [容器名] [镜像名]

如果没什么问题,到这里就部署好了。

只是我觉得这种方法真的有点太难受,特别是在公司用jenkins,我自己就用这种捞的不行的方法,部署自己做着玩的一些项目应该不下百回了。

jenkins的原理基本也是这个流程,不过就是有个钩子能感知到你推代码到git上,然后自己构建docker并启动,对于没部署过的人,这篇文档还是能帮上一点忙的,熟悉了上面的步骤,就算后面用自动部署,也能知晓其原理。

关于用jenkins怎么部署,我也还没走通,把flag立这里了,如果没有后续的话就太丢人了,为了不丢人,我应该会更尽力去搞好这个东西吧,嘿嘿。