• docker项目部署


    一.项目说明

    • hmall:商城的后端代码
    • hmall-portal:商城用户端的前端代码
    • hmall-admin:商城管理端的前端代码

    部署的容器及端口说明:

    项目容器名端口备注
    hmallhmall8080黑马商城后端API入口
    hmall-portalnginx18080黑马商城用户端入口
    hmall-admin18081黑马商城管理端入口
    mysqlmysql3306数据库

    在正式部署前,我们先删除之前的nginx容器:

    docker rm -f nginx
    
    • 1

    mysql容器中已经准备好了商城的数据,所以就不再删除了。

    二.部署Java项目

    hmall项目是一个maven聚合项目,使用IDEA打开hmall项目,查看项目结构如图:

    在这里插入图片描述

    我们要部署的就是其中的hm-service,其中的配置文件采用了多环境的方式:

    在这里插入图片描述

    其中的application-dev.yaml是部署到开发环境的配置,application-local.yaml是本地运行时的配置。

    查看application.yaml,你会发现其中的JDBC地址并未写死,而是读取变量:

    在这里插入图片描述

    这两个变量在application-dev.yaml和application-local.yaml中并不相同:

    在这里插入图片描述

    在dev开发环境(也就是Docker部署时)采用了mysql作为地址,刚好是我们的mysql容器名,只要两者在一个网络,就一定能互相访问。

    将项目打包:

    在这里插入图片描述
    Dockerfile文件内容:

    # 基础镜像
    FROM openjdk:11.0-jre-buster
    # 设定时区
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    # 拷贝jar包
    COPY hm-service.jar /app.jar
    # 入口
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    将hm-service目录下的Dockerfile和hm-service/target目录下的hm-service.jar一起上传到虚拟机的root目录:

    在这里插入图片描述

    部署项目:

    # 1.构建项目镜像,不指定tag,则默认为latest
    docker build -t hmall .
    
    # 2.查看镜像
    docker images
    # 结果
    REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
    hmall         latest    0bb07b2c34b9   43 seconds ago   362MB
    mysql         latest    3218b38490ce   17 months ago    516MB
    
    # 3.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
    docker run -d --name hmall --network hmall -p 8080:8080 hmall
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    三.部署前端

    hmall-portalhmall-admin是前端代码,需要基于nginx部署。

    在这里插入图片描述
    其中:

    • html是静态资源目录,我们需要把hmall-portal以及hmall-admin都复制进去
    • nginx.conf是nginx的配置文件,主要是完成对html下的两个静态资源目录做代理

    nginx.conf:

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/json;
    
        sendfile        on;
        
        keepalive_timeout  65;
    
        server {
            listen       18080;
            # 指定前端项目所在的位置
            location / {
                root /usr/share/nginx/html/hmall-portal;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            location /api {
                rewrite /api/(.*)  /$1 break;
                proxy_pass http://hmall:8080;
            }
        }
        server {
            listen       18081;
            # 指定前端项目所在的位置
            location / {
                root /usr/share/nginx/html/hmall-admin;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            location /api {
                rewrite /api/(.*)  /$1 break;
                proxy_pass http://hmall:8080;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    我们现在要做的就是把整个nginx目录上传到服务器的/root目录下:

    在这里插入图片描述

    然后创建nginx容器并完成两个挂载:

    • 把/root/nginx/nginx.conf挂载到/etc/nginx/nginx.conf
    • 把/root/nginx/html挂载到/usr/share/nginx/html

    命令如下:

    docker run -d \
      --name nginx \
      -p 18080:18080 \
      -p 18081:18081 \
      -v /root/nginx/html:/usr/share/nginx/html \
      -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
      --network liming \
      nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试,通过浏览器访问:http://ip:18080

    在这里插入图片描述

    四.DockerCompose

    大家可以看到,我们部署一个简单的java项目,其中包含3个容器:

    • MySQL
    • Nginx
    • Java项目

    而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。

    Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。

    4.1 基本语法

    docker-compose.yml文件的基本语法可以参考官方文档

    在这里插入图片描述

    docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

    举例来说,用docker run部署MySQL的命令如下:

    docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=123 \
      -v ./mysql/data:/var/lib/mysql \
      -v ./mysql/conf:/etc/mysql/conf.d \
      -v ./mysql/init:/docker-entrypoint-initdb.d \
      --network hmall
      mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果用docker-compose.yml文件来定义,就是这样:

    version: "3.8"
    
    services:
      mysql:
        image: mysql
        container_name: mysql
        ports:
          - "3306:3306"
        environment:
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: 123
        volumes:
          - "./mysql/conf:/etc/mysql/conf.d"
          - "./mysql/data:/var/lib/mysql"
        networks:
          - new
    networks:
      new:
        name: hmall
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    对比如下:

    docker run 参数docker compose 指令说明
    –namecontainer_name容器名称
    -pports端口映射
    -eenvironment环境变量
    -vvolumes数据卷配置
    –networknetworks网络

    黑马商城部署文件:

    version: "3.8"
    
    services:
      mysql:
        image: mysql
        container_name: mysql
        ports:
          - "3306:3306"
        environment:
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: 123
        volumes:
          - "./mysql/conf:/etc/mysql/conf.d"
          - "./mysql/data:/var/lib/mysql"
          - "./mysql/init:/docker-entrypoint-initdb.d"
        networks:
          - hm-net
      hmall:
        build: 
          context: .
          dockerfile: Dockerfile
        container_name: hmall
        ports:
          - "8080:8080"
        networks:
          - hm-net
        depends_on:
          - mysql
      nginx:
        image: nginx
        container_name: nginx
        ports:
          - "18080:18080"
          - "18081:18081"
        volumes:
          - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
          - "./nginx/html:/usr/share/nginx/html"
        depends_on:
          - hmall
        networks:
          - hm-net
    networks:
      hm-net:
        name: hmall
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    4.2 基础命令

    编写好docker-compose.yml文件,就可以部署项目了。常见的命令:

    https://docs.docker.com/compose/reference/

    基本语法如下:

    docker compose [OPTIONS] [COMMAND]
    
    • 1

    其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

    类型参数或指令说明
    Options-f指定compose文件的路径和名称
    -p指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
    Commandsup创建并启动所有service容器
    down停止并移除所有容器、网络
    ps列出所有启动的容器
    logs查看指定容器的日志
    stop停止容器
    start启动容器
    restart重启容器
    top查看运行的进程
    exec在指定的运行中容器中执行命令

    部署演示:

    # 1.进入root目录
    cd /root
    
    # 2.删除旧容器
    docker rm -f $(docker ps -qa)
    
    # 3.删除hmall镜像
    docker rmi hmall
    
    # 4.清空MySQL数据
    rm -rf mysql/data
    
    # 5.启动所有, -d 参数是后台启动
    docker compose up -d
    # 结果:
    [+] Building 15.5s (8/8) FINISHED
     => [internal] load build definition from Dockerfile                                    0.0s
     => => transferring dockerfile: 358B                                                    0.0s
     => [internal] load .dockerignore                                                       0.0s
     => => transferring context: 2B                                                         0.0s
     => [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster             15.4s
     => [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3  0.0s
     => [internal] load build context                                                       0.0s
     => => transferring context: 98B                                                        0.0s
     => CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo   0.0s
     => CACHED [3/3] COPY hm-service.jar /app.jar                                           0.0s
     => exporting to image                                                                  0.0s
     => => exporting layers                                                                 0.0s
     => => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71  0.0s
     => => naming to docker.io/library/root-hmall                                           0.0s
    [+] Running 4/4
     ✔ Network hmall    Created                                                             0.2s
     ✔ Container mysql  Started                                                             0.5s
     ✔ Container hmall  Started                                                             0.9s
     ✔ Container nginx  Started                                                             1.5s
    
    # 6.查看镜像
    docker compose images
    # 结果
    CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
    hmall               root-hmall          latest              32eebee16acd        362MB
    mysql               mysql               latest              3218b38490ce        516MB
    nginx               nginx               latest              605c77e624dd        141MB
    
    # 7.查看容器
    docker compose ps
    # 结果
    NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
    hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
    mysql               mysql               "docker-entrypoint.s…"   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
    nginx               nginx               "/docker-entrypoint.…"   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    MySQL的DDL操作数据库
    电脑技巧:低配置的旧电脑也可以使用Win11系统了
    【eBPF-03】进阶:BCC 框架中 BPF 映射的应用 v1.0
    ARHUD驾车导航技术概览
    springboot+vue房屋租赁系统-求租合同系统java
    vscode不能打开终端问题
    解决Adobe Premiere Pro CC 2018打开无反应,并出现.crash的文件问题
    校园贴吧微信小程序搭建教程
    java毕业设计——基于java+J2EE+jsp的企业电子投票系统设计与实现(毕业论文+程序源码)——电子投票系统
    真香!宝藏学习方式还可以这样,家人们绝不能错过
  • 原文地址:https://blog.csdn.net/weixin_46370595/article/details/134262721