前言:

虽然每个docker容器之间都能通过ip来进行互联,但当容器重新启动,ip就会被重新分配给重新启动的容器,这时同个容器由于重启导致ip不一样了,这时就会导致开发和运维的困难程度大大增加,这时候就要考虑能不能不通过ip互联,而是通过容器的名称或id来实现容器的互联呢?这样的话即使docker容器重启了,我们也能通过固定的容器名称来实现容器互联,而不再是通过变动的ip来实现容器互联。

1、Docker网络基础结构及原理

每启动一个docker容器,docker就会给每个docker容器分配一个ip(通过子网掩码把主机的ip划分成多个子网,把多个子网分配给多个docker容器,所以所有容器和主机都处于同一个网段下),docker安装后就会有一个名为docker0的网桥,docker0的默认网络模式是(bridge)桥接模式,docker容器之间的连接都通过Linux的虚拟网络技术---虚拟网线(veth-pair)来进行连接的,当容器停止或删除,对应的虚拟网线就会被收回。

2、使用参数--link实现docker容器互联(注意!!!docker容器之间能通过ip来进行互联,这里的容器互联是指通过容器id或容器名来进行容器间互联)

(1)普通的docker容器之间使用容器名称互ping,结果是ping不通的

操作过程图:

(2)使用--link参数,让centos03连接centos2

例:

#选项及解释
--itd表示容器后台启动
-P表示随机指定端口
--name="name"参数用于给容器取名字 ,用来区分容器
--link表示让centos03链接到centos02docker run -itd -P --name centos03 --link centos02 centos:7 /bin/bash

让容器centos03 ping centos02能ping通

操作过程图:

反过来让容器centos02 ping centos03结果发现不能ping通

操作过程图:

使用以下命令查看容器的元数据(容器的所有信息)li

docker inspect 容器id或容器名称

例:

docker inspect centos03

使用上述命令后可以在centos03的元数据里查看到关于link的信息并说明了容器centos02和centos03之间存在网络下的关联关系

(3)--link的原理

使用下面命令查看容器的hosts文件

docker exec -it 容器id或容器名称 cat /etc/hosts

例:

docker exec -it centos03 cat /etc/hosts

由下图可知--link能实现容器间通过容器id或容器名称来进行互联的原因是--link通过改变hosts文件来实现容器ip和容器名称、容器id的映射,从而使centos03容器直接ping centos02的容器名时能通过hosts文件映射的方式,直接ping通centos02容器

效果图:

从上述操作得知使用参数--link虽然能实现容器间通过容器id或名称进行互联,但还是有很大的局限性,所以需要使用接下来的自定义网络来实现容器间的互联

3、自定义Docker网络

(1)Docker的网络模式

#桥接(容器的默认网络模式,不支持通过容器id或容器名称来进行容器互联,虽然能通过使用--link来进行容器互联,但通过--link来实现容器互联不方便)
bridge#不配置网络
none#和宿主机共享网络
host#容器网络互联(局限性很大,使用得少)
container 

(2)指定网络模式来启动容器

例:

而通过--net bridge指定容器的网络模式来启动的容器,该容器的docker0的网络模式就是bridge模式

#选项及解释
--itd表示容器后台启动
-P表示随机指定端口
--name="name"参数用于给容器取名字 ,用来区分容器
--net表示使用指定的网络来启动容器docker run -d -P --name centos01 --net bridge centos:7

效果图:


注意:因为bridge为容器的默认网络模式,所以平常启动容器不指定网络模式时,容器的网络模式会默认使用bridge模式,所以以下两条启动容器的命令是等价的

docker run -d -P --name centos01 centos:7
docker run -d -P --name centos01 --net bridge centos:7

(3)使用以下命令自定义Docker网络

#选项及解释
--driver表示指定自定义网络的网络模式(bridge表示网络模式是桥接模式)
--subnet表示配置子网(/16是子网掩码中网络地址位数(0-32),网络地址位数是16的子网掩码为255.255.0.0,通过子网掩码能配置出65025(255×255)个ip地址)
--gateway表示设置网关
mynet表示该自定义网络的名称docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

效果图:

(4)使用以下命令查看docker的所有网络

docker network ls

效果图:

(5)使用以下命令查看刚刚创建的网络的元数据

docker network inspect 自定义的网络名称

例:

docker network inspect mynet

效果图:

(6)用创建的自定义网络去创建新的docker容器并让容器通过容器名来互ping,发现两容器之间能互相ping通

例:

#选项及解释
--itd表示容器后台启动
-P表示随机指定端口
--name="name"参数用于给容器取名字 ,用来区分容器
--net表示使用指定的网络来启动容器docker run -itd -P --name centos-mynet-01 --net mynet centos:7 /bin/bash
docker run -itd -P --name centos-mynet-02 --net mynet centos:7 /bin/bash

操作过程图:

(7)再次使用以下命令查看刚刚创建的网络的元数据,发现名为mynet的自定义网络下多出两个容器

docker network inspect 自定义的网络名称

例:

