小型支付商城 | {Docker构建与部署}

通过Maven、Docker实现工程构建和部署。

0. 常用命令

  1. 安装/启动RabbitMQ服务
1
docker-compose -p market_system -f dev-ops/docker-compose-environment.yml up -d rabbitmq

参数含义:

  • -p: 指定项目名为 market_system
  • -f: 指定yml文件所在的位置
  • up -d: 后台启动
  • rabbitmq: 只启动某一个service,可在命令最后加service名称,注意不是容器名称。

查看容器是否启动成功:docker ps


  1. 停止RabbitMQ服务
1
docker-compose -f docker-compose-environment.yml stop rabbitmq
  1. 停止并删除RabbitMQ容器
1
docker-compose -f docker-compose-environment.yml rm -f rabbitmq

1. Maven操作

处理项目版本问题,Maven编译使用的JDK也需要是JDK8,否则编译失败。其次,为了避免不必要的干扰,或者修改后端的任意代码/配置了之后,需要执行clean操作,随后install重新打成jar包到target目录下。

2. 工程构建

2.1 Docker脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 基础镜像
FROM openjdk:8-jre-slim

# 作者
MAINTAINER jing

# 配置
# 运行参数环境变量,定义一个环境变量 PARAMS,默认空,将来运行容器时可以通过它给Java程序追加启动参数,比如 --spring.profiles.active=dev
ENV PARAMS=""

# 时区
# 设置时区为中国(PRC) 保证容器内时间是北京时间
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 添加应用
# 拷贝应用jar进镜像。将你项目打包生成的 target/s-pay-mall-mvc-app.jar 拷贝到镜像内的根目录 /s-pay-mall-mvc-app.jar
ADD target/s-pay-mall-mvc-app.jar /s-pay-mall-mvc-app.jar

# 启动命令,用java -jar启动这个jar
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /s-pay-mall-mvc-app.jar $PARAMS"]

2.2 build.sh

1
2
# 依据前面提供的dockerfile,构建一个本工程的镜像,给其打标签为 tj/...
docker build -t tj/s-pay-mall-mvc-app:1.0 -f ./Dockerfile .

3. 环境部署

  • 执行命令docker-compose -f docker-compose-environment.yml up -d部署。
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 命令执行 docker-compose up -d
# 云服务器;https://618.gaga.plus
version: '3.9'
services:
mysql:
image: mysql:8.0.32
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
ports:
- "13306:3306"
volumes:
- ./sql:/docker-entrypoint-initdb.d
healthcheck:
test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
interval: 5s
timeout: 10s
retries: 10
start_period: 15s
networks:
- my-network

# phpmyadmin https://hub.docker.com/_/phpmyadmin
phpmyadmin:
image: phpmyadmin:5.2.1
container_name: phpmyadmin
hostname: phpmyadmin
ports:
- 8899:80
environment:
- PMA_HOST=mysql
- PMA_PORT=3306
- MYSQL_ROOT_PASSWORD=123qwe!@#QWE
depends_on:
mysql:
condition: service_healthy
networks:
- my-network

# Redis
redis:
image: redis:6.2
container_name: redis
restart: always
hostname: redis
privileged: true
ports:
- 16379:6379
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- my-network
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
retries: 3

# RedisAdmin https://github.com/joeferner/redis-commander
# 账密 admin/admin
redis-admin:
image: spryker/redis-commander:0.8.0
container_name: redis-admin
hostname: redis-commander
restart: always
ports:
- 8081:8081
environment:
- REDIS_HOSTS=local:redis:6379
- HTTP_USER=admin
- HTTP_PASSWORD=admin
- LANG=C.UTF-8
- LANGUAGE=C.UTF-8
- LC_ALL=C.UTF-8
networks:
- my-network
depends_on:
redis:
condition: service_healthy

networks:
my-network:
driver: bridge

4. 项目部署

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
# /usr/local/bin/docker-compose -f /docs/dev-ops/environment/environment-docker-compose-2.4.yml up -d
version: '3.8'
# docker-compose -f docker-compose-app.yml up -d
# 你需要修改system(tj)为你自身系统的仓库名
services:
# 部署前端项目
nginx:
image: nginx:1.25.1
container_name: nginx
restart: always
ports:
- '443:443'
- '80:80'
volumes:
- ./nginx/html:/usr/share/nginx/html
privileged: true
# 部署后端项目
s-pay-mall:
image: tj/s-pay-mall-mvc-app:1.0
container_name: s-pay-mall
restart: on-failure
ports:
- "8080:8080"
environment:
- TZ=PRC
- SERVER_PORT=8080
volumes:
- ./log:/data/log
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- my-network

networks:
my-network:
driver: bridge

5. 如果修改前端html

因为是简单的静态页面,无需重新构建镜像和部署。

6. 如果修改后端的文件

需要重新走一遍流程

  1. 从Maven开始,mvn clean install
  2. 用build.sh重新构建镜像,用的是Maven打出来的新jar
  3. 用docker-compose重启后端容器,到 docs/dev-ops 目录,执行:
    1
    docker-compose -f docker-compose-app.yml up -d s-pay-mall
    这一步会让s-pay-mall服务的容器基于刚才新构建的镜像重新创建并启动

7. Other

  • docker-compose up -d会根据某个docker-compose.yml(你这里是 docs/dev-ops/docker-compose-environment.yml)

    • 拉取这一组服务需要的镜像
    • 按配置创建并启动多个容器(mysql、redis、redis-admin 等)
  • 这些容器默认会被放到同一个compose项目的网络里:

    • 你自己显式定义了my-network,所有service都加入了这个网络
    • 在这个网络里可以用服务名/容器名互相访问,比如mysql:3306、redis:6379
    • 在网络之外,则只能通过IP地址+外部的映射端口号进行访问。
  • 关于项目名为什么是dev-ops?

    • 由于文件路径是 docs/dev-ops/docker-compose-environment.yml。Docker Desktop 默认会用所在目录名(这里是 dev-ops)当作这一组服务的Project name。所以dev-ops代表这一套环境。
      小型支付商城的Docker部署环境
  • 关于不同的项目之间如何隔离

    1
    2
    3
    4
    5
    6
    不同 compose 项目名 + 不同网络名(推荐)
    比如现在这一套叫 dev-ops,网络是 my-network。
    第二套用 docker-compose -p dev-ops-2 或放在另一个目录(比如 dev-ops-2),并在 networks 里写 my-network-2
    这样两套是完全网络隔离的:
    - 第一套容器只能解析 mysql(在 my-network 里)
    - 第二套容器只能解析它自己网络里的 mysql(my-network-2

小型支付商城 | {Docker构建与部署}
http://paopaotangzu.xyz/cn/docker_depoly/
作者
PROTON TANG
发布于
2026年1月19日
许可协议