docker容器间的通信【连接MongoDB数据库】

官方文档参考地址1、docker官方文档 2、hub.docker中mongo镜像

最近全面转型在docker容器中进行开发,但开发时遇见以下问题——“数据库 将在哪里运行?安装在同一个容器中还是单独运行?” 一般来说,每个容器都应该做一件事,并且做好。针对上面遇到的问题,来解决docker多容器连接。【官方解释】

默认情况下,容器是独立运行的,并且对同一台机器上的其他进程或容器一无所知。那么,我们如何让一个容器与另一个容器通信呢?答案是网络(network)

接下来我们便准备容器之间需要的条件。

1、创建network

docker network create todo-mongo

2、准备MongoDB数据库容器

如果想要本地连接docker下的mongodb数据库。可参考Docker连接MongoDB数据库。但现在是容器之间的通信,故需要以下配置。

创建容器

docker run -d --network toto-mongo -p 27066:27017 --name some-mongo -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo
-i 交互式操作。
-t 终端。
-d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
--network toto-mongo  网络(network)的名称
-p 27066:27017  #端口映射  27066:如果希望本地能访问数据数据时的端口号 27017:mongodb内部端口默认都是27017
--name some-mongo 容器的名称
-v C:\Users\12241\OneDrive\mogodata\data  #mongodb数据持久化存放的位置
/data/db #mongodb容器内部的数据目录 不用修改
-e 设置环境变量
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin 连接mongodb的用户名
-e MONGO_INITDB_ROOT_PASSWORD=secret   连接mongodb的密码
mongo:镜像名称

如果没有拉取mongo镜像,会自动拉取mongo镜像。

3、准备另一个容器用于连接MongoDB

本例中以python程序测试连接另一个容器的数据库。

创建一个容器

docker run -itd --network todo-mongo --name testmongo python:3.9.12 /bin/bash
-i 交互式操作。
-t 终端。
-d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
--network toto-mongo  网络(network)的名称
--name 容器的名称
python:3.9.12: python镜像

当然也可以使用 -v 将容器挂载到本地

设置容器自动启动,每次就不用手动启动数据库容器啦 (可选设置,看自己需求)

docker update --restart=always <CONTAINER ID>

4、 测试

经过前3步两个容器之间已经能通信了。为了确保通信是否成功,我们需要验证一下。

使用vscode进入第三步创建的容器,新建一个test.py文件用来测试能否连接mongodb数据库。代码如下:

#test.py
import pymongo
 
myclient = pymongo.MongoClient("mongodb://mongoadmin:secret@172.24.0.1:27066/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" }
 
x = mycol.insert_one(mydict) 
print(x)
print(x)

输出:

docker nacos 连接数据库 docker如何连接外面数据库_容器

进入本地的客户端,可以看到数据以存到了数据库。如何连接本地数据库查看[docker连接本地数据库]

docker nacos 连接数据库 docker如何连接外面数据库_容器_02

为什么test.py文件连接的容器的地址是172.24.0.1:27066,而本地连接docker中的数据库是localhost:27066呢?
其实在本节开始时就说了,容器之间是相互独立,想要容器之间相互通信,要建立网络(network),使两个容器可以相互通信。而此时网络的作用就相当于一个网关,起到两个容器之间通信。(网关可以自行百度,不做过多的介绍
)。那如何查看网络(network)的网关呢?输入如下代码:

docker network inspect todo-mongo

todo-mongo的详细信息,我们便可以查看网关的信息

docker nacos 连接数据库 docker如何连接外面数据库_docker nacos 连接数据库_03


而本地连接为什么又可以是localhost:27066呢?其实在我们第2步创建mongo容器时,对外的ip和端口是 0.0.0.0:27066,查看容器信息:

docker ps -a

docker nacos 连接数据库 docker如何连接外面数据库_docker_04


此时便可查看。当然,你不输localhost:27066也可以,你也可以输入127.0.0.2:27066也能本地连接docker容器,前提是端口号不能输错!!!!

5、结论

经过上面的步骤,即可实现容器之间的相互通信。当然也可使用docker-compose实现容器之间的通信,该方法本节中不做介绍,此外也可以参考docker的官方文档docker-compose