docker network inspect mynet

效果图:

4、网络连通

在实际开发里我们可能会创建不同的集群,例如redis集群和mysql集群,而为了集群的安全和健康的,我们创建集群的时候给集群分配的网段是不同的,但这时候我们希望两个不在同一个网段下的集群间能互相连通,所以需要用到网络连通。

(1)正常情况下两个不同网段之间的容器不能互相ping通,如下图,网段为172.17的容器和网段为192.168的容器之间不能互相ping通

操作过程图:

(2)使用以下命令连通不在同一个网段下的docker容器

docker network connect 网络名称 容器名称

例:

docker network connect mynet centos01

效果图:

(3)再次通过容器名称来互相ping,发现能互相ping通

操作过程图:

(4)使用以下命令查看名为mynet的网络的元数据,发现名为mynet的自定义网络下多出一个名为centos01的容器,也就是说把centos01容器放到了mynet网络下,所以不同网段下能互相连通

创作不易,如果这篇文章对你有帮助,希望能点个赞帮助文章的推广,如果文章有错漏,希望各位能批评指正,谢谢大家。

Docker网络---容器互联相关推荐

  1. Docker网络容器通信

    Docker网络&容器通信 docker网络 原生网络 自定义网络 docker容器通信 ip通信 Docker DNS Server joined容器 link docker跨主机通信 容器 ...

  2. Docker(4)-容器互联与端口映射

    容器互联 默认情况下,容器都是各自独立运行,与世隔绝. Docker提供了一个名为docker0的虚拟网桥,它会为每个相连的容器分配一个虚拟子网.但是尽管容器都连在同一个虚拟网桥上,如果没有额外的配置 ...

  3. docker --link容器互联及注意事项

    一.以安装 mediawiki 为例. 1.首先拉取mysql 和 mediawiki 镜像 拉取mysql(默认拉取最新) 并配置 1).容器名叫 mysql-3307 2).本地端口是3307,容 ...

  4. docker --link容器互联

    https://www.bilibili.com/video/BV1og4y1q7M4?p=35

  5. Dockerfile和Docker网络

    目录 Dockerfile 构建步骤: 基础知识: 指令 案例 制作Tomcat镜像 发布镜像 阿里云容器镜像服务 Docker网络 容器互联 自定义网络: 网络联通 实战:部署Redis集群 Spr ...

  6. Docker使用自定义网络实现容器互联

    目录 容器互联 步骤 新建网络 连接容器 测试连接 添加已经运行的容器到自定义网络 容器互联 随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来实现互联,而不是使用 ...

  7. docker 容器之间通信_四、Docker 网络原理、分类及容器互联配置

    本文是<Docker必知必会系列>第四篇,原文发布于个人博客:悟尘纪. 上一篇:Docker必知必会系列(三):基于 Docker-registry/Nexus3 搭建本地仓库 Docke ...

  8. Docker 容器互联 --link 和 自定义网络

    [Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...

  9. docker镜像了解(建立私有仓库,基于已有镜像创建,Docker的数据管理) 基于Dockerfile创建,基于本地模板创建,端口映射,容器互联)

    文章目录 docker镜像 制作镜像的过程 基于已有镜像创建 基于本地模板创建 基于Dockerfile创建 Dockerfile操作指令 Docker的数据管理 数据卷 docker的网络通信 容器 ...

最新文章

  1. 174. Dungeon Game
  2. 500 服务器内部错误
  3. TP5 实现转盘抽奖
  4. SilverLight企业应用框架设计【二】框架画面
  5. 查看git安装目录_一、Linux和Windows下安装Git
  6. git 本地分支与远程分支关联的一种方法
  7. RabbitMQ工作队列
  8. 崇天老师python123测验6_嵩天老师python123测验1: Python基本语法元素 (第1周)
  9. Mybatis_day1
  10. [论文阅读] A Late Fusion CNN for Digital Matting
  11. 李飞飞等6名华人入选ACM 2018 Fellow,无国内学者入选
  12. Win10+Anaconda创建新环境安装pytorch
  13. curl以cookie的方式登录
  14. 大数据shipin教程_大数据自学全套视频教程下载
  15. matlab prn文件,prn文件扩展名,prn文件怎么打开?
  16. 【信号与系统】(二十一)拉普拉斯变换与复频域分析——拉普拉斯变换及其性质
  17. linux程序编译过程
  18. python程序下载腾讯企业邮箱附件_python批量下载邮件附件
  19. 物联网应用技术竞赛——android笔记
  20. 带通滤波器是什么,它的原理是什么

热门文章

  1. CSS中中文字体的英文写法
  2. Maven基础(2-1):maven详解2
  3. 仿排号系统(微信小程序云开发)
  4. 14、Vue组件高级
  5. 手机号——三大运营商的号段分配
  6. Codeforces游玩攻略
  7. 文件夹共享和分享其实区别很大!
  8. 问题 D: 编程题B-向量的数量积
  9. 录屏软件CamtasiaStudio安装
  10. webdriver标签click动作失效