Docker网络管理

参考博客:http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=11589&highlight=docker

成都创新互联公司专注于柯桥网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供柯桥营销型网站建设,柯桥网站制作、柯桥网页设计、柯桥网站官网定制、重庆小程序开发公司服务,打造柯桥网络公司原创品牌,更为您提供柯桥网站排名全网营销落地服务。

一 四种网络模式
1.host模式  使用docker run时使用--net=host指定docker使用的网络实际上和宿主机一样在容器内看到的网卡ip是宿主机上的ip局限性例如容器开启80端口宿主机也开启80端口就会产生冲突。

[root@localhost ~]# docker run -it --rm --net=host centos_with_net_wget:daixuanlinux bash
[root@localhost /]# ifconfig
docker0: flags=4163  mtu 1500
        inet 172.17.42.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::a091:9eff:fe00:8ef8  prefixlen 64  scopeid 0x20
        ether 02:06:cb:61:4f:d6  txqueuelen 0  (Ethernet)
        RX packets 3341  bytes 213676 (208.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7699  bytes 11252108 (10.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth0: flags=4163  mtu 1500
        inet 112.65.140.132  netmask 255.255.255.248  broadcast 112.65.140.135

2.container模式  使用--net=container:container_id/container_name多个容器使用共同的网络看到的ip是一样的与510b828f4ca9的IP都是172.17.42.1

[root@localhost ~]# docker run -it --rm --net=container:510b828f4ca9 centos_with_net_wget:daixuanlinux bash
[root@localhost /]# ifconfig
docker0: flags=4163  mtu 1500
        inet 172.17.42.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::a091:9eff:fe00:8ef8  prefixlen 64  scopeid 0x20
        ether 00:00:00:00:00:00  txqueuelen 0  (Ethernet)
        RX packets 3341  bytes 213676 (208.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7699  bytes 11252108 (10.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth0: flags=4163  mtu 1500
        inet 112.65.140.132  netmask 255.255.255.248  broadcast 112.65.140.135

3.  none模式使用--net=none指定这种模式下不会配置任何网络

[root@localhost ~]# docker run -it --rm --net=none centos_with_net_wget:daixuanlinux bash
[root@6db3a6e51687 /]# ifconfig
lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@6db3a6e51687 /]# ping www.baidu.com
ping: unknown host www.baidu.com

4.  bridge模式默认模式类似vmware的nat模式,使用--net=bridge指定,默认模式不用指定,就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。同一个宿主机上的所有容器会在同一个网段下相互之间是可以通信的。

[root@localhost ~]# docker run -it --rm  centos_with_net_wget:daixuanlinux bash
[root@663660abecbb /]# ifconfig
eth0: flags=4163  mtu 1500
        inet 172.17.0.28  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:1c  prefixlen 64  scopeid 0x20
        ether 02:42:ac:11:00:1c  txqueuelen 0  (Ethernet)
        RX packets 3  bytes 238 (238.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4  bytes 328 (328.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@663660abecbb /]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.37) 56(84) bytes of data.
64 bytes from 14.215.177.37: icmp_seq=1 ttl=52 time=29.6 ms
^C64 bytes from 14.215.177.37: icmp_seq=2 ttl=52 time=29.9 ms

--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 29.616/29.792/29.969/0.246 ms
[root@663660abecbb /]# exit
exit

二 docker 网桥

配置桥接网络centos7
为了使本地网络中的机器和Docker容器更方便的通信我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现我们只要将Docker容器和宿主机的网卡桥接起来再给Docker容器配上IP就可以了。
安装pipworkgit clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
开启一个容器 docker run -itd --net=none --name aming123 centos  /bin/bash
pipework br0  aming123 172.7.15.201/24@172.7.15.107  #201为容器的ip@后面的ip为宿主机ip
brctl addif br0 eth0  #eth0为宿主机网卡这一步为把br0和eth0桥接起来
ip addr add 172.7.15.107/24 br0 #把107的ip绑定在br0上
docker exec -it aming123 /bin/bash #进去后ifconfig查看就可以看到新添加的ip

centos6:
cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0  ifcfg-br0
vi ifcfg-eth0 //增加BRIDGE=br0删除IPADDR,NETMASK,GATEWAY,DNS1
vi ifcfg-br0//修改DEVICE为br0,Type为Bridge,把eth0的网络设置设置到这里来
service network restart
安装pipwork:  git clone https://github.com/jpetazzo/pipework 
cp ~/pipework/pipework /usr/local/bin/
开启一个容器: docker run -itd --net=none --name aming123 centos  /bin/bash
rpm -Uvh rpm -Uvh https://repos.fedorapeople.org/openstack/EOL/openstack-grizzly/epel-6/iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm #不安会报错Object "netns" is unknown, try "ip help"
pipework br0  aming123 172.7.15.201/24
docker exec -it aming123 /bin/bash #进去后ifconfig查看就可以看到新添加的ip


Docker网络管理


bridge 模式是 Docker 默认的网络设置,此模式会为每一个容器分配 Network Namespace、设置 IP 等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。当 Docker server 启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配 IP 了,Docker 会从 RFC1918 所定义的私有 IP 网段中,选择一个和宿主机不同的IP地址和子网分配给 docker0,连接到 docker0 的容器就从这个子网中选择一个未占用的 IP 使用。如一般 Docker 会使用 172.17.0.0/16 这个网段,并将 172.17.42.1/16 分配给 docker0 网桥(在主机上使用 ifconfig 命令是可以看到 docker0 的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)


2.1 列出当前主机网桥

# brctl show

或者

# brctl show docker0

brctl 工具依赖bridge-utils 包


查看当前 docker0 ip

# ifconfig docker0

或者

# ip addr show docker0


自定义 docker0 网桥的网段

默认情况下 docker0 会分配172.1.42 或者192.168.42 这个网段。 
我们也可以手动更改这个网段为 192.168.10.0/24。 
要注意顺序:

# /etc/init.d/docker stop                    #停掉docker服务

# ip link set dev docker0 down               #停掉网桥docker0

# ip addr add 192.168.10.1/24 dev docker0    #给docker0添加地址

# ip addr del 192.168.42.1/24 dev docker0    #删除docker0原有的地址

# ip link set dev docker0 up                 #启动网桥docker0

# /etc/init.d/docker start                   #启动服务


自定义网桥

Docker网络管理 
Docker完成以上网络配置的过程大致是这样的: 
1. 在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。 
2. Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth75f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。 
3. 从 docker0 子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

Docker 会尝试寻找没有被主机使用的 ip 段,尽管它适用于大多数情况下,但是它不是万能的,有时候我们还是需要对 ip 进一步规划。在启动 Docker 服务的时候,使用 -b BRIDGE 或 --bridge=BRIDGE 来指定使用的网桥,需要安装 bridge-utils软件包。

这里我们新建一个网桥 br0 作为 docker 的默认网桥 基本步骤如下: 
1. 停止服务删除旧网桥 
2. 创建自定义网桥 
3. 确认新网桥并启动 
4. 配置 docker 默认网桥

停止服务删除旧网桥


  • # service docker stop

  • # ip link set dev docker0 down

  • # brctl delbr docker0

创建新网桥br0


  • # brctl addbr br0

  • # ip addr add 192.168.100.1/24 dev br0

查看确认新网桥并启动


  • # ip addr show br0 或者 brctl show br0

  • # ip link set dev br0 up

配置 docker 服务,默认连接到 网桥br0 上 .并启动docker


  • # echo 'DOCKER_OPTS="-b=br0"' >> /etc/default/docker

  • # service docker start

启动 Docker 服务。 新建一个容器,可以看到它已经桥接到了 br0 上。 
可以继续用 brctl show 命令查看桥接的信息。另外,在容器中可以使用 ip addr 和 ip route 命令来查看 IP 地址配置和路由信息。

三 外部网络访问容器
1 使用centos镜像新建一个容器,然后在该容器中安装httpd服务并启动

[root@localhost ~]# docker run -it centos_with_net_wget:daixuanlinux  bash
[root@0d76c137b3cc /]# yum install -y httpd
[root@0d76c137b3cc /]# /usr/sbin/httpd   //使用绝对路径启动httpd服务
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.29. Set the 'ServerName' direc  tive globally to suppress this message
[root@0d76c137b3cc /]# ps aux | grep httpd    //httpd服务已经启动
root        53  0.0  0.6 221852  3456 ?        Ss   05:45   0:00 /usr/sbin/httpd
apache      54  0.0  0.5 221852  2600 ?        S    05:45   0:00 /usr/sbin/httpd
apache      55  0.0  0.5 221852  2600 ?        S    05:45   0:00 /usr/sbin/httpd
apache      56  0.0  0.5 221852  2600 ?        S    05:45   0:00 /usr/sbin/httpd
apache      57  0.0  0.5 221852  2600 ?        S    05:45   0:00 /usr/sbin/httpd
apache      58  0.0  0.5 221852  2600 ?        S    05:45   0:00 /usr/sbin/httpd
root        60  0.0  0.1   8984   768 ?        S+   05:45   0:00 grep --color=auto httpd
[root@0d76c137b3cc /]# netstat -lnp | grep 80  //监听了80端口
tcp6       0      0 :::80                   :::*                    LISTEN      53/httpd
[root@0d76c137b3cc /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID  IMAGE   COMMAND   CREATED    STATUS         PORTS             NAMES
0d76c137b3cc  centos_with_net_wget:daixuanlinux "bash"  14 minutes ago  Exited (130) About a minute ago   compassionate_goodall

2 把该容器导成一个新的镜像centos_with_httpd

[root@localhost ~]# docker commit -m "centos_with_httpd" -a "daixuan" 0d76c137b3cc centos_with_httpd
9fa4d394e3b6855a9c395d8313c43945fb0c0b8ce8ac99b4c5c20e831df672c4
[root@localhost ~]# docker p_w_picpaths
REPOSITORY      TAG  IMAGE ID  CREATED    VIRTUAL SIZE
centos_with_httpd latest 9fa4d394e3b6 52 seconds ago   337.8 MB

3 再使用新镜像创建容器并指定端口映射,网络的映射是在启动容器的过程中实现的

docker run -itd -p 5123:80 centos_with_httpd:latest bash  //-p 可以指定端口映射本例中将容器的80端口映射为本地的5123端口

docker exec -it container_id  bash 

启动httpd   httpd -k start  或者使用绝对路径启动/usr/sbin/httpd
编辑1.html vi /var/www/html/1.html  随便写点东西例如daixuanlinux.com

退出该容器exit
测试 curl 127.0.0.1:5123/1.html 

[root@localhost ~]# docker run -itd -p 5123:80 centos_with_httpd:latest bash
754edd8655b86715e2f7b75db4f8503370960974b415ae6871f69f8c5bc2b12f
[root@localhost ~]# docker exec -it 754edd865 bash
[root@754edd8655b8 /]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
[root@754edd8655b8 /]# /usr/sbin/httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.30. Set the 'ServerName' directive globally to suppress this message
[root@754edd8655b8 /]# ps aux | grep httpd
root        29  0.0  0.6 221852  3436 ?        Ss   06:00   0:00 /usr/sbin/httpd
apache      30  0.0  0.5 221852  2600 ?        S    06:00   0:00 /usr/sbin/httpd
apache      31  0.0  0.5 221852  2600 ?        S    06:00   0:00 /usr/sbin/httpd
apache      32  0.0  0.5 221852  2600 ?        S    06:00   0:00 /usr/sbin/httpd
apache      33  0.0  0.5 221852  2600 ?        S    06:00   0:00
/usr/sbin/httpd
apache      34  0.0  0.5 221852  2600 ?        S    06:00   0:00 /usr/sbin/httpd
root        36  0.0  0.1   8984   772 ?        S+   06:00   0:00 grep --color=auto httpd

[root@754edd8655b8 /]# vi /var/www/html/1.html
添加:daixuanlinux.com
[root@754edd8655b8 /]# curl localhost/1.html
daixuanlinux.com
[root@754edd8655b8 /]# ^C
[root@754edd8655b8 /]# exit
exit
[root@localhost ~]# curl 112.65.140.132:5123/1.html //外部访问5123转到访问容器的80端口
daixuanlinux.com
[root@localhost ~]# docker ps  //可以看到转换规则:5123->80
CONTAINER ID   IMAGE      COMMAND    CREATED      STATUS      PORTS   NAMES
754edd8655b8  centos_with_httpd:latest  "bash"    9 minutes ago    Up 9 minutes   0.0.0.0:5123->80/tcp   mad_goodall

四 容器互联
下载一个MySQL镜像
docker pull mysql
新建一个容器命名为dbserver
docker run -it -d -p 13306:3306 --name dbserver mysql bash

在新建一个web容器并和db互联
docker run -it -d -p 12308:80 --name web --link dbserver:db centos_with_httpdbash


本文题目:Docker网络管理
本文地址:http://hbruida.cn/article/podiji.html