Docker部署Java项目
Java 项目部署学习笔记
1. 项目基本信息与部署目标
hmall项目是一个 Maven 聚合项目,可使用 IDEA 打开。- 本次部署的目标为项目中的
hm-service模块。
2. 配置文件说明
hm-service的配置文件采用多环境方式:application-dev.yaml:用于开发环境(Docker 部署)的配置。application-local.yaml:用于本地运行时的配置。
- 查看
application.yaml可知,其中的 JDBC 地址并未写死,而是通过读取变量的方式获取。 - 上述变量在
application-dev.yaml和application-local.yaml中的值并不相同。 - 在 dev 开发环境(Docker 部署时)采用了 mysql 作为地址,该地址刚好是 mysql 容器名,只要两者在同一网络,就一定能互相访问。
3. 项目打包与部署
- 对项目进行打包操作。
- 将
hm-service目录下的Dockerfile和hm-service/target目录下的hm-service.jar一起上传到虚拟机的 root 目录。 - 部署项目的步骤:
- 构建项目镜像(不指定 tag,则默认为 latest):
docker build -t hmall . - 查看镜像:
docker images,结果如下:1
2
3
4
5REPOSITORY TAG IMAGE ID CREATED SIZE
hmall latest 0bb07b2c34b9 43 seconds ago 362MB
docker-demo 1.0 49743484da68 24 hours ago 327MB
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB - 创建并运行容器,通过
--network将其加入 hmall 网络(以便通过容器名访问 mysql):docker run -d --name hmall --network hmall -p 8080:8080 hmall。
- 构建项目镜像(不指定 tag,则默认为 latest):
- 测试:通过浏览器访问
http://你的虚拟机地址:8080/search/list。
4. 前端部署
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。
- 18080:对应
命令如下:
1
2
3
4
5
6
7
8docker 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。
5. Docker Compose
- 部署一个简单的 Java 项目,包含 3 个容器:MySQL、Nginx、Java 项目。对于稍微复杂的项目,还会有各种其它中间件,需要部署的内容远不止 3 个。若手动逐一部署,会非常麻烦。
- Docker Compose 可帮助实现多个相互关联的 Docker 容器的快速部署,允许用户通过一个单独的
docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器。
5.1 基本语法
docker-compose.yml文件的基本语法可参考官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3/docker-compose文件中可定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service是在定义某个应用的运行时参数,因此与docker run参数非常相似。举例:用
docker run部署 MySQL 的命令如下:1
2
3
4
5
6
7
8
9
10docker 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用
docker-compose.yml文件来定义,如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19version: "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对比关系如下:
docker run 参数 docker compose 指令 说明 –name container_name 容器名称 -p ports 端口映射 -e environment 环境变量 -v volumes 数据卷配置 –network networks 网络 黑马商城部署文件:
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
44version: "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
5.2 基础命令
编写好
docker-compose.yml文件后,即可部署项目。常见命令可参考:https://docs.docker.com/compose/reference/基本语法:
docker compose [OPTIONS] [COMMAND],其中OPTIONS和COMMAND都是可选参数,常见的有:| 类型 | 参数或指令 | 说明 |
| ——– | ———- | ————————————————————————————— |
| Options | -f | 指定 compose 文件的路径和名称 |
| | -p | 指定 project 名称(project 是当前 compose 文件中设置的多个 service 的集合,是逻辑概念) |
| Commands | up | 创建并启动所有 service 容器 |
| | down | 停止并移除所有容器、网络 |
| | ps | 列出所有启动的容器 |
| | logs | 查看指定容器的日志 |
| | stop | 停止容器 |
| | start | 启动容器 |
| | restart | 重启容器 |
| | top | 查看运行的进程 |
| | exec | 在指定的运行中容器中执行命令 |
教学演示:
进入 root 目录:
cd /root删除旧容器:
docker rm -f $(docker ps -qa)删除 hmall 镜像:
docker rmi hmall清空 MySQL 数据:
rm -rf mysql/data启动所有(
-d参数是后台启动):docker compose up -d,结果如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20[+] 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查看镜像:
docker compose images,结果如下:1
2
3
4CONTAINER REPOSITORY TAG IMAGE ID SIZE
hmall root-hmall latest 32eebee16acd 362MB
mysql mysql latest 3218b38490ce 516MB
nginx nginx latest 605c77e624dd 141MB查看容器:
docker compose ps,结果如下:1
2
3
4NAME 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
打开浏览器,访问:
http://yourIp:8080。
-
感谢你赐予我前进的力量