【问题标题】:Docker: link between client and serverDocker:客户端和服务器之间的链接
【发布时间】:2018-11-13 16:45:27
【问题描述】:

我正在使用 Docker 运行一个简单的 Spring 微服务项目。我有两个项目:lucky-word-client(端口 8080)和 lucky-word-server(端口 8001)。但我无法与服务器通信客户端。事实上,如果 lucky-word-client 与 lucky-word-server 通信,结果是单词“Evviva”,否则单词是“Default”。我的结果始终是“默认”,但我希望客户端与服务器通信时使用“Evviva”一词。

这是两类幸运词客户端:

package asw.springcloud.luckyword;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LuckyWordApplication {

    public static void main(String[] args) {
        SpringApplication.run(LuckyWordApplication.class, args);
    }
}


package asw.springcloud.luckyword;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Value;

@RestController
public class LuckyWordController {

    @Value("${lucky-word}") 
    private String luckyWord;

    @RequestMapping("/lucky-word")
    public String luckyWord() {
        return "The lucky word is: " + luckyWord; 
    }
}

这是lucky-word-client的application.properties文件:

# application.properties 
# parola fortunata di default (if server is not accessible)
lucky-word=Default

这是lucky-word-client的bootstrap.properties文件:

 # bootstrap.properties 
    spring.application.name=lucky-word 
    # i profili possibili sono italian e english
    spring.profiles.active=italian 
    # oppure: export SPRING_PROFILES_ACTIVE=italian 
    spring.cloud.config.uri=http://localhost:8001

这是lucky-word-client的文件Dockerfile:

FROM frolvlad/alpine-oraclejdk8 

ADD build/libs/lucky-word-client-0.0.1-SNAPSHOT.jar lucky-word-client.jar

EXPOSE 8080

ENTRYPOINT ["/usr/bin/java", "-Xmx128m", "-Xms128m"]

CMD ["-jar", "-Dspring.profiles.active=italian", "lucky-word-client.jar"]

这是lucky-word-server类:

package asw.springcloud.configserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class CommonConfigServer {

    public static void main(String[] args) {
        SpringApplication.run(CommonConfigServer.class, args);
    }
}

这是lucky-word-server的application.properties文件:

# application.yml 
---
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/..../
          searchPaths: projects/config-data
server:
  port: 8001

这是lucky-word-server的Dockerfile文件:

FROM frolvlad/alpine-oraclejdk8 

ADD build/libs/common-config-server-0.0.1-SNAPSHOT.jar common-config-server.jar

EXPOSE 8001

ENTRYPOINT ["/usr/bin/java", "-Xmx128m", "-Xms128m"]

CMD ["-jar", "common-config-server.jar"]

【问题讨论】:

标签: spring docker docker-compose dockerfile docker-swarm


【解决方案1】:

我假设你的客户端的这个配置行应该指向你的服务器:

spring.cloud.config.uri=http://localhost:8001

但是,如果您的客户端和服务器都部署为 docker 容器,则 localhost 将不起作用。

对于一个正在运行的 docker 容器,localhost 指向它自己,即容器,而不是容器运行所在的主机。它与 Spring 无关,而纯粹与 docker 网络有关。

见:https://docs.docker.com/network/

基本上,您需要将两个容器部署在同一个网络中,并将容器名称用作主机。

【讨论】:

    【解决方案2】:

    这取决于您在运行容器时使用的网络/主机模式。使用--network host,启用网络主机模式,这将使您能够使用localhost。检查this manual

    另一个选项可能是设置类似于docker-compose.yml

    version: '3.2'
    services:
      client:
        build: <PATH TO DOCKERFILE>
        ports:
          - "8080"
        networks:
          - general
      server:
        build: <PATH TO DOCKERFILE>
        ports:
          - "8001"
        networks:
          - general
    
    networks:
      general:
        driver: bridge
        ipam:
          driver: default
    

    之后,您的容器将位于同一网络上,并且可以通过以下方式连接:&lt;CONTAINER_NAME&gt;:PORT,例如客户端连接到server:8001

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 2023-03-12
      • 2011-02-10
      • 2010-12-25
      • 2017-05-25
      • 2012-04-24
      • 2019-10-20
      • 2022-11-03
      相关资源
      最近更新 更多