Ubuntu 环境下 Docker 部署 微服务 项目完整指南
一、Docker 安装与配置
1. 系统环境准备
# 更新系统软件包sudoaptupdate# 安装必要工具sudoaptinstallapt-transport-httpscurl2. 添加 Docker 官方 GPG 密钥和仓库
# 添加 Docker 官方 GPG 密钥curl-fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg|sudoapt-keyadd-# 添加稳定版仓库sudoadd-apt-repository"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release -cs)stable"3. 安装 Docker 引擎
# 更新软件包索引sudoaptupdatesudoaptupgrade# 安装 Docker 及相关组件sudoapt-getinstalldocker-ce docker-ce-cli containerd.io# 验证安装sudodocker--versionsudodockercompose --version4. 配置 Docker 镜像加速和日志
添加/etc/docker/daemon.json文件:
sudomkdir-p /etc/dockersudotee/etc/docker/daemon.json<<EOF { "log-driver":"json-file", "log-opts":{ "max-size" :"50m","max-file":"1" }, "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me", "https://a99fyh8b.mirror.aliyuncs.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://registry.cn-hangzhou.aliyuncs.com", "https://reg-mirror.qiniu.com/", "https://docker.mirrors.ustc.edu.cn" ] } EOF5. 启动 Docker 服务
# 重启 Docker 服务sudosystemctl daemon-reloadsudosystemctl restartdocker# 设置开机自启sudosystemctlenabledocker# 将当前用户添加到 docker 组(避免每次使用 sudo)sudousermod-aGdocker$USERnewgrpdocker二、微服务解决方案
项目是用jeecgboot,参考地址:[微服务方式启动项目 | JEECG 文档中心](https://help.jeecg.com/java/springcloud/switchcloud/solve)
三、项目结构与部署配置
项目目录结构
项目根目录/ ├── docker-compose.yml # 主编排文件 ├── nacos/ # nacos服务目录 ├── system/ # 后端服务目录 ├── gateway/ # 网关服务目录 └── web/ # 前端服务目录1. Docker Compose 编排文件(docker-compose.yml)
# Docker Compose 版本version:'2'# 自定义网络配置 - 所有服务在同一网络内便于通信networks:aa-bb-network:ipam:config:-subnet:10.17.17.0/24# 子网范围:10.17.17.1 - 10.17.17.254# 服务定义services:# Redis 缓存服务 - 用于会话存储和缓存aa-bb-redis:image:redis:5.0# Redis 5.0 官方镜像ports:-16376:6379# 主机端口16376映射到容器6379端口restart:always# 总是自动重启hostname:aa-bb-redis# 容器主机名container_name:aa-bb-redis# 容器名称environment:TZ:Asia/Shanghai# 上海时区networks:aa-bb-network:ipv4_address:10.17.17.11# 固定IP地址# MySQL 数据库服务 - 主数据库存储aa-bb-mysql:image:mysql:8.0# MySQL 8.0 官方镜像ports:-11501:3306# 主机端口11501映射到容器3306端口environment:MYSQL_ROOT_PASSWORD:root# root用户密码MYSQL_ROOT_HOST:'localhost'# root访问限制TZ:Asia/Shanghai# 上海时区restart:always# 总是自动重启hostname:aa-bb-mysql# 容器主机名container_name:aa-bb-mysql# 容器名称mem_limit:2g# 内存限制2GBvolumes:-./mysql/data:/var/lib/mysql# 数据持久化存储-./mysql/logs:/var/log/mysql# 日志持久化存储command:# MySQL启动参数配置--character-set-server=utf8mb4# UTF8字符集--collation-server=utf8mb4_general_ci# 排序规则--explicit_defaults_for_timestamp=true# 时间戳默认值--lower_case_table_names=1# 表名小写不区分大小写--max_allowed_packet=128M# 最大数据包128M--default-authentication-plugin=mysql_native_password# 认证插件networks:aa-bb-network:ipv4_address:10.17.17.12# 固定IP地址# RabbitMQ 消息队列服务 - 用于异步消息处理aa-bb-rabbitmq:image:rabbitmq:latest# 最新版RabbitMQports:-5680:5672# AMQP协议端口(消息通信)-15680:15672# 管理界面端口(Web UI)restart:always# 总是自动重启container_name:aa-bb-rabbitmq# 容器名称hostname:aa-bb-rabbitmq# 容器主机名volumes:-./other:/other# 其他文件挂载environment:RABBITMQ_DEFAULT_USER:guest# 默认用户名guestRABBITMQ_DEFAULT_PASS:guest# 默认密码guestnetworks:aa-bb-network:ipv4_address:10.17.17.13# 固定IP地址# Nacos 服务注册与发现中心 - 微服务核心组件aa-bb-nacos:restart:always# 总是自动重启build:context:./nacos# 从./nacos目录构建Docker镜像volumes:-./nacos:/aa-bb-nacos# 配置和日志挂载-./nacos/logs:/logs# 日志目录挂载ports:-8848:8848# Nacos控制台和管理端口container_name:aa-bb-nacos# 容器名称hostname:aa-bb-nacos# 容器主机名networks:aa-bb-network:ipv4_address:10.17.17.14# 固定IP地址# 系统服务 - 核心业务服务aa-bb-system:depends_on:-aa-bb-nacos# 依赖Nacos服务先启动build:context:./system# 从./system目录构建Docker镜像volumes:-./system:/aa-bb-system# 代码和配置挂载-./system/logs:/logs# 日志目录挂载-./upload:/upload# 文件上传目录挂载container_name:aa-bb-system# 容器名称hostname:aa-bb-system# 容器主机名restart:on-failure# 仅在失败时重启environment:-TZ=Asia/Shanghai# 上海时区networks:aa-bb-network:ipv4_address:10.17.17.30# 固定IP地址# 用户管理服务(cc) - 自定义业务模块aa-bb-cc:depends_on:-aa-bb-nacos# 依赖Nacos服务先启动build:context:./cc# 从./yh目录构建Docker镜像volumes:-./cc:/aa-bb-cc# 代码和配置挂载-./cc/logs:/logs# 日志目录挂载-./upload:/upload# 文件上传目录挂载container_name:aa-bb-cc# 容器名称hostname:aa-bb-cc# 容器主机名restart:on-failure# 仅在失败时重启environment:-TZ=Asia/Shanghai# 上海时区networks:aa-bb-network:ipv4_address:10.17.17.31# 固定IP地址# 网关服务 - API网关,统一入口aa-bb-gateway:restart:on-failure# 仅在失败时重启build:context:./gateway# 从./gateway目录构建Docker镜像volumes:-./gateway:/aa-bb-gateway# 代码和配置挂载-./gateway/logs:/logs# 日志目录挂载ports:-9999:9999# 网关服务端口depends_on:-aa-bb-nacos# 依赖Nacos服务发现-aa-bb-system# 依赖系统服务container_name:aa-bb-gateway# 容器名称hostname:aa-bb-gateway# 容器主机名networks:aa-bb-network:ipv4_address:10.17.17.15# 固定IP地址# Nginx Web服务 - 反向代理和静态文件服务aa-bb-web:image:nginx:latest# 最新版Nginxrestart:on-failure# 仅在失败时重启ports:-11500:80# 主机端口11500映射到容器80端口volumes:-./web/logs:/var/log/nginx# Nginx日志持久化-./web/conf:/etc/nginx/conf.d# Nginx配置文件目录-./web/html/dist:/var/www/html# 前端静态文件目录container_name:aa-bb-web# 容器名称hostname:aa-bb-web# 容器主机名networks:aa-bb-network:ipv4_address:10.17.17.20# 固定IP地址# 架构总结:# 1. Redis: 缓存/会话服务 (IP: 10.17.17.11, 端口: 6379)# 2. MySQL: 数据库服务 (IP: 10.17.17.12, 端口: 3306)# 3. RabbitMQ: 消息队列服务 (IP: 10.17.17.13, 端口: 5672/15672)# 4. Nacos: 服务注册中心 (IP: 10.17.17.14, 端口: 8848)# 5. Gateway: API网关 (IP: 10.17.17.15, 端口: 9999)# 6. Nginx: 前端代理 (IP: 10.17.17.20, 端口: 80)# 7. System: 系统服务 (IP: 10.17.17.30, 端口: 应用默认)# 8. cc: 用户管理服务 (IP: 10.17.17.31, 端口: 应用默认)# 所有服务在同一自定义网络内,可通过容器名或固定IP相互通信2. nacos服务目录
项目目录结构
nacos/ ├── Dockerfile # 镜像构建文件 └── boot/ # jar服务目录Dockerfile文件
FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:17-anolis MAINTAINER 11@qq.com RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime WORKDIR /aa-nacos/boot EXPOSE 8848 CMD sleep 30;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-nacos-3.9.0.jar3. system服务目录
项目目录结构
system/ ├── Dockerfile # 镜像构建文件 ├── log/ # 日志文件目录 ├── upload # 上传文件目录 └── boot/ # jar服务目录4. gateway服务目录
项目目录结构
gateway/ ├── Dockerfile # 镜像构建文件 └── boot/ # jar服务目录5. web服务目录
项目目录结构
web/ # 前端服务目录 ├── conf/ │ └── default.conf # Nginx 配置 ├── html/ │ ├── dist/ # 前端静态文件 │ └── Dockerfile # 前端镜像构建文件 └── logs/ # Nginx 日志前端 Nginx 配置(default.conf)
server { listen 80; root /var/www/html/; client_max_body_size 100M; client_body_buffer_size 100M; #解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 location / { #alias /var/www/html/; # 用于配合 browserHistory使用 try_files $uri $uri/ /index.html # 不缓存html,防止程序更新后缓存继续生效 error_page 404 /index.html; } location /jeecgboot/ { proxy_pass http://aa-bb-gateway:9999/; #这里一定要改为网关 proxy_redirect off; proxy_set_header Host yh-sy-system; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } access_log /var/log/nginx/access.log ; }前端 Dockerfile
FROM nginx:latest MAINTAINER 11@qq.com VOLUME /tmp ENV LANG en_US.UTF-8 RUN mkdir -p /var/www \ && mkdir -p /var/www/html EXPOSE 80 EXPOSE 4436. 配置完成,执行命令
dockercompose up -d四、常用运维命令
# 启动服务dockercompose up -d# 停止服务dockercompose down# 查看服务状态dockercomposeps# 查看实时日志dockercompose logs -f# 查看特定服务日志dockercompose logs -f aa-bb-system(替换服务名称)# 进入容器调试dockerexec-it aa-bb-systembash# 停止指定服务dockercompose stop aa-bb-system# 启动指定服务dockercompose start aa-bb-system