如果你自己独立开发了一套前后端分离的项目,想要把它放在一个docker镜像中,一键部署,真正做到开箱即用。

1、什么是docker

build once, run everywhere

2、打包前后端文件

2.1、打包前端文件

1.在项目下执行
注意!打包之前你的api不要设置成localhost或者127.0.0.1,而是要换成你等下要部署的服务器的ip地址

1
2
3
npm run build
//or
yarn build

2.会生成一个dist文件夹,里面就是你前端所有的代码,等会挂载到nginx服务上
在这里插入图片描述

2.2、打包后端文件

1.pom.xml里指定打包方式为jar包

1
2
3
4
<project>
//意为在project下加入下面这个标签
<packaging>jar</packaging>
</project>

2.打包
在这里插入图片描述
3.打包之后应该会在target下面生成jar包
在这里插入图片描述

3、制作docker镜像

注意:windows环境下也可以制作镜像,思路都是一样的
1.centos7下安装docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 安装依赖(以下是一整条命令)
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 设置仓库(以下是一整条命令)
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum install docker-ce docker-ce-cli containerd.io
# 启动并加入开机启动
systemctl start docker
systemctl enable docker
# 验证是否安装成功
docker version

2.创建一个文件夹作为你制作镜像的根目录,然后把前后端打包的文件都传进去,可以用filezilla什么的,
在这里插入图片描述
3.在该目录下创建Dockerfile配置文件,至关重要

1
touch Dockerfile

4.编辑Dockerfile

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
# Docker image for springboot file run
# VERSION 0.0.1
# Author: cwiyc
# 基础镜像
FROM centos:8
# 维护人信息
MAINTAINER cwiyc <cwiyc922@gmail.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# Centos8于2021年年底停止了服务,所以我们更新yum源为阿里镜像
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
RUN yum clean all
RUN yum makecache
# 安装java
RUN yum -y install java
# 安装epel源
RUN yum -y install epel-release
# 安装nginx
RUN yum -y install nginx
# 将jar包添加到容器中并更名为app.jar
ADD orderonlineback-0.0.1-SNAPSHOT.jar app.jar
# 把自己本地的html里放的前端项目,放入nginx默认的资源目录里
COPY dist /usr/share/nginx/html
# 将自己的nginx.conf 配置文件放到docker里nginx默认的配置文件位置
COPY nginx.conf /etc/nginx/nginx.conf
# 暴露80端口
EXPOSE 80
# 运行jar包,ENTRYPOINT这条命令只能出现一次,如有多条,则只执行最后一条。该命令只有容器启动时才执行
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

5.在该目录下创建nginx配置文件nginx.conf,这样你可以更灵活的配置nginx。
location那个地方的try_files $uri $uri/ /index.html一定要写,默认是没有的,不写的话你刷新页面会404

1
touch nginx.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
46
47
48
49
50
51
52
53
54
55
56
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
try_files $uri $uri/ /index.html;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

}

6.制作镜像

1
2
3
4
// 注意最后的.
docker build -t 取个镜像名 .
//查看镜像,会出现你刚刚制作的镜像
docker images

在这里插入图片描述

4、新建一个容器运行镜像

提示:每一个镜像都需要运行在一个容器里
1.运行容器

1
2
3
4
5
6
7
8
# -d: 后台运行容器,并返回容器ID;
# -i: 以交互模式运行容器,通常与 -t 同时使用;
# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
docker run -itd --name 取个容器名 --net=host 刚刚的镜像名
#例如 docker run -itd --name bi43 --net=host backimage41
#查看正在运行的容器
docker ps

在这里插入图片描述
这时后端springboot项目已经运行了,我的是运行在9090
查看端口情况

1
2
3
netstat -ntlp
#如果没有这个命令,请安装
yum -y install net-tools

在这里插入图片描述
2.运行nginx

1
2
docker exec -it 刚刚的容器名 nginx
# 例如 docker exec -it bi43 nginx

这时nginx也启动起来了,80端口
在这里插入图片描述

5、保存制作好的镜像

1.保存镜像的改动

1
2
docker commit 刚刚的容器名 取一个新的镜像名
# 例如 docker commit bi43 bir1

此时生成了一个新的镜像,这就是你制作好的镜像。
在这里插入图片描述
2.阿里托管你的镜像
请看这个,push过程稍有些漫长

3.这时候你本地和远程仓库都有你的刚刚制作的镜像了,现在你只需要运行镜像即可(docker exec -it bi43 nginx这条命令还是需要执行来开启nginx)

6、mysql

至于mysql,centos7上mysql要付费了,所以要用的mariadb,它在数据的备份和还原上与mysql无痛交流
在这里插入图片描述