Docker:将 Spring 引导容器与 Mongo 数据库容器链接

Docker: Linking Spring Boot container with Mongo DB container

我如何 link 我的 Spring 使用 MongoDB 容器启动应用程序容器?
Spring 启动应用正在使用默认连接到 localhost:27017.

的 MongoDB 资源库

你应该使用 container linking. From the docs:

When you set up a link, you create a conduit between a source container and a recipient container. The recipient can then access select data about the source

When two containers are linked, Docker will set some environment variables in the target container to enable programmatic discovery of information related to the source container.

基本上就是下面这个意思

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

查看 how to link containers 上的这篇文章了解更多信息。

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

我确实选择了一个解决方法,使用 mongodb 容器和 spring 应用程序容器,我必须设置 mongo 容器主机和端口到 spring 应用程序将应用程序容器创建为容器 ENV 变量时的容器,如下所示

Mongo 容器

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

SpringBoot 应用容器

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

Mongo配置

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;
    }
}

@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

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

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

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

现在,对于此处问题中的问题陈述,最简单的方法是在启动 mongo & spring-boot-app 容器时使用 --network=host。

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 从图像启动应用程序使用 :-

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

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