Docker(四)、容器间通信

容器间通信

  • 一、容器间 Link 单向通信
    • 一)、浅实践下
    • 二)、单向通信简单了解
  • 二、基于Bridge容器间双向通信
    • 一)、网桥实现原理
    • 二)、docker实现容器间双向通信
    • 三)、浅实践下
  • 三、以上操作遇到的问题及解决方案

一、容器间 Link 单向通信

一)、浅实践下

1、模拟tomcat服务器:–name 为新产生的容器命名docker run -d --name web tomcat
2、模拟数据库 -it建立交互模式,centos镜像名称 ,即创建一个基础的centos容器【centos容器创建完以后默认是自动退出的状态,想让当前容器创建完保持运行的状态,加上-it交互模式和访问 /bin/bash ,才能在docker ps列表中看到一个稳定的database容器】
docker run -d --name database -it centos /bin/bash
通过执行 docker ps 查看运行中的容器,由此可获取容器ID
3、查询容器的元数据,可以看到两个容器的ip地址【ps:输出网络设置里的ip地址即为当前容器ip】: docker inspect 容器ID
4、进入到tomcat容器内部:docker exec -it 容器ID bash
ping 数据库容器ip # 通
ping database # 不通
exit退出,把原来的web移除docker rm -f 容器ID
5、创建tomcat容器增加参数:docker run -d --name web --link database tomcat
进入tomcat容器内部:docker exec -it web容器ID /bin/bash ,
ping数据库database:ping database # 通
至此,从tomcat到database 的单向通信完成。
6、使用场景:eg:连接数据库有个ip地址,可以环境database,便于通过 ip 进行容器间通信。

二)、单向通信简单了解

下图表述的是容器间通信的一个简图:
Docker(四)、容器间通信_第1张图片
单向通信就是两个容器间,由A向B单向建立网络连接,eg:tomcat应用单向的从mysql容器提取数据即可,mysql不需要知道tomcat容器的存在,扩展:docker容器的虚拟ip,即在每个容器创建以后,都会创建一个虚拟ip,无法从外侧直接访问,只是在docker环境中,内部彼此通信的一个标识,2个容器创建以后,彼此之间互联互通,每创建一个容器,ip地址都会变化,如果更换mysql容器,则需要重启tomcat应用并重新指向新的数据库容器,所以容器间通信不建议使用ip进行通信。

推荐方式:给两个容器建立名字,通信的以后tomcat应用不再配置要指向的ip地址,改为相应名称,便利之处就显而易见,比如更换数据库容器,无论数据库地址是什么,只需要名字对应上就可以了,对于调用方的容器不需要做调整。docker管理容器的时候,通信的时候建议通过容器名称建立连接,自动完成网络间的转发工作。

二、基于Bridge容器间双向通信

一)、网桥实现原理

可以直接看简图:
Docker(四)、容器间通信_第2张图片
网桥实现通信的原理:
docker每创建一个网桥,都会在宿主机安装一个虚拟网卡,虚拟网卡承担网关的作用,通过将现有容器和当前虚拟网卡做关联,可以实现容器间的通信,如果想和外部进行通信,所有容器发送的数据包,都需要通过虚拟网卡和宿主机的物理网卡进行地址转换,转化为物理网卡的数据包,和外网进行通讯,即容器发送的数据包通过虚拟网卡到物理网卡的地址转换,转化为物理网卡数据包进而向外网通信。
同样从外网发来的数据包先通过物理网卡的地址转换,经过虚拟网卡,再由虚拟网卡进行数据分发,以上,为网桥实现原理。

二)、docker实现容器间双向通信

Docker(四)、容器间通信_第3张图片
docker 提供一种方案:利用网桥简易实现多组容器间的双向通讯
网桥就是一个虚拟的网络桥接,是docker环境与外界通信必不可少的一个组件,从容器内部ping外部的百度网站事可以通的,因为网桥可以把从容器发送的数据包,通过网桥传送给外部的物理网卡来与互联网进行信息交互,物理网卡得到的响应数据也会随着网桥送回给指定的容器,网桥充当了docker环境和外部宿主机之间的通信员,在docker环境中要实现容器间的双向通信,网桥必不可少
网桥还有一个作用:把容器从网络环境中进行分组,将指定的容器都绑定到一个网桥,则绑定的容器之间是可以互相通信的。

三)、浅实践下

1、启动两个容器

docker run -d --name web tomcat
docker run -d -it --name database centos /bin/bash

2、查看两个运行容器的容器ID :docker ps
3、通过新建网桥,实现容器间互联互通:docker network create -d bridge my-bridge

若要实现某些容器间互联互通,需要创建一个新的网桥,
bridge:指明新建网络服务类型是一个网桥,名称为my-bridge
4、查docker网桥:docker network ls
docker network: docker网络服务的命令
ls 列出当前docker底层网络层服务明细,输出每一个docker在网络服务中都会有一个默认的网桥,承担容器和外界间通信的桥梁

5、把容器和网桥绑定:

docker network connect my-bridge web
docker network connect my-bridge database

以上两个容器都和网桥my-bridge 绑定后,两个容器之间是互联互通的,可视为绑定到同一个网桥分组。
通过创建一个新的网桥,将已有容器和网桥绑定,实现容器之间的互联互通

6、验证是否连通:

进到database容器内部,ping web容器:docker exec -it 容器ID /bin/bash
进到web容器内部,ping database容器

三、以上操作遇到的问题及解决方案

执行ping命令会报错:

bash: ping: command not found

解决:

apt-get update
apt install iputils-ping

你可能感兴趣的:(docker,docker,docker容器间通信)