Docker学习(八)容器间单向通讯

前言

在以前的文章中介绍的内容都是容器镜像和容器运行,没有涉及到多个容器以前通讯,若是是多个容器之间须要互相调用,如何通讯呢?

docker维护着每一个容器的元信息,能够经过IP通讯,可是在docker环境中每一个容器重启以后,容器的虚拟IP都会变更,这样的状况下咱们该如何处理? 咱们带着这两个疑问看一下今天的内容mysql

场景

若是咱们部署了一个tomcat应用,这个应用须要链接mysql数据库,这种场景下,咱们须要让tomcat能够访问mysql数据库,这就须要使两个容器之间能够通讯web

实现通讯的方法

  • [x] 在容器启动的时候,为每一个容器指定一个名字,二者通讯使用容器名称来识别对方容器
  • [x] 基于bridge实现容器间双向通讯

环境准备

  • tomcat容器sql

    • 应用名称 mywebapp
  • 数据库容器(只是为了测试,咱们使用一个centos容器模拟mysql )docker

    • 应用名 database

建立目录/usr/local/docker/communication数据库

目标:tomcat容器能够访问database容器

实现容器间的单向通讯

  • 建立 mywebapp tomcat容器
    docker run -d --name mywebapp tomcat
  • 建立 database
    docker run -d --name database -it centos7 /bin/bash
  • 查看容器运行状况
    docker ps

    此处输入图片的描述

  • 查看容器元数据 docker inspect bf7b05ce9a06

此处输入图片的描述

NetworkSettings中的属性IPAddress能够看到容器的虚拟IP地址 172.17.0.3centos

  • 进入mywebapp容器

docker exec -it 7e631f5cf4b3 /bin/bash
mywebapp 容器中执行ping 172.17.0.3 能够正常访问database容器,说明IP访问自然互通的tomcat

此处输入图片的描述

可是 ping database 是不通的,由于咱们没有进行网络方面的配置

此处输入图片的描述

  • 退出容器,移除mywebapp

docker rm 7e631f5cf4b3 -f bash

此处输入图片的描述

  • 从新启动容器mywebapp时增长一个参数 -link 启动容器

docker run -d --name mywebapp --link database tomcat网络

此处输入图片的描述

  • 进入容器内部

docker ps
docker exec -it 0c435a5112c4 /bin/bashapp

此处输入图片的描述

> 执行ping database 是能够访问通的,这样就经过link 实现了容器间的单向通讯,在mywebapp中链接数据库时,使用database这个容器名便可,只要容器名称不变,就能够访问到

使用网桥实现双向通讯

经过link能够实现单向经过,固然 也能够实现双向经过,可是配置会比较麻烦,当应用集群过大的时候,工做量太大,其实咱们可使用网桥实现,容器间的互相通讯

此处输入图片的描述

网桥是虚拟的网络桥接,做用是从网络层面对容器进行分组,将指定的容器都绑定到同一个网桥上,这些被绑定的容器就能够实现互相通讯

实验开始

  • 咱们先将刚才的两个容器移除,再从新建立一下这两个容器,并查看一下这两容器的状态

    docker rm -f 0c435a5112c4
    docker rm -f bf7b05ce9a06
    docker run -d --name mywebapp tomcat
    docker run -d -it --name database centos /bin/bash
    docker ps

    此处输入图片的描述

  • 查看docker的谨慎网络服务明细
    docker network ls

    此处输入图片的描述

    默认每个docker底层都会提供一个默认的网桥,承担容器与外部的通讯的职责
  • 若是要实现多个容器间的互连互通,须要新建一个网桥

docker network create -d bridge my-bridge
docker network ls

此处输入图片的描述

这样全部绑定到my-bridge上的容器,均可以互相通讯

  • 进行容器和网桥的绑定

docker network connect my-bridge mywebapp
docker network connect my-bridge database

  • 咱们验证一下
  • [x] docker ps

    此处输入图片的描述

  • [x] 进入mywebapp执行ping命令
    docker exec -it 16fbe8f31ce5 /bin/bash
    ping database

    此处输入图片的描述

  • [x] 进入database,执行ping命令
    docker exec -it 15e732e718c2 /bin/bash
    ping mywebapp

    ![此处输入图片的描述][15]

    到这里咱们已经实现了两个容器的互连互通了

总结

做为容器的互通,最核心的点就是建立一个新的网桥,而后将容器与这个网桥绑定是便可

网桥为何能够实现互联互通

每当建立一个网桥,会在宿主机上就建立一个虚拟网卡,承担了一个网关的做用,实现两个容器的互通
此处输入图片的描述

  • 虚拟网卡和宿主机的物理网卡进行通讯,将数据 包转成物理网卡的数据包发出去
  • 反之物理网卡收到的数据包,也会转换成虚拟网卡的数据 包,转发给虚拟网卡,虚拟网卡而后再转给容器

写在最后

相关文章会首发公众号,能够关注公号albk,关注后能够获取大量学习视频

指望热爱技术的你一块儿来交流,获取最新资料和学习资源,能够关注公众号albk, 我的博客 !
相关文章
相关标签/搜索