0
点赞
收藏
分享

微信扫一扫

docker学习笔记2-network


docker networking​


6种名称空间:UTS|user|mount|IPC|PID|net


虚拟化网络:

bridge-utils工具可实现虚拟网桥设备,内核中实现,相当于1个名称空间(主机)中的虚拟网卡连上虚拟交换机的1个口接口,这个网卡有2个口(1头连主机网卡1头连交换机头);

OVS,open vswitch,纯软件方式实现三层交换功能,VLAN|VXLAN|GRE|流控技术SDN软件驱动-定义网络,这些不是linux内核自身提供的功能;


docker学习笔记2-network_虚拟化


两台物理机上的容器间通信,要经2次转发,如c3和c5,c3上的网卡SNAT,c5上的网卡DNAT;


overlay network,叠加网络;

docker学习笔记2-network_docker网络_02


基于隧道,封装3层报文;


docker network ls #bridge|host|none

本机上docker0,软交换机,也可当网卡使用,

veth开头的,是容器的网卡,一半连容器,一半连交换机docker0;


yum -y install bridge-utils

brctl show

ip link show

iptables -t nat -vnL #每创建1个容器,就生成1条规则MASQUERADE




虚拟化网络:

linux kernel支持2种网络设备模拟,2层和3层,用软件模拟的;

OVS,openVSwitch,用纯软件实现的网络设备,有更高级功能;

桥接,把物理网卡当交换机用;

docker学习笔记2-network_docker网络_03


c4和c6通信,c4这边要SNAT,c6那边要DNAT;


overlay network,叠加网络,实现两层三层报文转发,隧道方式;

docker network ls #bridge(docker0)|host(容器有物理机的特权)|none(没有网络)

每次创建的容器,会有1个虚拟网卡,一半在容器内,一半在docker0上;

docker ps

brctl show #yum -y install bridge-utils

ip link show

iptables -t nat -vnL #MASQUERADE,SNAT


docker exec -it web1 /bin/sh

ifconfig

netstat -tnl

wget -o - -q http://172.17.0.2 #-o不输出至文件,-在当前终端显示


user|mount|pid|uts|net|ipc,每个容器都有这些独立而隔离的6个名称空间;

联盟式网络,容器间可共享部分名称空间UTS|NET|IPC;

docker network ls #host,容器使用宿主机的名称空间,容器有宿主机的特权



docker的4种网络模式:

默认bridge,是net桥;

1、none, closed container封闭式容器;

2、bridge,bridged container;

3、joined container联盟式容器;

4、host,open container;

docker学习笔记2-network_docker网络_04


docker network inspect bridge #inspect查看docker object的详细信息

docker container inspect web1


rpm -q iproute

ip --help #netns,网络名称空间,使用此子命令测试虚机网络

ip netns help

ip netns add r1

ip netns add r2

ip netns exec r2 ifconfig -a #exec在网络名称空间中执行命令

ip link help #veth

ip link add name veth1.1 type veth peer name veth1.2

ip link show

ip link set dev veth1.2 netns r1 #把名称空间移到容器中

ip link show

ip netns exec r1 ifconfig -a

ip netns exec r1 ip link set dev veth1.2 name eth0 #改名

ip netns exec r1 ifconfig -a

ifconfig veth1.1 10.1.0.1/24 up

ifconfig

ip netns exec r1 ifconfig eth0 10.1.0.2/24 up

ip netns exec r1 ifconfig

ping 10.1.0.2

ip link set dev veth1.1 netns r2

ip netns exec r2 ifconfig

ip netns exec r2 ifocnfig veth1 10.1.0.3/24 up

ip netns exec r2 ifconfig

ip netns exec r2 ping 10.1.0.2


docker run --name t1 -it [--network bridge] --rm busybox:lastest #默认bridge,--network none实现closed container

ifconfig

hostname #docker run --name t1 -it --network bridge -h t1.magedu.com --rm busybox:lastest,可通过-h NAME注入主机名

