zoukankan      html  css  js  c++  java
  • Docker学习(八)容器间单向通信

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

    前言

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

    docker维护着每个容器的元信息,可以通过IP通信,但是在docker环境中每个容器重启之后,容器的虚拟IP都会变动,这样的情况下我们该如何处理? 我们带着这两个疑问看一下今天的内容

    场景

    如果我们部署了一个tomcat应用,这个应用需要连接mysql数据库,这种场景下,我们需要让tomcat可以访问mysql数据库,这就需要使两个容器之间可以通信

    实现通信的方法

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

    环境准备

    • tomcat容器

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

      • 应用名 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.3

    • 进入mywebapp容器
      docker exec -it 7e631f5cf4b3 /bin/bash
      mywebapp 容器中执行ping 172.17.0.3 可以正常访问database容器,说明IP访问天然互通的

    此处输入图片的描述

    但是ping database 是不通的,因为我们没有进行网络方面的配置

    此处输入图片的描述

    • 退出容器,移除mywebapp
      docker rm 7e631f5cf4b3 -f

    此处输入图片的描述

    • 重新启动容器mywebapp时增加一个参数 -link 启动容器
      docker run -d --name mywebapp --link database tomcat

    此处输入图片的描述

    • 进入容器内部
      docker ps
      docker exec -it 0c435a5112c4 /bin/bash

    此处输入图片的描述

    > 执行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

      此处输入图片的描述

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

    总结

    作为容器的互通,最核心的点就是创建一个新的网桥,然后将容器与这个网桥绑定是即可
    

    网桥为什么可以实现互联互通

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

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

    写在最后

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

    期望热爱技术的你一起来交流,获取最新资料和学习资源,可以关注公众号albk, 个人博客 !

  • 相关阅读:
    拆点问题
    黑球白球
    3n+1b 备忘录方法
    实体entity、JavaBean、Model、POJO、domain的区别
    DB中的读写分离
    Jmeter干货 不常用却极其有用的几个地方
    自动化测试 自动化框架需要满足的事项
    自动化测试面试题库
    测试工程师面试准备之----测试基础
    别人的面试经历 软件测试工程师
  • 原文地址:https://www.cnblogs.com/albk/p/12219964.html
Copyright © 2011-2022 走看看