问题一: 利用 docker-compose 的服务编排能力,来实现对多服务的批量化处理
问题二: 利用 docker-compose 的 depends_on 属性,来设置依赖服务,必须按依赖服务先启动,当前服务才能启动
问题三: 利用自定义网络,或者 links 属性来连接需要通信的服务
问题四: 使用数据持卷来进行持久化的数据管理
docker-compose
针对每一个服务都需要编写自定义的 Dockerfile,需要对所有服务的 Dockerfile 文件进行一个统一的管理。
自定义网络,或者利用 links 属性,将两个容器连接起来,以上两种方案都可以实现基于容器名称的访问
ELK:利用 Lagstash 或 FileBeat 进行数据收集,将数据存入 ES,通过 Kibana 进行统一的数据可视化展示
应用/容器监控,健康状况、资源使用情况都需要进行监控,基于普罗米修斯实现各个类型的监控
下面是带有详细注释的 docker-compose.yml
文件,每个部分的注释直接写在 YAML 文件中,方便阅读和理解。
yamlversion: '2.4' # 使用 Docker Compose 文件的版本 2.4
services: # 定义所有服务
# Nacos 服务
trip-nacos:
container_name: trip-nacos # 指定容器名称为 trip-nacos
image: nacos/nacos-server # 使用官方 Nacos 镜像
build:
context: ./nacos # 构建上下文为本地 nacos 目录
environment:
- MODE=standalone # 环境变量,设置 Nacos 以单机模式运行
volumes:
- ./nacos/logs/:/home/nacos/logs # 将主机的日志目录挂载到容器中
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties # 挂载自定义配置文件
ports:
- "8848:8848" # 映射 Nacos 默认的 8848 端口,用于服务注册
- "9848:9848" # 用于 Nacos 服务监控
- "9849:9849" # 用于 Nacos RPC 通信
depends_on:
- trip-mysql # Nacos 依赖 MySQL 服务,确保 MySQL 在 Nacos 之前启动
# MySQL 数据库服务
trip-mysql:
container_name: trip-mysql # 指定容器名称为 trip-mysql
image: mysql:5.7 # 使用官方 MySQL 5.7 镜像
build:
context: ./mysql # 构建上下文为本地 mysql 目录
ports:
- "3306:3306" # 映射 MySQL 默认的 3306 端口,用于数据库访问
volumes:
- ./mysql/conf:/etc/mysql/conf.d # 挂载自定义 MySQL 配置目录
- ./mysql/logs:/logs # 挂载日志目录以持久化日志数据
- ./mysql/data:/var/lib/mysql # 持久化数据库数据到主机
command: [
'mysqld', # 启动 MySQL 服务
'--innodb-buffer-pool-size=80M', # 设置 InnoDB 缓冲池大小为 80M
'--character-set-server=utf8mb4', # 使用 UTF-8 字符集
'--collation-server=utf8mb4_unicode_ci', # 设置字符排序规则
'--default-time-zone=+8:00', # 设置默认时区为东八区
'--lower-case-table-names=1' # 表名不区分大小写
]
environment:
MYSQL_DATABASE: 'trip-cloud' # 设置数据库名称为 trip-cloud
MYSQL_ROOT_PASSWORD: 'admin' # 设置 root 用户密码为 admin
# Redis 缓存服务
trip-redis:
container_name: trip-redis # 指定容器名称为 trip-redis
image: redis # 使用官方 Redis 镜像
build:
context: ./redis # 构建上下文为本地 redis 目录
ports:
- "6379:6379" # 映射 Redis 默认的 6379 端口
volumes:
- ./redis/conf/redis.conf:/home/trip/redis/redis.conf # 挂载自定义 Redis 配置文件
- ./redis/data:/data # 持久化 Redis 数据到主机
command: redis-server /home/trip/redis/redis.conf # 通过自定义配置文件启动 Redis 服务
# Website 服务 (Nginx)
trip-website:
container_name: trip-website # 指定容器名称为 trip-website
image: nginx # 使用官方 Nginx 镜像
build:
context: ./website # 构建上下文为本地 website 目录
ports:
- "80:80" # 映射 Nginx 默认的 80 端口,用于网站访问
volumes:
- ./website/html/dist:/home/trip/projects/trip-ui # 挂载静态网站资源目录
- ./website/conf/nginx.conf:/etc/nginx/nginx.conf # 挂载自定义 Nginx 配置文件
- ./website/logs:/var/log/nginx # 持久化 Nginx 日志
- ./website/conf.d:/etc/nginx/conf.d # 挂载自定义的 Nginx 虚拟主机配置
depends_on:
- trip-gateway # 确保网关服务在 Website 服务之前启动
links:
- trip-gateway # 通过链接的方式连接网关服务,方便通信
# Gateway 网关服务
trip-gateway:
container_name: trip-gateway # 指定容器名称为 trip-gateway
build:
context: ./trip/gateway # 构建上下文为本地 gateway 目录
dockerfile: dockerfile # 使用指定的 Dockerfile 构建镜像
ports:
- "9000:9000" # 映射网关服务的 9000 端口
depends_on:
- trip-redis # 确保 Redis 服务在网关服务之前启动
links:
- trip-redis # 通过链接的方式连接 Redis 服务
# User 用户服务
trip-user:
container_name: trip-user # 指定容器名称为 trip-user
build:
context: ./trip/user # 构建上下文为本地 user 目录
dockerfile: dockerfile # 使用指定的 Dockerfile 构建镜像
ports:
- "9200:9200" # 映射用户服务的 9200 端口
depends_on:
- trip-redis # 确保 Redis 服务在用户服务之前启动
- trip-mysql # 确保 MySQL 服务在用户服务之前启动
links:
- trip-redis # 通过链接的方式连接 Redis 服务
- trip-mysql # 通过链接的方式连接 MySQL 服务
# Article 文章服务
trip-article:
container_name: trip-article # 指定容器名称为 trip-article
build:
context: ./trip/article # 构建上下文为本地 article 目录
dockerfile: dockerfile # 使用指定的 Dockerfile 构建镜像
ports:
- "8060:8060" # 映射文章服务的 8060 端口
depends_on:
- trip-redis # 确保 Redis 服务在文章服务之前启动
- trip-mysql # 确保 MySQL 服务在文章服务之前启动
- trip-user # 确保用户服务在文章服务之前启动
links:
- trip-redis # 通过链接的方式连接 Redis 服务
- trip-mysql # 通过链接的方式连接 MySQL 服务
- trip-user # 通过链接的方式连接用户服务
在这个 docker-compose.yml
文件中,每个服务都清楚地定义了其依赖关系、端口映射、数据持久化等重要配置。通过使用 depends_on
属性,保证了服务按依赖关系正确启动;通过使用 links
属性,确保了服务之间的网络连接。各个服务的数据持久化配置保证了数据的安全性和一致性。
此配置适合用于微服务架构,且能够处理复杂的服务依赖和网络需求。
shell#!/bin/sh # 指定解释器为 sh
# 第一部分:拷贝 SQL 文件到 MySQL 容器挂载的目录
echo "begin copy sql "
cp ../profiles/sql/wolf2w-trip-travel.sql ./mysql/db # 复制旅行相关的 SQL 文件到 MySQL 数据库目录
cp ../profiles/sql/wolf2w-trip-user.sql ./mysql/db # 复制用户相关的 SQL 文件到 MySQL 数据库目录
cp ../profiles/sql/trip-config.sql ./mysql/db # 复制配置相关的 SQL 文件到 MySQL 数据库目录
# 第二部分:拷贝前端静态文件到 Nginx 容器挂载的目录
echo "begin copy html "
cp -r ../trip-website-ui/** ./website/html/dist # 递归复制前端网站的所有静态资源到 Nginx 的 dist 目录
# 第三部分:拷贝 Java JAR 文件到各个服务的目录
echo "begin copy trip-gateway "
cp ../trip-api-gateway/target/trip-gateway.jar ./trip/gateway/jar # 复制网关服务的 JAR 文件到网关服务的 JAR 目录
echo "begin copy trip-user "
cp ../trip-servers/trip-user-server/target/trip-user.jar ./trip/user/jar # 复制用户服务的 JAR 文件到用户服务的 JAR 目录
echo "begin copy trip-article "
cp ../trip-servers/trip-travel-server/target/trip-article.jar ./trip/article/jar # 复制文章服务的 JAR 文件到文章服务的 JAR 目录
shell
#!/bin/sh # 再次指定解释器为 sh
# 使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [base|services|stop|rm]" # 打印使用说明,提示可用的命令参数
exit 1 # 退出脚本
}
# 启动基础环境(必须)
base(){
docker-compose up -d trip-mysql trip-redis trip-nacos # 以后台模式启动基础服务:MySQL、Redis 和 Nacos
}
# 启动程序模块(必须)
services(){
docker-compose up -d trip-website trip-gateway trip-user trip-article # 以后台模式启动业务服务:Website、Gateway、User 和 Article
}
# 关闭所有环境/模块
stop(){
docker-compose stop # 停止所有 Docker Compose 管理的服务
}
# 删除所有环境/模块
rm(){
docker-compose rm # 删除所有已停止的服务容器
}
# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in # 根据传入的参数执行对应的函数
"base")
base # 如果参数是 "base",则调用 base 函数
;;
"services")
services # 如果参数是 "services",则调用 services 函数
;;
"stop")
stop # 如果参数是 "stop",则调用 stop 函数
;;
"rm")
rm # 如果参数是 "rm",则调用 rm 函数
;;
*)
usage # 如果参数不匹配,调用 usage 函数
;;
esac # 结束 case 语句
本文作者:GYC
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!