目录
一、项目问题场景:
二、问题分析:
三、解决各容器互相调用的办法:
1、第一步:
2、第二步:
3、第三步:
项目打包成jar包后,通过
Java -jar xxx.jar
可以正常连接我本地的docker容器中的其他服务,如mysql,nacos,sentinel,rabbitmq等等
但是当我将这个jar包打包成镜像部署到docker时,项目报错,提示信息大概就是,如naco连不上
这是我当时spring boot项目的yml配置文件
spring:
application:
name: mq-m
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8858
eager: true
nacos:
discovery:
namespace: public
username: nacos
password: nacos
server-addr: localhost:8848
rabbitmq:
virtual-host: /
publisher-confirm-type: correlated
publisher-returns: true
listener.:
direct:
acknowledge-mode: manual
simple:
acknowledge-mode: manual
host: 127.0.0.1
port: 5672
username: guest
password: guest
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 1234
url: jdbc:mysql://localhost:3310/damai?serverTimeZone=UTC
#使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
server:
port: 6002
因为我的nacos,mysql等服务是部署在docker的容器中的,通过端口映射到我的主机上,所以在java -jar的时候可以正常连接。
但部署到docker后,因为 容器中的ip地址 和 宿主机的ip地址 是不同的,所以当 nacos 用 localhost 时,其实对应的是 nacos容器的ip地址,所以调用 localhost 时,并不能通过 宿主机的ip地址调用8848端口映射到容器中8848端口.
Docker容器网络模式:
只要将你所需要的服务放到同一个network下,就可以通过容器名直接访问
创建network
docker network create testnet
# 查看
docker network ls
将你需要调用的容器重新启动 --network testnet
docker run -d -p 8848:8848 -p 9848:9848 -e MODE=standalone --name nacos01 --network testnet nacos/nacos-server
具体就是在容器运行的时候多加一个字段
--network testnet
简单直接,就比如你java -jar xxx .jar可以正常运行后
进入这个jar包把yml中的localhost改成对应的容器名
注意:同时端口也要改成对应容器端口,不再使用本机映射端口
修改后的yml
spring:
application:
name: mq-m
cloud:
sentinel:
transport:
port: 8719
dashboard: sentinel01:8858
eager: true
nacos:
discovery:
namespace: public
username: nacos
password: nacos
server-addr: nacos01:8848
rabbitmq:
virtual-host: /
publisher-confirm-type: correlated
publisher-returns: true
listener.:
direct:
acknowledge-mode: manual
simple:
acknowledge-mode: manual
host: rabbitmq01
port: 5672
username: guest
password: guest
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 1234
url: jdbc:mysql://mysql01:3306/damai?serverTimeZone=UTC
#使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
server:
port: 6002
# # rabbitmq
# # 配置虚拟机
# spring.rabbitmq.virtual-host=/
# # 开启消息确认机制 confirm 异步
# spring.rabbitmq.publisher-confirm-type=correlated
# # 之前的旧版本 开启消息确认机制的方式
# # spring.rabbitmq.publisher-confirms=true
# # 开启return机制
# spring.rabbitmq.publisher-returns=true
# # 消息开启手动确认
# spring.rabbitmq.listener.direct.acknowledge-mode=manual
# spring.rabbitmq.listener.simple.acknowledge-mode=manual
# spring.rabbitmq.host=127.0.0.1
# spring.rabbitmq.port=5672
# spring.rabbitmq.username=admin
# spring.rabbitmq.password=123456