python|Docker容器之间通信

Docker容器间通信

Docker会为每个创建的容器自动分配一个虚拟IP,这个虚拟IP无法从容器外侧进行访问,只是Docker环境内部容器间彼此通信的标识,容器间的网络是互通互联的。

但是通过这种虚拟IP方式,进行容器间的通信,有一些局限性。因为在Docker中创建一个容器非常容易,比如说新创建的MySQL容器可能会替代之前创建的MySQL容器,而此时Tomcat服务器中配置的是之前的MySQL容器的Ip地址,因此随着新容器的创建,之前Tomcat配置的Ip地址需要不断的变更,并重启服务。当有很多Tomcat服务器同时连接MySQL数据库时,这个修改工作就是一个很大的工作量。

那这个问题如何解决呢?

容器创建时进行命名,配置连接时不在配置IP地址,而是配置容器的名字,这样以后再创建容器时,只要名字不变,就可以自动连接到新创建的容器。

举例说明:

(1)创建web服务

1
2
3
4
5
# 创建容器 运行Tomcat服务 --name 为容器命名



docker run -d --name webserver tomcat

(2)创建数据库服务(模拟)

1
docker run -d --name database -it centos /bin/bash

注:命令添加中的-d -it 和/bin/bash 是因为centos容器创建完成后,默认就进入退出状态。如果想让其保持运行状态,后台必须保持一个进程在运行,/bin/bash表示启动容器后启动bash。

(3)查看正在运行的容器

img

(4)查看连个容器的虚拟IP地址

通过docker inspect [OPTIONS] NAME|ID 命令查看

docker inspect : 获取容器/镜像的元数据。

  • 首先查看webserver容器的Ip地址
1
docker inspect webserver

img

  • 查看database容器的IP地址
1
docker inspect database

img

(5)进入webserver容器内容,测试网络

1
docker exec -it webserver /bin/bash

img

但是直接ping database却是不通的,因为我们并没有进行相应的网络设置,docker并不知道database和哪个IP是对应的,因此我们可以在创建webserver容器时指定webserver到database的单向通信。

1、容器间单向通信

移除上面创建的web容器,并重新创建

1
2
3
4
5
6
7
# 强制移除webserver容器

docker rm -f webserver

# 重新创建webserver容器 --link 要链接的容器名称 (--link 可以使新生成的容器链接到已在运行的容器)

docker run -d --name webserver --link database tomcat

img

Tomcat中的数据库连接配置文件中的url中的IP地址即可换成database

2、容器间双向通信

img

图中的网桥充当了Docker容器和外界宿主机之间的通信源,使得容器内部也可以访问互联网

例如在webserver内部可以访问百度

img

网桥也可以用于容器内部,实现容器间的双向通信。不仅如此网桥还有另一个重要作用,就是对容器从网络层面进行分组

(1)通过【docker network ls 】列出当前网络状况明细

img

上图中列出的bridge即为容器和外界通信的桥梁,如果我们想实现容器内部的双向通信也可以创建一个网桥,具体操作过程如下:

(2)创建网桥

1
2
3
4
5
6
7
# 创建网桥

docker network create -d bridge my-bridge

# 执行命令进行查看

docker network ls

img

(3)将需要通信的容器添加到网桥中

1
2
3
docker network connect my-bridge webserver

docker network connect my-bridge database

(4)进入容器进行验证是否能够互相通信

img

img

网桥的原理:创建一个网桥,就相当于在宿主机上安装了一个虚拟网卡,这个虚拟网卡也承担了网关的作用。虚拟网卡和物理网卡之间需要做地址转换

原文地址:https://www.cnblogs.com/huangjiangyong/p/14089097.html