为了从根本上解决开发和运维环境不一致的问题。也就是说,在安装时,把原始环境一模一样地复制过来,开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。开发在打包应用时,将应用所需要的文件打包成一个镜像文件,将镜像运行在docker中。从而达到一次镜像,处处运行。这也是 Docker 官方的口号:Build once,Run anywhere.
一、准备阶段
1、环境准备
准备一台已经装好 Docker 的服务器,安装教程
CentOS 7.8
Docker 24.0.6
2、docker 仓库准备
docker hub 是docker最大的公有仓库,没有账号的话在 docker hub 上注册一个账号,为我们后续发布镜像做准备。
在 docker hub 上创建仓库,名字任意,一个用来保存前端的 react 镜像,一个用来保存后端的 SpringBoot 镜像。
3、项目准备
本文主要内容是教学如何部署项目,所以示例项目使用最简单的不作任何开发的初始项目。
准备一个前端项目和后端项目
以 React 作为前端,Java 作为后端
3.1 前端项目
由于不做开发,就直接在服务器上创建了
# 在服务器上安装 npm
yum install -y npm
# 安装 React 脚手架
npm install -g create-react-app
# 创建项目
create-react-app my-react-app
# 运行项目确保正常
cd my-react-app
npm start
# 打包,目录下生成 build 文件夹
npm run build
3.2 后端项目
随便创建一个最简单的 SpringBoot 项目,写一个 HelloWorld 接口,测试接口是否可用
测试通过后,项目打 jar 包上传到服务器。
至此,项目准备阶段结束,准备开始容器化改造
二、容器化改造
前端
- 前端项目的部署一般会用到 Nginx,所以我们需要准备一下 Nginx 的配置文件,当然用默认配置也是可以的
# 创建并编辑 配置文件
vim default.conf
## 内容
server {
# 监听 80 端口
listen 80;
server_name _;
location / {
# 首页位置
root /usr/share/nginx/html;
index index.html index.htm;
}
# 异常页
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
## 输入完成
## 键盘 esc 键后输入 :wq 保存并退出 vim 编辑器
- 准备好 build 包和 Nginx 配置文件之后就要开始写 Dockerfile 了
# 创建并编辑 Dockerfile
## 注意!!!文件名必须叫 Dockerfile
vim Dockerfile
## 内容
# 基于 nginx 镜像构建
FROM nginx
# 拷贝 宿主机当前目录下的 build 文件夹下的内容到 容器中的 /usr/share/nginx/html/ 目录下
## 容器内部的路径主要看 Nginx 配置文件的路径,如果没有特别指定,/usr/share/nginx/html/ 为默认路径
COPY build/ /usr/share/nginx/html/
# 拷贝我们自己写的配置文件,到容器中的 Nginx 默认配置存放路径,并且会覆盖原文件
COPY default.conf /etc/nginx/conf.d/default.conf
## 保存并退出 vim 编辑器
到这里我们就完成前端项目的容器化改造了。
3. 构建项目镜像,并且运行容器
# 构建镜像
## my-react --- 镜像名称
## 语句末尾的点 " . " 一定要加!!!表示使用当前路径下的 Dockerfile 文件构建镜像
docker build -t my-react .
# 构建成功后可以查看一下镜像
docker images
# 运行容器
## -d 表示后台运行
## -p 3000:80 表示端口映射,3000为宿主机的端口,80是容器的端口(nginx 默认 80)
## --name myreact 指定容器的名字,不指定也可以
docker run -d -p 3000:80 --name myreact my-react
# 查看运行状态
docker ps
如果容器运行成功的话,就可以通过 ip:3000
访问到 React 的默认首页,那么前端项目的部署也就完成了。
4. 现在我们就可以进行打包发布了
# 第一次发布需要登录一下 docker hub
## 输入指令后 按提示输入账号密码登录
docker login
# 为镜像打 tag 标签
## my-react --- 本地镜像
## lavaclone/react:1.0 docker hub 上创建的仓库名字,再加上版本号
docker tag my-react lavaclone/react:1.0
# 推送到仓库
docker push lavaclone/react:1.0
现在就完成了一个前端项目的创建打包部署发布全流程了,只需要把仓库给别人,就可以直接pull镜像后访问了。
后端
- 在jar包所在的路径下直接开始编写 Dockerfile 文件
vim Dockerfile
# 基于 jdk8 的环境,记得找符合自己项目环境的镜像,
FROM openjdk:8
# 拷贝 jar 包到容器内部
COPY demo.jar /app.jar
# 项目运行在 8080 端口,所以对外暴露 8080 端口
EXPOSE 8080
# 运行jar包
CMD ["java","-jar","/app.jar"]
## 保存并退出
- 构建并运行
# 同样的,不要忘记最后的 “ . ”
docker build -t spring-hello .
# 运行
docker run -d -p 8080:8080 spring-hello
如果运行成功的话,直接访问 ip:8080/hello
,就可以看到我们自己写的 Hello World 接口。
- 剩下发布上传的步骤和前端一样,不再重复教学,参考前文。