2019独角兽企业重金招聘Python工程师标准>>>

文章首发于公众号《程序员果果》

地址:https://mp.weixin.qq.com/s/DzF-ZwaY4QtlgM32I5wybg

一、Docker 容器的网络基础

docker0(Linux的虚拟网桥)

通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务。

[root@localhost ~]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0inet6 fe80::42:2fff:fe56:7b2e  prefixlen 64  scopeid 0x20<link>ether 02:42:2f:56:7b:2e  txqueuelen 0  (Ethernet)RX packets 27406  bytes 2657911 (2.5 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 42036  bytes 58020300 (55.3 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker守护进程就是通过docker0为docker容器提供网络连接的各种服务。docker0 就是Linux的虚拟网桥 。

OSI七层模型中的网桥:

Linux虚拟网桥的特点:

  • 可以设置IP地址
  • 相当于拥有一个隐藏的虚拟网卡

docker0的地址划分:

  • IP:172.17.42.1 子网掩码: 255.255.0.0
  • MAC: 02:42:ac:11:00:00 到 02:42:ac:11:ff:ff
  • 总共提供65534个地址

docker守护进程在一个容器启动时,实际上它要创建网络连接的两端。一端是在容器中的网络设备,而另一端是在运行docker守护进程的主机上打开一个名为veth*的一个接口,用来实现docker这个网桥与容器的网络通信。

下面我们看一下实际的过程: 需要查看网桥,需要linux的网桥管理程序,在Ubuntu中通过 apt-get install bridge-utils。

$ sudo brctl show
bridge name    bridge id              STP    enabled    interfaces
docker0        8000.0242ed943d02      no

运行一个docker容器,在容器中查看它的网络设备(如果没有ifconfig命令,通过apt-get install -y net-tools)。

root@b2a3136f5425:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:145 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:184985 (184.9 KB) TX bytes:4758 (4.7 KB)lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

docker已经自动创建了eth0的网卡,注意观察ip地址和mac地址。不要退出容器,再运行如下查看网桥的状态。

$ sudo brctl show
bridge name    bridge id           STP    enabled    interfaces
docker0    8000.0242ed943d02       no                veth95521e6

我们看到在interface中多了一个veth*的这样一个接口。通过ifconfig命令同样可以看到这个网络接口。

自定义 docker0

  • 修改docker0默认分配的ip地址
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

修改完后,重启docker服务 sudo service docker restart. 新运行的容器地址就变成了新的ip地址了。

  • 添加虚拟网桥
sudo brctl addbr br0
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

更改docker守护进程的启动配置:

vim /etc/default/docker 中添加 DOCKER_OPS的值 -b=br0.

重启docker服务即可。

二、Docker 容器的互联

用于测试的Docker镜像 Dockerfile:

FROM ubuntu:14.04
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE 80
CMD /bin/bash

1. 允许所有容器互联

在同一宿主机下,docker的容器是通过虚拟网桥来进行连接的。那么在默认情况下,在同一宿主机中运行的容器都是可以互相连接的。
--icc=true 默认
容器的ip地址实际上是一个不可靠的连接,因为它会随着容器的启动而改变

docker run --link=容器名:别名

查看在容器中产生的哪些影响

$ env

查看环境变量,可以看到大量以WEBTEST*开头的环境变量,这些环境变量是在容器启动时,由docker添加的。我们还可以查看在/ect/host文件,这里添加了webtest的地址映射。当docker重启启动容器时 /ect/host所对应的ip地址发生了变化。也就是说, 针对于指定了link选项的容器,在启动时docker会自动修改ip地址和我们指定的别名之间的映射 。环境变量也会做出相应的改变。

2. 拒绝所有容器间互联

Docker守护进程的启动选项
--icc=false

修改vim /etc/default/docker,在末尾添加配置 DOCKER_OPTS="--icc=false"。

需要重启docker的服务 sudo service docker restart.即使是link也ping不通。

3. 允许特定容器间的连接

Docker守护进程的启动选项
--icc=false --iptables=true
--link 在容器启动时添加link
docker利用iptables中的机制,在icc=false时,阻断所有的docker容器间的访问,仅仅运行利用link选项配置的容器进行相互的访问。
注: 如果出现ping不通的情况,可能为iptables的问题(DROP规则在docker之前了)。

sudo iptables -L -n    查看iptables规则的情况
sudo iptables -F    清空iptables规则设置
sudo service docker restart 重新启用docker的服务
sudo iptables -L -n 再来查看iptables的设置,docker的规则链已经在第一位

重新启动容器即可。

关注我

欢迎扫码或微信搜索公众号《程序员果果》关注我,关注有惊喜~

转载于:https://my.oschina.net/u/2367201/blog/3056331

Docker 容器的网络连接相关推荐

  1. docker server 容器连接sql_Docker 容器的网络连接

    文章首发于公众号<程序员果果> 地址:https://mp.weixin.qq.com/s/DzF-ZwaY4QtlgM32I5wybg 一.Docker 容器的网络基础 docker0( ...

  2. docker容器的网络配置,允许docker可以被宿主机以外的其它主机访问以及局域网内可以直接访问docker容器ip

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信. 一.端口映射(局域网,外网 ...

  3. 9、docker 容器的ssh连接

    1.进入容器 nvidia-docker run -it --mount source=my-vol,target=/home/data 49b48d227d6e /bin/bash 2.进入容器后, ...

  4. Docker容器之网络模式

    目录 一.Docker网络实现原理 二.Docker的网络模式 1.Host模式 2.Container模式 3.None模式 4.bridge模式 三.自定义网络 1.查看网络模式列表 2.查看容器 ...

  5. Docker容器之网络详解

    目录 前言 一.网络模式 1.Bridge模式 2.Container模式 3.Host模式 4.None模式 5.overlay模式 二.自定义网络 三.暴露端口 四.Docker 数据卷和数据卷容 ...

  6. docker容器配置网络流量测试

    第一步 运行一个镜像: docker run -itd [REPOSITORY]:[TAG] /bin/bash 第二步 进入此镜像的容器 docker exec -ti [NAMES] /bin/b ...

  7. Docker 学习4 Docker容器虚拟化网络概述

    一.docker 虚拟化网络概述 1.OVS: OpenVSwitch,不仅能模拟二层网络,还能模拟三层网络,或者VLAN,VXLAN,流控 SDN软件定义网络技术等. 2.overlay netwo ...

  8. 设置 docker容器 禁用网络

    如果打算完全禁用容器网络栈,可以通过在启动容器时指定 --network none 标志实现,这样在容器内部只有loopback网络设备被创建.命令如下. 第二个命令没有返结果,因为没有路由被创建. ...

  9. docker容器虚拟化网络概述

    6种名称空间:UTS,User,Mount,IPC,Pid,Net docker 安装完之后默认提供三种网络 这里的bridge就表示桥接网络,并不是物理桥而是Net桥. 意思就是它的本机之上自动创建 ...

最新文章

  1. C++:多线程中的小白(2)线程启动、结束、创建线程、join、detach
  2. CIO时代学院院长姚乐:传统行业遇上大数据 拥抱智能化未来
  3. NDK编译生成so文件
  4. python caffe 在师兄的代码上修改成自己风格的代码
  5. Javascript中的陷阱大集合【译】
  6. SQL Server:向 SQL Server 自增字段插入值 (转)
  7. 2--mkdir命令
  8. VMweare 安装 Kali Linux 系统
  9. react hooks_如何破坏React Hooks的基础
  10. java类注解是否可以通过实现接口或继承父类的方式获得
  11. [下载]Internet Explorer 9 预览版
  12. C++/QT控制通过VISA控制硬件设备,超级容易学会的控制硬件方法
  13. VC++ 源码实现通达信公式管理器
  14. itextpdf 中文字体设置
  15. 下单账号与支付账号不一致_如何申请企业支付宝账号
  16. 鼠标点计算机再点网络也是选定,鼠标左键单击变双击,点一下变两下是什么原因?...
  17. php原生代码实现短信验证码注册业务,流程详解附demo
  18. 射频信号采集记录回放系统
  19. 大数据的价值,主要体现在哪几方面?
  20. 数据禾|长江经济带主要城市坡度数据

热门文章

  1. 基于OSS存储搭建Hadoop集群
  2. Java设计模式圣经连载(05)-代理模式
  3. COM如何区分套间线程(apartment thread)和自由线程(free thread)
  4. 遗传算法来控制进入(一)
  5. [Tool] 使用CodeMaid自動程式排版 - 摘自网络
  6. [转]数据可视化:基本图表
  7. Install pysnmp for django
  8. silverlight RadGridView总结二(转载)
  9. ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
  10. SQL教学思路《图书管理系统》习题二:插入数据