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)
我如何 link 我的 Spring 使用 MongoDB 容器启动应用程序容器?
Spring 启动应用正在使用默认连接到 localhost:27017.
你应该使用 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)