简介

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。

准备工作

  1. 这里就不用自带绑定的 docker 插件了,因为要开放 docker 2375 的端口,有未授权漏洞风险(个人建议不要用这种,我之前一台腾讯云的开启了后,第二天就被攻击了,官方短信提示机器在执行挖矿)
  2. Alibaba Cloud Toolkit( 阿里云开发者插件,简称:Cloud Toolkit )是一个面向 IntelliJ IDEA、Eclipse 和 Maven 平台的免费插件,旨在帮助开发者在本地开发平台(IDE)中更便捷的使用阿里云,从而高效地开发、测试、诊断并部署应用。Cloud Toolkit 帮助开发者将本地应用程序一键部署到线下自有 VM,或阿里云 ECS、EDAS、Kubernetes 中去;并支持快速访问阿里云 ECS 和 RDS 资源,高效执行终端命令和 SQL 语句等
  3. IDEA 通过下载这个插件,然后配置连接信息连接到服务器上,然后把需要打包成docker 镜像的文件上传上去,就可以进行对应的打包了
    Alibaba Cloud ToolKit插件

通过 22 端口,连接到云服务器即可
连接配置信息

vue项目打包

  1. 在项目根目录下创建 3 个文件分别为 nginx.conf Dockerfile run.sh
  2. nginx.conf 下的 location -> root 的静态资源目录要和 Dockerfile 中 COPY 指定的路径要一致 COPY dist /usr/share/nginx/html 指的把当前目录的 dist 复制到 /usr/share/nginx/html 下面
  3. Dockerfile 中 COPY nginx.conf /etc/nginx/conf.d/default.conf 意思是用我们自己的 nginx.conf 覆盖掉默认的
  4. 关于这三个配置文件,其实也可以用文本编辑器创建然后,直接上传到 Linux 服务器上,我放在项目里面是因为,如果文件有变更(一般来说配置一遍就很少变了)可以通过后面的步骤一键快速上传到 Linux 服务器,看个人偏好吧,如果放在项目里面也有可能其它的小伙伴编辑到了就不好了
Nginx配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80;
server_name localhost;

#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;

