Docker项目部署
上一篇我们已经熟悉了Docker的基本用法,接下来可以尝试部署项目了。
项目说明:
- hmall:商城的后端代码
- hmall-portal:商城用户端的前端代码
- hmall-admin:商城管理端的前端代码
部署的容器及端口说明:
| 项目 | 容器名 | 端口 | 备注 |
|---|---|---|---|
| hmall | hmall | 8080 | 黑马商城后端API入口 |
| hmall-portal | nginx | 18080 | 黑马商城用户端入口 |
| hmall-admin | 18081 | 黑马商城管理端入口 | |
| mysql | mysql | 3306 | 数据库 |
在正式部署前,我们先删除之前的nginx、dd两个容器:
docker rm -f nginx dd
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容器名,只要两者在一个网络,就一定能互相访问。
我们将项目打包:

结果:

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

部署项目:
# 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-portal和hmall-admin是前端代码,需要基于nginx部署。
nginx的部署目录:

其中:
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

三、DockerCompose
稍微复杂的项目,其中会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。
而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
3.1.基本语法
docker-compose.yml文件的基本语法可以参考官方文档:
docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。对比如下:
| docker run 参数 | docker compose 指令 | 说明 |
|---|---|---|
| --name | container_name | 容器名称 |
| -p | ports | 端口映射 |
| -e | environment | 环境变量 |
| -v | volumes | 数据卷配置 |
| --network | networks | 网络 |
黑马商城部署文件:
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文件,就可以部署项目了。常见的命令:
基本语法如下:
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
