一、准备工作

①:环境准备

  • Ubuntu系统:我这里是22.04
  • 一台安装好docker环境的Ubuntu

查看docker版本

  • 提示:如果没有安装 Docker 环境 查看文章

windows使用docker部署java项目 docker部署java环境_ubuntu

二、项目部署

①:准备工作

好了,环境准备好之后,接下来可以尝试部署项目了。

项目说明:

  • 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"]

windows使用docker部署java项目 docker部署java环境_nginx_02

②:准备MySQL、nginx、redis容器

  • 因为项目中分别用到了MySQL、nginx和redis,所以提前准备好这些容器(并准备好数据库中的数据)
  • MySQL、nginx、redis容器 将容器放到同一个网络中,之后直接使用容器名字访问即可

windows使用docker部署java项目 docker部署java环境_redis_03

01:创建网络

  • 创建网络(名为invoice)
sudo docker network create invoice
  • 查看所有网络
sudo docker network ls

windows使用docker部署java项目 docker部署java环境_java_04

02:创建nginx容器

1.创建容器
详情可查看:

  • 指定版本运行,会自动拉取镜像
sudo docker run --name nginx -p 80:80 -d nginx:1.25.3

windows使用docker部署java项目 docker部署java环境_redis_05

  • 查看运行的镜像
docker ps

windows使用docker部署java项目 docker部署java环境_docker_06

  • 创建本地文件夹
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

windows使用docker部署java项目 docker部署java环境_java_07

  • 删除容器
sudo docker rm -f nginx

windows使用docker部署java项目 docker部署java环境_java_08

  • 重新启动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

windows使用docker部署java项目 docker部署java环境_nginx_09

2.nginx容器创建之后我们需要将nginx容器加入到invoice网络中

  • 查看所有网络
sudo docker network ls
  • 将容器加入到网络中
sudo docker network connect invoice nginx

windows使用docker部署java项目 docker部署java环境_ubuntu_10

3.查看网络详细信息

docker network inspect  invoice

windows使用docker部署java项目 docker部署java环境_redis_11

03:创建redis容器

1.创建容器
详情查看:

  • 拉取最新镜像
sudo docker pull redis

windows使用docker部署java项目 docker部署java环境_redis_12

  • 创建redis配置目录
sudo mkdir -p /usr/local/redis/conf
  • 进入到该目录
cd /usr/local/redis/conf

windows使用docker部署java项目 docker部署java环境_ubuntu_13

  • 修改默认配置信息
vim /usr/local/redis/redis.conf

# 配置信息 分析
bind 127.0.0.1 # 这行要注释掉,解除本地连接限制
protected-mode no # 默认yes,如果设置为yes,则只允许在本机的回环连接,其他机器无法连接。
daemonize no # 默认no 为不守护进程模式
requirepass 123456 # 设置密码
appendonly yes # 持久化

windows使用docker部署java项目 docker部署java环境_java_14

  • 创建并启动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

windows使用docker部署java项目 docker部署java环境_docker_15

3.查看网络详细信息

sudo docker network inspect  invoice

windows使用docker部署java项目 docker部署java环境_ubuntu_16

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
  • 挂载的目录下有很多数据

windows使用docker部署java项目 docker部署java环境_docker_17

2.MySQL容器创建之后我们需要将MySQL容器加入到invoice网络中

  • 查看所有网络
sudo docker network ls
  • 将容器加入到网络中
sudo docker network connect invoice mysql

windows使用docker部署java项目 docker部署java环境_ubuntu_18

3.查看网络详细信息

docker network inspect  invoice

windows使用docker部署java项目 docker部署java环境_docker_19

05:准备数据

1.运行sql文件

windows使用docker部署java项目 docker部署java环境_java_20


windows使用docker部署java项目 docker部署java环境_redis_21

③:部署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包一起上传到虚拟机

windows使用docker部署java项目 docker部署java环境_redis_22

2.构建镜像,构建项目镜像,不指定tag,则默认为latest

docker build -t invoice .

windows使用docker部署java项目 docker部署java环境_ubuntu_23

2,查看镜像

docker images

windows使用docker部署java项目 docker部署java环境_redis_24

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

windows使用docker部署java项目 docker部署java环境_ubuntu_25

4.查看启动日志

docker logs invoice

windows使用docker部署java项目 docker部署java环境_java_26

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

windows使用docker部署java项目 docker部署java环境_ubuntu_27

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

windows使用docker部署java项目 docker部署java环境_java_28

5.访问测试 http://192.168.200.128:8899/web

windows使用docker部署java项目 docker部署java环境_docker_29

windows使用docker部署java项目 docker部署java环境_nginx_30


windows使用docker部署java项目 docker部署java环境_nginx_31