使用 Docker 部署Java后端、前端、Nacos、Redis

387 阅读5分钟

一、为什么选择 Docker 部署应用程序?

  1. 一致性和可移植性
  • 一致的环境:应用及其依赖项都在容器内,确保开发、测试和生产环境一致。
  • 跨平台运行:容器可以在任何支持 Docker 的系统上运行。
  1. 轻量级和高效
  • 资源高效:容器共享主机操作系统内核,比虚拟机更轻量级。
  • 快速启动:容器启动速度比虚拟机快,通常在几秒内完成。
  1. 简化依赖管理
  • 依赖隔离:每个容器独立运行,避免依赖冲突。
  • 配置简化:通过 Dockerfile 定义环境,配置管理更简单。
  1. 可扩展性和自动化
  • 扩展管理:与 Kubernetes 等编排工具集成,可以轻松扩展和管理容器。
  • 自动化部署:与 CI/CD 工具集成,实现自动化构建和部署。
  1. 安全性和隔离
  • 进程隔离:容器隔离进程,提高安全性。
  • 多层安全机制:支持命名空间、控制组等安全特性。
  1. 活跃的生态系统
  • 丰富的工具和插件:支持监控、日志管理等多种需求。
  • 社区支持:有广泛的资源和支持。

二、在Centos上安装Docker

  1. 更新现有的包
sudo yum update -y
  1. 安装依赖包,并设置 Docker 仓库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 官方镜像源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 国内镜像源(阿里)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装 Docker CE
sudo yum install -y docker-ce
  1. 设置开机自启动
sudo systemctl start docker
sudo systemctl enable docker
  1. 验证是否安装成功
docker --version

显示docker的版本,到这里 docker 已经安装完成

三、部署目录及过程

1. 文件目录,包含所有需要的文件
docker/
├── docker-compose.yml   // docker compose
├── nacos/               // nacos Docker file
│   ├── conf/
|   |   └── application.propertise
│   └── Dockerfile
├── web/                 // web
│   ├── conf/
|   |   └── nginx.conf
│   ├── dist/            // web build file
│   ├── logs/            // nginx log
│   ├── ssl/             // ssl 证书
│   └── Dockerfile
├── redis/           		 // redis docker 
│   ├── conf/
|   |   └── redis.conf
│   └── Dockerfile
├── server/              // server 后端
│   ├── app1.jar         // app1.jar
│   ├── app2.jar         // app2.jar
│   ├── app3.jar         // app3.jar
│   ├── Dockerfile
|   └── start.sh         // server 启动脚本
~~~
2. docker-compose.yaml

docker-compose.yaml 文件是 Docker Compose 工具的核心配置文件,通过它可以定义和管理多个 Docker 容器的配置,简化了多容器应用程序的部署和管理。

# 版本号
version: '1.0'
services:
  nacos:
    image: nacos
    container_name: nacos
    build:
      context: nacos
      dockerfile: Dockerfile
    environment:
      - MODE=standalone
      - TZ=Asia/Shanghai
    volumes:
      # 挂载 nacos 日志
      - ./nacos/logs:/home/nacos/logs
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    restart: always
  redis:
    container_name: redis
    image: redis
    ports:
      - "6379:6379"
    build:
      context: redis
      dockerfile: Dockerfile
    volumes:
      # redis data
      - ./redis/data:/data
    environment:
      TZ: Asia/Shanghai
    command: redis-server /home/redis/redis.conf
    restart: always
  server:
    image: server
    container_name: server
    build:
      context: server
      dockerfile: Dockerfile
    volumes:
      # server file
      - ./server:/home/app
    ports:
      - "18080:18080"
    environment:
      TZ: Asia/Shanghai
    restart: always
    depends_on:
      - nacos
      - redis
  web:
    image: web
    container_name: web
    build:
      context: web
      dockerfile: Dockerfile
    volumes:
      # 前端包
      - ./web/dist/:/usr/share/nginx/html/
      # 证书
      - ./web/ssl:/etc/nginx/ssl
      # nginx 日志
      - ./web/logs:/etc/nginx/logs
    restart: always
    ports:
      - "443:443"
    depends_on:
      - server
3. Nacos 模块
  • application.properties 存放着 Nacos 启动配置,略过
  • Dockerfile 详情如下
# 基础镜像
FROM nacos/nacos-server:v2.2.0
# author
MAINTAINER 123@123.com
# 创建目录
RUN mkdir -p /home/nacos/
# 工作目录
WORKDIR /home/nacos
# 复制配置文件
COPY ./conf/application.properties /home/nacos/conf/application.properties
4. Redis 模块
  • redis.conf 存放 Redis的配置,略过
  • Dockerfile 详情如下
