Docker:客户端和服务器之间的链接

时间:2018-06-04 10:59:47

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

我正在使用Docker运行一个简单的spring微服务项目。我有两个项目:lucky-word-client(在端口8080上)和lucky-word-server(在端口8001上)。但我无法与服务器通信客户端。事实上,如果幸运字客户端与幸运字服务器进行通信,则结果是单词" Evviva",否则单词是"默认"。我的结果总是"默认",但我希望与服务器通信客户端有#34; 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"]

这是幸运字服务器的类:

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"]

2 个答案:

答案 0 :(得分:2)

我假设您的客户端的此配置行应指向您的服务器:

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

但是,如果您的客户端和服务器都部署为docker容器,则localhost将无法正常工作。

对于正在运行的docker容器,localhost指向自身,容器,而不是容器运行的主机。它与Spring无关,但与docker网络无关。

请参阅:https://docs.docker.com/network/

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

答案 1 :(得分:0)

这取决于您在运行容器时使用的网络/主机模式。使用--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

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