原创

docker 网络

docker 原生网络

docker安装时会自动创建三个网络,我们可以用docker network ls指令查看:

docker 原生网络

1、none 网络

顾名思义,none网络就是没有网络,挂在这个网络下的容器出了lo没有其他网卡,该容器处于完全封闭的状态,无法跟外界的任何容易进行通信。对于一些对安全性有较高的要求且不需要联网的应用可以通过--network=none来指定使用none网络。

2、host 网络

连接到host网络的容器会共享docker主机的网络和端口,容器中的网络配置和主机一模一样,可以通过--network=host指定使用host网络。

host网络适合对网络传输效率要求较高的场景,但是这种网络模式需要考虑端口占用的问题,docker host上已经使用的端口就不能再用了。这一点限制了host模式的使用范围。

3、bridge 网络

bridge网络模式使用的更加广泛。如果创建容器时不指定networks,容器会默认以bridge模式启动。

使用docker network inspect bridge可以查看bridge网络的子网和网关地址等配置信息。

docker run -it --name=a busybox 查看以bridge模式启动的容器内的网络配置,其ip地址172.17.0.2是docker自动分配的(docker自动分配可以避免造成端口重复占用)。

4、user-defined 网络

我们可以根据业务需要创建自己的网络。docker提供了三种网络驱动:bridge、overlay、macvlan。后两种主要是用来创建跨主机的网络,后面再研究。我们可以用bridge驱动创建类似原生的bridge网络。

例如: docker network create --driver bridge my_net

可以看出我们已经成功创建了一个网桥,可以查看下它的网络配置

172.19.0.0/16是docker自动分配的网段,我们也可以自行指定ip网段,用--subnet和--gateway参数

例如: docker network create --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2

我们可以启动一个挂在自定义网络上的容器 docker run -it --network=my_net2 --name=b busybox

该容器的ip地址依然是docker自动从subnet中分配的,我们也可以用--ip指定容器的静态ip。但是需要注意的是只有创建时指定了subnet的网络才能指定静态ip。

docker run -it --network=my_net2 --ip 172.22.16.8 --name=c busybox

我们现在有三个容器a,b,c,其中a容器挂在原生的bridge网络上,bc同挂在my_net2上,那么bc容器可以相互通信, 但是不能和a容器进行通信,我们用ping命令进行查看:

那我们有没有办法让bc也能和a容器进行通信呢?只要为a容器添加一块my_net2的网卡就行啦,通过docker network connect my_net2 cc056c2d8c9e 实现。

上图可以看出a容器有两个网卡了,bridge和my_net2,现在它就可以和bc容器进行通信了。

结论:两个容器要能通信,必须要有同属于一个网络的网卡。这样就可以通过ip进行交互。

容器间通信

容器中有三种通信方式:ip通信、docker DNS Server、joined容器。

1、ip通信

上述例子就是根据ip通信,但是通常情况下容器的ip地址为docker自动分配,要指定ip地址进行访问会比较麻烦,这种情况可以通过docker自带的DNS服务解决。

2、Docker DNS Server

例如 docker run -it --network=my_net2 --name=busybox_bridge busybox 启动的容器,可以在b容器进行ping

3、joined 容器

joined容器可以使多个容器共享同一个网络栈,共享网络配置和网卡。这些joined容器之间可以直接通过127.0.0.1进行通信。

例如创建一个和busybox_bridge容器共享的容器busybox_bridge_2:

docker run -d -it --network=container:busybox_bridge --name=busybox_bridge_2 busybox

busybox_bridge_2 和 busybox_bridge 容器的网络配置一毛一样。那么这两个容器之间可以用127.0.0.1访问彼此的服务。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nginx 常见问题记录

    官方文档指明,location if语句中只有实用return 和 rewrite指令是绝对安全的。但是如果某些情况必须使用if 语句进行条件判断怎么办呢?需要...

    CIKEY
  • Webassembly初识

    首先,它是一种解释性语言,大神最开始的设计目标用户就是“非专业编程人员和设计师”,避免了非专业人士对编译器了解的需要,解释性语言就是边解释边执行,与编译性语言的...

    CIKEY
  • Elasticsearch介绍

    Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。

    CIKEY
  • 手把手教你完成一个数据科学小项目(2):数据提取、IP查询

    本系列将全面涉及本项目从爬虫、数据提取与准备、数据异常发现与清洗、分析与可视化等细节,并将代码统一开源在GitHub:DesertsX/gulius-proje...

    古柳_DesertsX
  • 深入浅出理解操作系统安全

    操作系统安全在计算机信息系统的整体安全性中具有至关重要的作用,没有操作系统提供的安全性,计算机业务系统的安全性是没有基础的。

    FB客服
  • 苏联曾经的AI有多强?一段几乎已被世人遗忘的往事

    现如今,阿兰·图灵、马文·明斯基、约翰·麦卡锡这些来自西方国家的计算机科学和人工智能之父的姓名即便还不是家喻户晓,但至少在相关领域内人尽皆知。但是,很少有人知道...

    机器之心
  • 01-Hello World

    python的语法逻辑完全靠缩进,建议缩进4个空格。 如果是顶级代码,那么必须顶格书写,哪怕只有一个空格也会有语法错误。 下面示例中,满足if条件要输出两行...

    凯茜的老爸
  • 剑指Offer面试题:12.在O(1)时间删除链表结点

      在单向链表中删除一个结点,最常规的做法无疑是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。这种思路由于需要顺序查找,时间复杂度自然就是...

    Edison Zhou
  • 推荐一款手机端黑科技自动化脚本

    相信大部分同学早上醒来之后,都是手动打开音乐软件,播放自己喜欢的音乐,然后手动滑动屏幕,查看今天的天气,日复一日,生活显得特别的朴实无华且枯燥

    AirPython
  • 用了多年盗版Windows的你,有没有觉得对不住微软?

    非常有意思的一个问题,对于个人用户来讲微软的系统几乎讲正版的不是很多,小打小闹的公司基本上也不会在乎版本是不是正版的,如果按照软件全部的正版的话,小公司直接运转...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券