Docker:将Spring Boot容器与Mongodb容器链接

时间:2015-01-16 16:54:20

标签: java spring mongodb docker

如何将Spring Boot应用程序容器与MongoDB容器链接?
Spring Boot应用程序正在使用MongoDBRespository,它默认连接到localhost:27017。

4 个答案:

答案 0 :(得分:2)

您应该使用container linking。来自docs

  

设置链接时,可以在源容器和收件人容器之间创建管道。然后,收件人可以访问有关源

的选择数据      

当链接两个容器时,Docker将在目标容器中设置一些环境变量,以便能够以编程方式发现与源容器相关的信息。

基本上这意味着以下

  • 您的MongoDB容器应该公开一些端口(通过Dockerfile中的EXPOSE条目或通过-p选项docker run)。
  • 应该使用指向MongoDB容器的--link选项启动Spring Boot容器。
  • MongoDBRepository应配置为使用链接在环境变量中提供的地址。

有关详细信息,请查看how to link containers上的这篇文章。

答案 1 :(得分:2)

@Himanshu Yadav,你可以尝试这个资源。它确实解决了我的问题。 :-)在这方面有一个完整的教程

https://www.jiwhiz.com/blogs/Spring_Boot_Docker_MySQL_Demo

引用

docker run -p 8080:8080 --name demo-app --link demo-mysql:mysql -d jiwhiz/spring-boot-docker-mysql

答案 2 :(得分:1)

我想知道你是否通过链接容器来实现这一点,它对我不起作用,尝试在我的Springboot应用程序中使用链接容器别名作为dbhost名称。我没有尝试MongoClientURI

我确实选择了使用mongodb容器和spring应用程序容器的工作,我必须设置mongo容器主机和端口以弹出应用程序容器,同时将应用程序容器创建为Containers ENV变量,如下所示

Mongo容器

docker run -d -p 27027:27017 -p 28027:28017  --name mongodb  --volumes-from dbdata iamiddy/mongodb 

SpringBoot Apps容器

docker run -d -p 8000:8080 --name AppDockerContainer 
-e db.host.name=EC2-HOSTING-MONGO-CONTAINER
-e db.host.port=DB-HOST-PORT AppDockerImage 

application.properties db.host.port=27017 db.host.name=localhost

MongoConfig

public class MongoRepositoryConfig extends AbstractMongoConfiguration { 

    @Value("${db.host.port}")
    private int port;

    @Value("${db.host.name}")
    private String host;

    @Value("${db.name}")
    private String dbname;

    @Override
    public Mongo mongo() throws Exception {
        ServerAddress serverAdress = new ServerAddress(host,port);
        Mongo mongo = new MongoClient(serverAdress);
        mongo.setWriteConcern(WriteConcern.ACKNOWLEDGED);
        return mongo;
    }

    public @Bean MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongo(), getDatabaseName());
    }

    @Override
    protected String getDatabaseName() {
        return dbname;
    }
}

答案 3 :(得分:1)

由于docker links现已弃用,可以使用用户定义的网络实现容器之间的通信。

参考Docker Networking,docker有3种不同类型的网络 - 网桥,主机,网络。使用docker network ls,您可以列出当前定义的所有网络。默认情况下,对于预先配置的每种类型,docker附带1。

在运行容器时,可以指定进程将加入的网络(--network=abcd) - 默认情况下,它是bridge类型的docker0。

现在,对于问题中的问题陈述,最简单的方法是在启动mongo& amp; spring-boot-app容器。

docker run -d -P --name=my-mongo --network=host mongo:latest

然后在你的Spring启动应用程序中,你会得到这样的东西: -

spring:
  application:
    name: my-app
  data:
    mongodb:
      database: app
      host: 192.168.99.100 // your machine private ip.
      port: 27017

使用以下方法从图像运行spring boot应用程序: -

docker run -d -P --name=my-boot-app --network=host my-app-image

然后你可以使用/到达mongo&应用程序实例就好像它们没有使用docker一样运行。 (在Windows上使用docker-toolbox时,你实际上在具有不同IP的VM中运行docker - 我发现它是192.168.99.100。所以记得使用这个ip而不是你的本地ip)