一、准备工作
①:环境准备
- Ubuntu系统:我这里是22.04
- 一台安装好docker环境的Ubuntu
查看docker版本
提示:如果没有安装 Docker 环境 查看文章
二、项目部署
①:准备工作
好了,环境准备好之后,接下来可以尝试部署项目了。
项目说明:
- invoice:发票系统管理的后端代码
- invoice-web:发票系统管理的前端代码
- DockerFile:用于构建镜像
部署的容器及端口说明:
项目 | 容器名 | 端口 | 备注 |
invoice | invoice | 19009 | 发票系统管理的后端API入口 |
invoice-web | nginx | 8899 | 发票系统管理的前端入口 |
mysql | mysql | 3306 | 发票系统管理的数据库 |
redis | redis | 6379 | 发票系统管理的redis |
DockerFile
# 基础镜像
FROM java:8
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
VOLUME /logs
# 拷贝jar包
COPY *.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
②:准备MySQL、nginx、redis容器
- 因为项目中分别用到了MySQL、nginx和redis,所以提前准备好这些容器(并准备好数据库中的数据)
- MySQL、nginx、redis容器 将容器放到同一个网络中,之后直接使用容器名字访问即可
01:创建网络
- 创建网络(名为invoice)
sudo docker network create invoice
- 查看所有网络
sudo docker network ls
02:创建nginx容器
1.创建容器
详情可查看:
- 指定版本运行,
会自动拉取镜像
sudo docker run --name nginx -p 80:80 -d nginx:1.25.3
- 查看运行的镜像
docker ps
- 创建本地文件夹
sudo mkdir -p /usr/local/nginx
- 从容器nginx里复制配置文件到本地
sudo docker cp nginx:/etc/nginx/ /usr/local/nginx
sudo docker cp nginx:/usr/share/nginx/html /usr/local/nginx
- 删除容器
sudo docker rm -f nginx
- 重新启动nginx 并挂载到本地
由于需要让nginx同时代理invoice-web前端资源,因此我们需要暴露两个端口:
- 80:默认nginx首页端口(也可以不代理)
- 8899:对应invoice-web
sudo docker run \
-p 80:80 \
-p 8899:8899 \
--name nginx \
--restart=always \
-v /usr/local/nginx/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/logs:/var/log/nginx \
-d nginx:1.25.3
2.nginx容器创建之后我们需要将
nginx容器
加入到invoice
网络中
- 查看所有网络
sudo docker network ls
- 将容器加入到网络中
sudo docker network connect invoice nginx
3.查看网络详细信息
docker network inspect invoice
03:创建redis容器
1.创建容器
详情查看:
- 拉取最新镜像
sudo docker pull redis
- 创建redis配置目录
sudo mkdir -p /usr/local/redis/conf
- 进入到该目录
cd /usr/local/redis/conf
- 下载redis的配置文件,并上传到虚拟机中
- 下载地址: https://www.redis.net.cn/download
- 修改默认配置信息
vim /usr/local/redis/redis.conf
# 配置信息 分析
bind 127.0.0.1 # 这行要注释掉,解除本地连接限制
protected-mode no # 默认yes,如果设置为yes,则只允许在本机的回环连接,其他机器无法连接。
daemonize no # 默认no 为不守护进程模式
requirepass 123456 # 设置密码
appendonly yes # 持久化
- 创建并启动redis容器
docker run --name redis \
-p 6379:6379 \
--restart=always \
-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis:/data \
-d redis redis-server /etc/redis/redis.conf --appendonly yes
2.redis容器创建之后我们需要将
redis容器
加入到invoice
网络中
- 查看所有网络
sudo docker network ls
- 将容器加入到网络中
sudo docker network connect invoice redis
3.查看网络详细信息
sudo docker network inspect invoice
04:创建MySQL容器
1.创建容器
详情查看:
- 拉取指定版本镜像
sudo docker pull mysql:8.0
- 创建挂载目录
sudo mkdir -p /usr/local/mysql/data
sudo mkdir -p /usr/local/mysql/init
sudo mkdir -p /usr/local/mysql/conf
- 创建并运行mysql容器
sudo docker run -d \
--name mysql \
-p 3306:3306 \
--restart=always \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql/conf.d \
-v /usr/local/mysql/init:/docker-entrypoint-initdb.d \
mysql:8.0
- 挂载的目录下有很多数据
2.MySQL容器创建之后我们需要将
MySQL容器
加入到invoice
网络中
- 查看所有网络
sudo docker network ls
- 将容器加入到网络中
sudo docker network connect invoice mysql
3.查看网络详细信息
docker network inspect invoice
05:准备数据
1.运行sql文件
③:部署Java项目
01:准备Dokerfile文件
1.可以使用以下两种方式来命名 Dockerfile 文件:
- Dockerfile:这是最常见和推荐的方式,使用没有后缀的文件名。
- Dockerfile.dockerfile:这种方式在某些情况下可能更具描述性,特别是当你有多个类型的 Dockerfile 文件时。
2.Dokerfile内容
# 基础镜像
FROM openjdk:8-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY invoice-0.1.2-SNAPSHOT.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
02:部署后端
1.将Dockerfile和jar包一起上传到虚拟机
2.构建镜像,
构建项目镜像,不指定tag,则默认为latest
docker build -t invoice .
2,查看镜像
docker images
3.创建并运行容器,
创建并运行一个tomcat容器
docker run -d --name tomcat --restart=always --network invoice -p 8080:8080 tomcat
# 命令分析
-d: #这是一个简写形式,全称为 --detach。它表示在后台运行容器。
--name tomcat: #指定容器的名称为 tomcat。
--restart=always: #设置容器始终自动重启,即使容器异常退出也会自动重新启动。
--network invoice: #将容器连接到名为 invoice 的网络中。这要求在运行此命令之前已经创建了该网络。
-p 8080:8080: #将主机的端口 8080 映射到容器的端口 8080。这使得可以通过主机的 8080 端口访问容器中运行的 Tomcat 服务。
tomcat: #指定要使用的镜像名称为 tomcat。
4.创建并运行容器,并通过–network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name invoice --restart=always --network invoice -p 19009:19009 invoice
4.查看启动日志
docker logs invoice
5.请求api测试 http://192.168.200.128:19009/web/workFile/getAll
- 后端部署成功!
03:部署前端
1.创建目录用于存放前端代码
mkdir -p /usr/local/nginx/html/invoice-web
2.将打包好的前端代表拷贝到目录
/usr/local/nginx/html/invoice-web
下
3.配置nginx
vim /usr/local/nginx/nginx/nginx.conf
- 添加以下信息
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/json;
sendfile on;
keepalive_timeout 65;
client_max_body_size 1000M; #(设置客户端请求体最大值)
client_body_buffer_size 1000M; #(配置请求体缓存区大小)
fastcgi_intercept_errors on;
server {
listen 8899;
server_name _;
location /api/ {
# 这里配置代理到后端服务的地址
proxy_pass http://invoice:19009/;
}
location / {
# 这里配置前端资源的路径(容器内部路径)
root /usr/share/nginx/html/invoice-web;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
}
4.重启nginx容器(使配置文件生效)
docker restart nginx