cat /etc/hosts #自动生成自己的解析,可从外部注入解析--add-host www.magedu.com:1.1.1.1

cat /etc/resolv.conf #与宿主机一样的解析 #通过--dns 114.114.114.114 --dns-search ilinux.io,--dns-search表示提供的FQDN不是完整的域名时自动补设定的

nslookup -type=A www.baidu.com

exit #退出容器会自动删除,加了--rm

docker ps -a

docker学习笔记2-network_docker_05



docker学习笔记2-network_docker网络_06


容器内的端口暴露expose到宿主机上,4种方式:

docker run --name myweb --rm -p 80 magedu/httpd:v0.2

docker port myweb #查看容器映射到宿主机的端口

docker kill myweb

docker run --name myweb --rm -p 172.20.0.67::80 magedu/httpd:v0.2

docker port myweb

docker kill myweb

docker run --name myweb --rm -p 80:80 magedu/httpd:v0.2

docker run --name myweb --rm -p 172.20.0.67:8080:80 magedu/httpd:v0.2

docker run -d -P --expose 2222 --expose 3333 --name web busybox:latest /bin/httpd -p 2222 -f


-p <containerPort> #映射到宿主机的随机端口,30000-32767间,通过iptables -t nat -vnL查看在宿主机上的端口,容器删除iptables中的规则会自动删除,docker kill myweb

-p <ip>::<containerport> #将指定的容器端口映射到主机指定IP的动态端口

-p <hostport>:<containerport> #将容器端口映射到指定的主机端口

-p <ip>:<hostport>:<containerport> #将指定的容器端口映射至主机指定IP的端口

-P #将容器的所有计划要暴露的端口全部映射到主机端口,计划要暴露的端口使用--expose指定,如果不想使用默认的docker0接口,或需要修改此桥接口的网络属性,可通过为docker daemon使用-b|--bip|--fixed-cidr|--default-gateway|--dns|--mtu进行设定

docker学习笔记2-network_虚拟化_07



joined containers:

联盟式容器指使用某个已存在容器的网络接口的容器,接口被联盟内的各容器共享使用,联盟式容器间彼此间完全无隔离;

docker run -d --it --rm -p 2222 busybox:latest /bin/httpd -p 2222 -f #ifconfig

docker run --it --rm --network container:web --name joined busybox:latest netstat -tan #共享web容器的网络

联盟式容器彼此间虽共享同一个网络名称空间,但其它名称空间如user|mount还是隔离的;

联盟式容器彼此间存在端口冲突的可能性,因此通常只会在多个容器上的程序需要程序loopback接口互相通信,或对某已存在的容器的网络属性进行监控时才使用此种模式的网络模型;


/etc/docker/daemon.json

{

"registry-mirrors":["https://"],

"bip": "10.0.0.1/16" #自定义容器地址网段

}

systemctl restart docker


控制另一宿主机上的容器:

默认不能跨宿主机控制,unix:///var/run/docker.sock

/etc/docker/daemon.json

{

"":["",""],

"bip":"",

"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]

}

systemctl restart docker

ss -tnl

docker -H 172.20.0.67:2375 ps #查看另一宿主机上的容器


同一个宿主机上创建2个网桥(虚交换机),2个网桥上分别连1个容器,这2个容器间默认不能通信(默认2个网段是隔离的,就是不让通信),打开内核ip_forward转发规则的前提下,iptables中仍有规则生成,放开对应的规则就能通信;

docker network ls

docker info #Network上还有macvlan|overlay

docker network --help

docker network create --help

docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0

docker network ls #有br0

ifconfig

ip link set dev b4-3291c2f3f63b name docker1

docker run --name t1 -it --network mybr0 busybox:latest #ifconfig

docker run --name t2 -it --network bridge busybox:latest #ifconfig

cat /proc/sys/net/ipv4/ip_forward #1,默认打开

ping 10.0.0.2

iptables -vnL



举报

相关推荐

0 条评论