Docker-NetWork由浅入深

认识网络的7层模型

容器访问的原理

  • Linux IP信息过滤原理
  • Docker主要通过netfilter、iptables来实现网络通信

netfilter组件是Linux内核中集成的信息包过滤的系统,它维护一个信息包过滤的表,这个表用于控制信息包过滤处理的规则集合,然而iptables只是一个在用户空间的工具,用于增删改查表的过滤规则。

docker的命名空间

1.创建两台docker容器(test,test2)

[root@docker ~]# docker run -d --name test2 busybox /bin/sh -c "while true;do sleep 3600;done"
[root@docker ~]# docker run -d --name test busybox

2.主机创建link

[root@docker ~]# ip link add veth-test type veth peer name veth-test2       #创建link并且相互关联
[root@docker ~]# ip llink|tail -2 
    71: veth-test2@veth-test: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
     link/ether 4e:d1:6b:a5:5d:29 brd ff:ff:ff:ff:ff:ff
    72: veth-test@veth-test2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether 2a:56:db:c4:99:b3 brd ff:ff:ff:ff:ff:ff

3.关联容器(test,test2相同)

[root@docker ~]# ip link set veth-test netns test       #将真机生成的加入容器test中
[root@docker ~]# ip netns exec ip a     #已经添加进入容器中

4.给两个新的网卡添加IP地址

[root@docker ~]# ip netns exec test ip addr add 192.168.1.1/24 dev veth-test
[root@docker ~]# ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2

5.启动网卡

[root@docker ~]# ip netns exec test ip link set dev veth-test up
[root@docker ~]# ip netns exec test2 ip link set dev veth-test2 up

6.查看并且测试

[root@docker ~]#ip netns exec test ip a

link的作用

例如在创建test时候link test相当于直接给tset2加上了一个DNS

例子:

docker rm test2
docker run -d --name test2 --link test busybox  /bin/sh -c  "while true;do sleep 3600;done"
docker exec test2 ping -c test      #可以被PING通

docker支持的网络模式

  • Bridge

默认网络,Docker启动后在真机创建一个docker0的网桥,默认创建的容器也是一个添加到这个网络的网桥中,默认地址为:172.17.0.1/16
yum -y install bridge-utils
brctl show|column -t            #查看当前的网络情况
docker -itd -h network_bridge centos        #创建
docker inspeact network_bridge          #查看

创建一个busybox查看网络

[root@docker ~]# docker run -d --name test2 busybox /bin/sh -c "while true;do sleep 3600;done"
docker ps -a

创建一个自己的桥接网络

docker network create -d bridge my-bridge
docker network ls       #查看当前的网络

创建新的容器添加到自己的桥接网卡中

docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while ture;do sleep 3600;done"
docker network inspect my-bridge        查看自己的bridge的详细信息

将之间创建的两个容器加入my-bridge网卡

docker network connect my-bridge test
docker network connect my-bridge test2
docker network inspect my-bridge
  • Host

    容器不会获得一个独立的Network namespace,而是与宿主机公用一个

实例:

[root@docker ~]# docker run -itd --net host ubuntu

  • None

    获取独立的Network namespeace,但不为容器进行任何的网络配置。

  • Container

    与指定的容器使用相同的一个network neamespeace,网卡配置也一样。两个服务公用一个IP的机会太小不深入讨论。

  • 自定义

    自定义的网桥,默认与桥接网路一样

docker的端口映射

  • 将容器的80端口映射到真实机器的80端口

创建一个Nginx的容器然后将它映射到80

docker run -d --name nginx_web -p 80:80 nginx
curl 127.0.0.1      #访问本地的80端口成功

Docker-NetWork由浅入深》有6个想法

  1. qkrngwuv,A fascinating discussion is definitely worth comment. I do think that you ought to publish more on this topic, it may not be a taboo budcekas,subject but generally folks don’t talk about such subjects. To the next! All the best!!

发表评论