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

相关推荐
powerfulzyh12 分钟前
非Root用户启动SSH服务经验小结
运维·ssh
云道轩20 分钟前
升级centos 7.9内核到 5.4.x
linux·运维·centos
斯普信云原生组29 分钟前
Docker构建自定义的镜像
java·spring cloud·docker
爱学习的小道长35 分钟前
Ubuntu Cursor升级成v1.0
linux·运维·ubuntu
2201_7611990436 分钟前
k8s4部署
云原生·容器·kubernetes
EelBarb40 分钟前
seafile:ubuntu搭建社区版seafile12.0
linux·运维·ubuntu
402 Payment Required1 小时前
serv00 ssh登录保活脚本-邮件通知版
运维·chrome·ssh
小柏ぁ1 小时前
calico/node is not ready: BIRD is not ready: BGP not established with xxx
运维·docker·kubernetes
Mintimate1 小时前
云服务器 Linux 手动 DD 安装第三方 Linux 发行版:原理与实战
linux·运维·服务器
RussellFans2 小时前
Linux 环境配置
linux·运维·服务器