Docker项目部署

StarMoon2023/11/20LinuxLinuxDocker

上一篇我们已经熟悉了Docker的基本用法,接下来可以尝试部署项目了。

项目说明:

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

部署的容器及端口说明:

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

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

docker rm -f nginx dd

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

一、部署Java项目

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

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

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

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

image-20231124170647070

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

image-20231124170858363

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

我们将项目打包:

image-20231124171108985

结果:

image-20231124171204045

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

image-20231124171332144

部署项目:

# 1.构建项目镜像
docker build -t hmall .

# 2.查看镜像
docker images
# 结果
REPOSITORY           TAG               IMAGE ID       CREATED          SIZE
hmall                latest            67aa959dd7d1   13 minutes ago   370MB
docker-demo          latest            faa5bd837792   4 days ago       319MB
nginx                latest            605c77e624dd   23 months ago    141MB

# 3.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name hmall --network hmall -p 8080:8080 hmall

测试,通过浏览器访问:http://虚拟机地址:8080/search/list

二、部署前端

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

nginx的部署目录:

image-20231124171810419

其中:

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

把整个nginx目录上传到虚拟机的/root目录下,然后创建nginx容器并完成两个挂载:

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

由于需要让nginx同时代理hmall-portal和hmall-admin两套前端资源,因此我们需要暴露两个端口:

  • 18080:对应hmall-portal
  • 18081:对应hmall-admin

命令如下:

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 hmall \
  nginx

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

image-20231124172412142

三、DockerCompose

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

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

3.1.基本语法

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

Compose file version 3 reference | Docker Docsopen in new window

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

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: 123456
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    image: hmall
    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

3.2.基础命令

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

Overview of docker compose CLI | Docker Docsopen in new window

基本语法如下:

docker compose [OPTIONS] [COMMAND]

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

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

演示:

# 1.进入root目录
cd /root

# 2.删除所有旧容器
docker rm -f $(docker ps -qa)


# 3.启动所有, -d 参数是后台启动
docker compose up -d
# 结果:
[+] Running 4/4
 ✔ Network hmall    Created                                                                                                                                                                          0.1s 
 ✔ Container mysql  Started                                                                                                                                                                          0.5s 
 ✔ Container hmall  Started                                                                                                                                                                          0.7s 
 ✔ Container nginx  Started                                                                                                                                                                          1.1s 
# 4.查看容器
docker compose ps
# 结果:
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               hmall               "java -jar /app.jar"     hmall               42 seconds ago      Up 41 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s…"   mysql               42 seconds ago      Up 41 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint.…"   nginx               42 seconds ago      Up 40 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp

访问:http://虚拟机ip:18080

最后更新时间 2023/11/25 11:10:52