一.Docker容器的网络基础

通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务。
docker0是Linux虚拟网桥。
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 .0242ed943d02 no

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

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

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

$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 .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
CMD /bin/bash

1.允许所有容器互联

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

CONTAINER_NAME: 需要连接的容器名字

ALIAS: 在容器中连接的代号
docker -run -it --link=container01:webtest nginx
ping webtest

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

$ 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的规则链已经在第一位

重新启动容器即可

 

三.Docker容器与外部网络的连接

  • ip_forward
    --ip-forward=true
sysctl net.ipv4.conf.all.forwarding

ip_forward本身是Linux系统中的一个变量,它的值决定了系统是否会转发流量。在Docker守护进程的默认参数中也有ip_forward选项,默认值是true.

  • iptables
iptables是与linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含iptables的功能。
每一个大的方块中,就是iptables中的一个链(chain),每一个链实际上就是数据处理中的一个环节,而在每个环节中又包含了不同的操作。
 
  • 允许端口映射访问
  • 限制IP访问容器
实质都是通过iptables的规则来控制的。

Docker基本命令与使用 —— Docker容器的网络连接(四)的更多相关文章

  1. Docker容器的网络连接

    Docker容器的网络连接 Docker容器的网络连接 我们用ifconfig命令来查看网络设备 我们可以看到上面有个叫docker0的网络设备,docker守护进程就是通过docker0为docke ...

  2. Docker学习(13) Docker容器的网络连接

    Docker容器的网络连接 Docker容器的网络基础 先安装网桥管理工具 Docker容器的互联 默认 Docker容器与外部网络的连接

  3. Docker学习笔记之为容器配置网络

    0x00 概述 在互联网时代,网络已经成为绝大多数应用进行数据交换的主要通道,Docker 作为集群部署的利器,在网络支持上也下了许多功夫.功能丰富和强大,并不代表使用复杂,在 Docker 的封装下 ...

  4. Docker容器的网络连接:

    yw1989@ubuntu:~$ ifconfig docker0 Link encap:Ethernet HWaddr 02:42:97:61:42:9f inet addr:172.17.0.1 ...

  5. Docker基本命令与使用 —— Docker容器(一)

    一.容器的基本操作 1. 启动容器 docker run IMAGE [COMMAND] [ARG...] run 在新容器中执行命令 eg: docker run ubuntu echo 'Hell ...

  6. Docker 容器的网络连接 & 容器互联

    1. Docker 容器网络基础架构 Docker0 ifconfig查看到的 docker0 是linux的虚拟网桥(OSI数据链路层) docker0 地址划分: 172.17.42.1 255. ...

  7. docker 查看容器的网络连接

    #! /bin/bash echo $1 PID=$(docker inspect -f '{{.State.Pid}}' $1) nsenter -t $PID -n netstat |grep E ...

  8. Docker基本命令与使用 —— Docker镜像与仓库(二)

    一.查看和删除镜像 1.Docker Image 镜像 容器的基石 层叠的只读文件系统 联合加载(union mount) (存储位置 /var/lib/docker) docker info 2.列 ...

  9. Docker学习笔记 - Docker容器的网络基础

    一.虚拟网桥 docker0 docker0 是 linux的虚拟网桥,守护进程通过docker0给容器提供网络连接的各种服务. 网桥是数据链路层设备,通常ip地址是网络层的设置.linux的虚拟网桥 ...

随机推荐

  1. Python—列表操作

    列表 列表的使用: 列表是可变数据类型,因此列表的方法,都是直接修改列表原始值 list = ["panda","chimpanzee","zebra ...

  2. Sonya and Robots(CodeForces 1004C)

    Since Sonya is interested in robotics too, she decided to construct robots that will read and recogn ...

  3. js回顾

    回顾   js 组成部分       ECMAScript       BOM       DOM                        变量声明~~  var  变量名 =  初始化值:   ...

  4. RAID的详细配置

    一.RAID 1.RAID机制通过使用多硬盘并行工作的方式来提高硬盘的IO性能 2.RAID分为多种,称之为RAID level,RAID共有7级:RAID0~RAID6 3.常用的RAID级别有:R ...

  5. PHP输出中文乱码问题解决

    在php文件的最上面加上下面的语句: header('Content-Type: text/html; charset=utf-8');   如下图:

  6. JAVA8之函数式接口

    由于JDK8已经发布一段时间了,也开始逐渐稳定,未来使用JAVA语言开发的系统会逐渐升级到JDK8,因为为了以后工作需要,我们有必要了解JAVA8的一些新的特性.JAVA8相对JAVA7最重要的一个突 ...

  7. FCC JS基础算法题(2):Check for Palindromes(检查回文字符串)

    题目描述: 如果给定的字符串是回文,返回true,反之,返回false.如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文).注意你需要去掉 ...

  8. html 刷新重载方法汇总

    一.javascript页面刷新重载的方法: <a href="javascript:location.reload();">点击重新载入页面</a> &l ...

  9. React Native 继续学习

    下一个项目公司也打算使用react native.大致看了下原型设计,写几个小demo先试试水.特此记录下. 1.微信及朋友圈分享.QQ及朋友圈分享,微博分享,微信支付,支付宝支付. 2.导航条渐隐 ...

  10. 在linux系统安装tomcat后,bin文件下startup.sh启动不

    Linux里的tomcat下的 bin ,没法执行,   可直接到 bin 目录下 ,执行 chmod 777 *  就可以了. [srmdev@mvxl0793 bin]$ chmod 777  * ...