# 基础镜像
FROM redis:6.2.4-alpine
# author
MAINTAINER 123@123.com
# 创建目录
RUN mkdir -p /home/redis
# 工作目录
WORKDIR /home/redis
# 复制配置文件
COPY ./conf/redis.conf /home/redis/redis.conf
5. Server 模块
  • Dockerfile 详情如下
# 基础镜像
FROM openjdk:11-jdk
# author
MAINTAINER 123@123.com
# 创建目录
RUN mkdir -p /home/app/
# 工作目录
WORKDIR /home/app
# 启动命令
ENTRYPOINT ["sh", "-c", "/home/app/start.sh"]
  • start.sh 详情如下
#!/bin/sh
startTime=$(date "+%Y-%m-%d %H:%M:%S")
echo "Starting lbs-server..."
echo "startTime $startTime"
java -Xms256m -Xmx1024m -jar ./app1.jar
java -Xms256m -Xmx512m -jar ./app2.jar
java -Xms256m -Xmx512m -jar ./app3.jar
wait

注: start.sh 上传至目标服务器之后,需要赋给 start.sh 可执行权限 chmod o+x start.sh,最后执行wait为了保持 Docker 容器运行、确保所有后台进程正常运行、提供正确的进程退出状态,便于调试和错误处理。

6. Web 模块
  • Dockerfile 详情如下
FROM nginx:1.24
MAINTAINER 123@123.com
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
ENV TZ=Asia/Shanghai
CMD ["nginx", "-g", "daemon off;"] # 让 Nginx 以守护进程模式(daemon off)运行
  • nginx.conf 详情如下
worker_processes  4;
error_log  /etc/nginx/logs/error.log;
events {
    worker_connections  2048;
    multi_accept on; 
}
http {
    include       mime.types;
    default_type  application/octet-stream;

    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  /etc/nginx/logs/access.log  main;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
        location / {
        	return 301 https://$host/;
      	  }

    }
    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      /etc/nginx/ssl/your_ip_ssl.crt; # ssl证书存储路径
        ssl_certificate_key  /etc/nginx/ssl/your_ip.private; # 秘钥存储路径

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_prefer_server_ciphers  on;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #开启TLS协议

         # 前端前台访问地址映射
         location / {
                root   /usr/share/nginx/html/;
                index  index.html index.htm;
                try_files $uri $uri/ /index.html;
         }

        # 请求后端接口转发
        location /api/ {
         
            add_header Access-Control-Allow-Origin '*' always;
            add_header Access-Control-Allow-Headers '*';
            add_header Access-Control-Allow-Methods '*';
            add_header Access-Control-Allow-Credentials 'true';
            if ($request_method = 'OPTIONS') {
                return 204;
            }
            proxy_pass   http://ip:18080/;
        }
        # 压缩
        gzip on;
        gzip_comp_level 4;
        gzip_min_length 256;
        gzip_types text/plain text/css text/javascript application/json application/javascript application/x-protobuf;

    }
}
7. 启动

启动命令,解释如下

# 切换至 docker 目录
# 命令
docker compose -f ./docker-compose.yaml up -d --build images-name
# docker compose: 这是 Docker Compose 工具的命令,用于执行与 Docker Compose 相关的操作。

# -f ./docker-compose.yaml: -f 参数用于指定要使用的 Docker Compose 配置文件的路径。

# up: up 是 Docker Compose 命令的一个子命令,用于启动容器组。

# -d: up 命令的一个选项,表示以后台模式运行容器。

# --build: 这个选项告诉 Docker Compose 在启动容器之前构建镜像。如果容器的镜像已经存在,则会先删除现有镜像,然后重新构建。

# images-name: 在 Docker Compose 配置文件中,可以定义多个服务,而这里的 images 参数指定了要构建的服务名称。

若直接执行docker compose -f ./docker-compose.yaml up -d --build会将docker-compose.yaml中定义的所有 service 根据 depends_on 依赖先后启动,这里建议新手分步启动

  • 启动 Nacos docker compose -f ./docker-compose.yaml up -d --build nacos
  • 启动 Redis docker compose -f ./docker-compose.yaml up -d --build redis
  • 启动 server docker compose -f ./docker-compose.yaml up -d --build server
  • 启动 web docker compose -f ./docker-compose.yaml up -d --build web

若启动失败,可以使用docker logs images-name查看启动日志

可以通过docker ps查看镜像执行状态

到这里本篇文章的分享结束,希望能帮助到大家,点赞+收藏不迷路~~