解决Docker部署SpringBoot项目时各容器的相互调用

目录

一、项目问题场景:

二、问题分析:

三、解决各容器互相调用的办法:

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下,就可以通过容器名直接访问

1、第一步:

  创建network

docker network create testnet

# 查看
docker network ls
2、第二步:

将你需要调用的容器重新启动    --network    testnet

docker run -d -p 8848:8848 -p 9848:9848 -e MODE=standalone --name nacos01 --network testnet nacos/nacos-server

具体就是在容器运行的时候多加一个字段  

 --network    testnet
3、第三步:

简单直接,就比如你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

你可能感兴趣的:(docker,spring,boot,容器)