location / {
root /usr/share/nginx/html; # nginx的静态资源目录
index index.html index.htm;
try_files $uri $uri/ /index.html; # 对于 Vue 或 React项目使用history路由需要
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Dockerfile
1
2
3
FROM nginx
COPY dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
构建脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 配置镜像名称、镜像标签(版本)、配置容器名称(相当于定义了3个变量)
img=front-image
tag=1.0
container=vueDocker
inPort=80
exPort=8081

# 判断容器是否存在,存在则删除
if sudo docker ps -a --filter name=^/$container$ | grep -i "$container"; then
echo "容器: $container 存在,删除容器..."
sudo docker stop "$container"
sudo docker rm -f "$container"
else
echo "容器: $container 不存在"
fi

# 判断容器是否存在,存在则删除。
if sudo docker ps -a --filter name=^/$container$ | grep -i "$container"; then
echo "容器: $container 存在,删除容器..."
sudo docker stop "$container"
sudo docker rm -f "$container"
else
echo "容器: $container 不存在"
fi

# 判断镜像是否存在,如存在则删除
if sudo docker images --filter=reference="$img:$tag" | grep -i "$img"; then
echo "镜像: $img:$tag 镜像存在, 删除镜像重新构建..."
sudo docker rmi $img:$tag
fi

# 构建新镜像
echo "构建新镜像: $img:$tag ..."
sudo docker build -t $img:$tag .

# 启动服务,挂载外部数据信息
echo "启动 $container 容器服务!"
sudo docker run -d -p $exPort:$inPort --restart=always --name $container $img:$tag

# 检测服务是否启动成功
if sudo docker ps --filter name=^/$container$ | grep -i "up"; then
echo "容器 $container 启动成功Succeed"
else
echo "容器 $containe 启动失败Fail"
fi

配置文件

配置执行流程

通过一键执行上面配置的的流程,将项目打包并且上传到服务器
上传文件

  1. 需要在刚才文件上传的目录下进行执行命令
  2. 服务器不需要提前去拉取 Nginx,Dockerfile 中配置了会自动拉取
  3. 服务器需要开启对应的 Nginx 端口和 对外暴露的 端口,比如这里的 80、8081
    打镜像并启动服务
  1. 按照上述步骤,其实比较繁琐,需要在本地的 IDEA 中执行触发上传,然后登录到服务器上,再分别执行两个命令,一个是打镜像的命令,一个是启动镜像的命令
  2. 可优化为:我们将服务器上打 docker image 镜像和启动 docker Container 容器做成一个 sh 脚本,然后 IDEA 上传完成后自动执行该 sh 脚本
  3. 上传 如下脚本 run.sh 和 dist/Dockerfile/nginx.conf 到同一目录后,并给与可执行权限 chmod 755 run.sh
优化启动脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 配置镜像名称、镜像标签(版本)、配置容器名称(相当于定义了3个变量)
img=front-image
tag=1.0
container=vueDocker
inPort=80
exPort=8081

# 判断容器是否存在,存在则删除
if sudo docker ps -a --filter name=^/$container$ | grep -i "$container"; then
echo "容器: $container 存在,删除容器..."
sudo docker stop "$container"
sudo docker rm -f "$container"
else
echo "容器: $container 不存在"
fi

# 判断容器是否存在,存在则删除。
if sudo docker ps -a --filter name=^/$container$ | grep -i "$container"; then
echo "容器: $container 存在,删除容器..."
sudo docker stop "$container"
sudo docker rm -f "$container"
else
echo "容器: $container 不存在"
fi

# 判断镜像是否存在,如存在则删除
if sudo docker images --filter=reference="$img:$tag" | grep -i "$img"; then
echo "镜像: $img:$tag 镜像存在, 删除镜像重新构建..."
sudo docker rmi $img:$tag
fi

# 构建新镜像
echo "构建新镜像: $img:$tag ..."
sudo docker build -t $img:$tag .

# 启动服务,挂载外部数据信息
echo "启动 $container 容器服务!"
sudo docker run -d -p $exPort:$inPort --restart=always --name $container $img:$tag

# 检测服务是否启动成功
if sudo docker ps --filter name=^/$container$ | grep -i "up"; then
echo "容器 $container 启动成功Succeed"
else
echo "容器 $containe 启动失败Fail"
fi

优化配置

SpringBoot 打包

  1. 其实和上面的 vue 都是一样的,先编译 vue 是生成 dist 目录,SpringBoot 是 打成 jar 包
  2. SpringBoot 不依赖 Nginx,依赖 Java
  1. 流程和 vue 的基本一致,就是换个需要上传的文件路径
  2. 上传前的打包指令根据自己的项目配置一下
    配置流程
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 该镜像需要依赖的基础镜像
FROM openjdk:17-jdk-alpine

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

VOLUME /tmp

# 将当前目录下的jar包复制到docker容器的/目录下
ADD helper.jar adalucky_helper.jar

# 声明服务运行在8088端口
EXPOSE 9999
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/adalucky_helper.jar"]
# 指定维护者的名字
MAINTAINER ada
构建脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 配置镜像名称、镜像标签(版本)、配置容器名称(相当于定义了3个变量)
img=adalucky_helper
tag=1.0
container=adalucky_helper
inPort=9999
exPort=9999

# 判断容器是否存在,存在则删除
if sudo docker ps -a --filter name=^/$container$ | grep -i "$container"; then
echo "容器: $container 存在,删除容器..."
sudo docker stop "$container"
sudo docker rm -f "$container"
else
echo "容器: $container 不存在"
fi

# 判断容器是否存在,存在则删除。
if sudo docker ps -a --filter name=^/$container$ | grep -i "$container"; then
echo "容器: $container 存在,删除容器..."
sudo docker stop "$container"
sudo docker rm -f "$container"
else
echo "容器: $container 不存在"
fi

# 判断镜像是否存在,如存在则删除
if sudo docker images --filter=reference="$img:$tag" | grep -i "$img"; then
echo "镜像: $img:$tag 镜像存在, 删除镜像重新构建..."
sudo docker rmi $img:$tag
fi

# 构建新镜像
echo "构建新镜像: $img:$tag ..."
sudo docker build -t $img:$tag .

# 启动服务,挂载外部数据信息
echo "启动 $container 容器服务!"
sudo docker run -d -p $exPort:$inPort --restart=always --name $container $img:$tag

# 检测服务是否启动成功
if sudo docker ps --filter name=^/$container$ | grep -i "up"; then
echo "容器 $container 启动成功Succeed"
else
echo "容器 $containe 启动失败Fail"
fi
  1. 专门创建一个配置文件目录,记得 run.sh 的权限需要 改成可执行权限
  2. 选择刚才的配置,点击对应旁边的执行按钮即可

启动