Docker深度解析:部署 SpringBoot 项目

方式一:通过两个容器部署

前端部署:
  1. 修改前端访问端口 ip 为服务器 ip,打包前端:npm run build:prod

  2. 创建文件夹,放置前端部署需要的文件,并将打包的前端 dist 文件放到此文件

  3. 编写 default.conf 配置文件,配置 nginx:

    server{
            listen 80;
            server_name 62.234.35.76;       #修改为自己服务器 ip
    
            location / {
                    root /usr/share/nginx/html;
                    index   index.html;
            }
            location /prod-api/ {
                    proxy_pass http://62.234.35.76:8383/;
            }
    }
    
  4. 编写 Dockerfile 文件:

    #基于父类镜像 nginx
    FROM nginx
    
    #作者
    MAINTAINER lijiaxu
    
    #将前端的内容复制到 nginx 目录下
    COPY dist /usr/share/nginx/html/
    
    #用本地的 nginx 配置文件覆盖镜像的 nginx 配置
    COPY default.conf /etc/nginx/conf.d
    
    #开放端口
    EXPOSE 80
    
  5. 将 dockerfile 文件打包成镜像文件:

    docker build -f Dockerfile -t community-front:1 .    #注意 . 不要忘掉
    
  6. 运行该镜像:

    docker run -p 83:80 community-front:1
    
后端部署:
  1. 修改后端端口 ip,打包项目:

  2. 创建文件夹部署需要的文件,将打包好的 jar 包放入此文件夹

  3. 编写 Dockerfile 文件:

    # 基础镜像使用java
    FROM java:8
    # 作者
    MAINTAINER zhangjinxiu
    # VOLUME 指定了临时文件目录为/tmp。
    # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
    VOLUME /tmp
    # 将jar包添加到容器中并更名为springbootb.jar
    ADD jar包文件名 community.jar
    # 运行jar包
    RUN bash -c 'touch /community.jar'
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/community.jar"]
    #暴露8080端口
    EXPOSE 8383
    
  4. 将 dockerfile 打包成镜像文件:

    docker build -f Dockerfile -t community-java:1 .    #注意 . 不要忘记
    
  5. 运行该镜像文件:

    docker run -p 8383:8383 community-java:1
    
  6. 还需启动 mysql 和 redis:

  7. 访问服务即可:

第二种方式:通过 compose 编排容器自动部署

  1. 删除所有容器以及镜像:

    docker stop $(docker ps -q) & docker rm $(docker ps -aq)      ===>  停止所有容器,并删除所有容器
    docker rmi $(docker images -q)    ===> 删除所有镜像
    
  2. 创建文件夹,放置需要部署的文件:

    1. 将前端打包后的 dist 文件夹放入该文件下
  3. 修改后端配置文件,打包后上传至服务器:

  4. 编写启动后台的 Dockerfile 文件:

    #基础镜像
    FROM  kdvolder/jdk8:latest
    
    #作者   
    MAINTAINER lijiaxu
    
    # 在主机 /var/lib/docker 目录下创建一个临时文件,并链接到容器的 /tmp 
    VOLUME /tmp
    
     #将 jar 包添加至容器并更名为 community.jar
    ADD SpringBootCommunity-1.0-SNAPSHOT.jar community.jar
    
     #运行的 jar 包
    RUN bash -c 'touch /community.jar'
    
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/community.jar"]
    
    #暴露 8383 端口
    EXPOSE 8383
    
  5. 在文件夹中创建 db 文件夹,里面放置项目用到的 SQL 文件

  6. 编写 mysql-dockerfile:

    FROM mysql:5.7
    
    MAINTAINER lijiaxu
    
    #docker-entrypoint-initdb.d/ 目录下所有 .sh  .sql  .sql.gz 文件将在数据库初始化时被执行或导入
    #这意味着community-linux.sql 中的 SQL 命令将在数据库容器首次启动时被执行,从而初始化数据库
    ADD ./db/community-linux.sql /docker-entrypoint-initdb.d/
    
  7. 编写 nginx.conf 文件:

    worker_processes 1;
    
    events{
            worker_connections 1024;
    }
    
    http{
            include         mime.types;
            default_type    application/octet-stream;
            sendfile        on;
            keepalive_timeout  65;
    
            server{
                    listen 80;
                    server_name localhost;
    
                    location / {
                            root /usr/share/nginx/html;
                            try_files $uri $uri/ /index.html last;
                            index index.html;
                    }
    
                    location /prod-api/ {
                            proxy_pass http://服务器地址:8383/;
                    }
    
            }
    }
    
  8. 编写 docker-compose.yml 文件:

    version: '3.0'
    
    services:
    
      mysql:
        image: mysql:5.7
        container_name: mysql
        build: 
          context: ./
          dockerfile: mysql-dockerfile
        restart: always
        command: --default-authentication-plugin=mysql_native_password       #解决外部无法访问问题
        ports:
          - "3308:3306"
        environment:
          MYSQL_ROOT_PASSWORD: 'root'
          MYSQL_DATABASE: 'community'
          MYSQL_PASSWORD: 'root'
        networks:
          - community
    
    
      redis:
        image: redis:7.0
        container_name: redis
        restart: always
        ports:
          - "6379:6379"
        networks:
          - community
    
    
      nginx:
        container_name: nginx
        build:
          context: ./
          dockerfile: nginx-dockerfile
       # restart: always
      #  volumes:
     #     - ./nginx.conf:/etc/nginx/nginx.conf
    #      - ./dist:/usr/share/nginx/html/
        ports:
          - "83:80"
        depends_on:
          - my-community
        networks:
          - community
    
      my-community:
        build:
          context: ./
          dockerfile: Dockerfile
        ports:
          - "8383:8383"
    #    volumes:
    #      - /CommunityFace/upload/face:/app/data/face/
    #      - /CommunityFace/upload/excel/:/app/data/excel/
        depends_on:
          - redis
          - mysql
        restart: always
        networks:
          - community
    
    
    networks:       #定义服务的桥
      community: 
          driver: bridge
    
  9. 运行容器:

    docker-compose up    #前台运行
    docker-compose up -d     #后台运行
    
  10. 查看容器:

  11. 如果容器发生错误:

    1. 如:不显示端口映射,可以查看详细信息

      docker-compose logs nginx(容器名)
      
  12. 页面测试,访问端口:83

相关推荐
你好呀我是裤裤2 小时前
Linux:指令大全(二)
linux·运维·服务器
丢丢丢丢丢丢~3 小时前
在 Debian/Ubuntu 系统上,永久固定网口的IP地址
运维·ubuntu·debian
大饼酥4 小时前
保姆级教程Docker部署Zookeeper官方镜像
分布式·docker·zookeeper·容器
狮歌~资深攻城狮4 小时前
Elasticsearch 就业形势
运维·jenkins
程序员JerrySUN5 小时前
Linux 系统上安装 Docker 方法详解与比较
linux·运维·docker
追风20195 小时前
阿里云 ubuntu22.04 中国区节点安装 Docker
阿里云·docker·云计算
❀͜͡傀儡师5 小时前
如何查看docker的containers 那个日志最大
运维·docker·容器
爱吃喵的鲤鱼6 小时前
linux——网络(服务器的永久不挂——守护进程)
linux·运维·服务器
nangonghen6 小时前
华为云kubernetes部署deepseek r1、ollama和open-webui(已踩过坑)
容器·kubernetes·ollama·open webui·deepseek