作业目标
- 掌握Docker对于常见微服务中间件的安装、部署、运行
- 掌握Docker对于微服务的安装,尤其是陌生的一个工程从数据库->工程->访问
工程介绍
工程结构图
技术架构图
物理部署图
环境准备
- 通过docker images、docker ps -a指令确保本地无任何镜像、运行中的容器,如有借助
- docker rmi -f 镜像,删除镜像
- docker rm -f 容器,删除容器
- mysql涉及的表结构语句,数据库:doctor_station,建表语句: 📎doctor_station.sql
- 今日所有镜像文件上传路径:/tmp/docker,需在tmp下手动创建docker文件夹
cd /tmp mkdir docker
题目一
目标
完成Docker环境下Nacos服务部署、启动、访问验证
提示
- 去dockerhub官网找到Nacos,查看拉取、启动指令,启动完成后浏览器验证
参考答案
- dockerhub查看服务拉取指令:docker pull nacos/nacos-server
- /tmp/docker路径下,执行docker pull指令
- 查看官网启动指令,并调整如下:
- 官网 Quick Start
docker run --name nacos-quick -e MODE=standalone -p 8849:8848 -d nacos/nacos-server:2.0.2
- 调整指令如下:
- 修改登录用户名:nacos,密码默认是nacos不用修改
- 修改宿主机暴露端口:8848
- 修改镜像名称:当前使用latest,不用声明
docker run --name nacos -e MODE=standalone -p 8848:8848 -d nacos/nacos-server
- 访问验证
- 用户名/密码=nacos/nacos,http://192.168.206.129:8848/nacos/#/login
题目二
目标
完成Docker环境下MySQL服务部署、启动、访问验证,并完成表结构、数据导入
提示
- 参照dockerhub官网完成mysql安装
- 本地Navicat等可视化工具连接后,完成表结构、数据的导入
参考答案
- dockerhub查看服务拉取指令:docker pull mysql
- /tmp/docker路径下,执行docker pull指令
- 官网查看启动指令,并调整如下:
- 官网 Quick Start
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
- 修改如下,并执行启动
- 修改用户名
- 修改密码
- 修改镜像名称
docker run --name root -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
- 启动后,客户端连接访问
- 注意:此时安装的latest版本比较高,部分可视化工具可能链接不是
- 导入环境准备中的表结构语句,如下:
题目三(*)
目标
完成Docker环境下耗材中心服务部署、启动、访问验证
提示
- mysql服务、nacos需更改原来的localhost为对应ip
- 需创建对应的Dockerfile、docker-compose.yml,其中docker-compose.yml不要重复定义nacos、mysql,避免重复启动
- nacos配置文件需同步过来:inventoryservice-dev.yaml
inventory: stopStartTime: 2023-10-01 23:59:59 stopEndTime: 2023-10-02 02:00:00
- 为保证访问,前期可以在docker-compose.yml中暴露此服务端口,以验证是否部署成功
- 日志查看路径:/var/lib/docker/containers/容器ID-json.log,如启动失败可以在这里查看错误原因,如我最初没有同步nacos配置文件
参考答案
- 修改application.yml、bootstrap.yml,这里更改了IP【注意你自己的需调整成自己的】
server: port: 8081 spring: application: name: inventoryservice # 库存服务 datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.206.129:3306/doctor_station?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false username: root password: root logging: level: cn.itcast: debug pattern: dateformat: MM-dd HH:mm:ss:SSS
- pom.xml增加构建信息
<build> <!-- 服务打包的最终名称 --> <finalName>inventory</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
- 执行maven-clean-package,编译打包,在target中找到上述finalName名称的jar
- 新建:Dockerfile,并与inventory.jar放在文件夹:inventory中
FROM java:8-alpine COPY ./inventory.jar /tmp/inventory.jar ENTRYPOINT java -jar /tmp/inventory.jar
- 新建:docker-compose.yml,放在文件夹:doctor-station中
version: "3.2" services: inventoryservice: build: ./inventory ports: - "8081:8081"
- 上述整体目录结构目前如下:
- doctor-station
- inventory
- Dockerfile
- inventory.jar
- docker-compose.yml
- 上传整个文件夹,到:/tmp/docker/
- 执行启动命令: docker-compose up -d
- postman请求验证:
题目四
目标
完成Docker环境下医生站部署、启动、访问验证
提示
同题目二提示
参考答案
- 修改doctor-service配置文件
- application.yml
server: port: 8088 spring: application: name: doctorservice datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.206.129:3306/doctor_station?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false username: root password: root logging: level: cn.itcast: debug pattern: dateformat: MM-dd HH:mm:ss:SSS feign: client: config: default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: BASIC # 日志级别 httpclient: enabled: true # 开启feign对HttpClient的支持 max-connections: 200 # 最大的连接数 max-connections-per-route: 50 # 每个路径的最大连接数
- bootstrap.yml
spring: application: name: doctorservice # 服务名称 profiles: active: test # 当前使用test环境 cloud: nacos: server-addr: 192.168.206.129:8848 config: file-extension: yaml # 文件后缀名
- pom文件增加构建信息,并打包
<build> <!-- 服务打包的最终名称 --> <finalName>doctor</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
- 创建Dockerfile
FROM java:8-alpine COPY ./doctor.jar /tmp/doctor.jar ENTRYPOINT java -jar /tmp/doctor.jar
- 修改docker-compose.yml,追加doctor相关信息
version: "3.2" services: doctorservice: build: ./doctor ports: - "8088:8088" inventoryservice: build: ./inventory ports: - "8081:8081"
- 上述整体目录结构目前如下:
- doctor-station
- inventory
- Dockerfile
- inventory.jar
- doctor
- Dockerfile
- doctor.jar
- docker-compose.yml
- 上传doctor到doctor-station文件夹下,重新上传:docker-compose.yml
- 停止原inventory服务:docker rm -f,并删除已有的镜像
- 执行语句重启整个微服务:docker-compose up -d。注意一定是重新构建两个才可以,否则删除镜像、容器后重新启动
- postman测试验证,启动构建完成后稍等一下再访问,可以通过查看日志是否启动成功再决定是否访问
题目五
目标
完成Docker环境下网关服务部署、启动、访问验证
提示
- 参照作业二完成部署,但是此时暴露端口只暴露网关,其余都不暴露
参考答案
- 修改配置文件:application.yml
server: port: 10010 # 网关端口 spring: application: name: gateway # 服务名称 cloud: nacos: server-addr: 192.168.206.129:8848 # nacos地址 gateway: routes: # 网关路由配置 - id: inventory-service # 路由id,自定义,只要唯一即可 uri: lb://inventoryservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称 predicates: # 路由断言,也就是判断请求是否符合路由规则的条件 - Path=/inventory/** # 这个是按照路径匹配,只要以/user/开头就符合要求 - id: doctor-service # 路由id,自定义,只要唯一即可 uri: lb://doctorservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称 predicates: # 路由断言,也就是判断请求是否符合路由规则的条件 - Path=/doctor/** # 这个是按照路径匹配,只要以/user/开头就符合要求
- pom文件增加构建信息,并打包
<build> <!-- 服务打包的最终名称 --> <finalName>gateway</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
- 创建Dockerfile
FROM java:8-alpine COPY ./gateway.jar /tmp/gateway.jar ENTRYPOINT java -jar /tmp/gateway.jar
- 修改:docker-compose.yml文件,注意端口
version: "3.2" services: doctorservice: build: ./doctor inventoryservice: build: ./inventory gateway: build: ./gateway ports: - "10010:10010"
- 上传gateway,重新上传:docker-compose.yml文件,整体结构如下
- 删除容器、镜像,并重启
- 重启:docker-compose up -d
- postman验证
- 不设置权限,403禁止访问
- 设置后访问正常