网络模式:
SNAT:源地址转换
DNAT:目标地址转换
PAT:通过隧道模式转换
叠加网络:其实就是在数据包格式报文上添加了一层新的封装,封装的数据是新添加了一组真实机器的源和目标ip地址
docker容器网络
ip netns 命令:会通过调用内核参数实现成对网卡,将这对网卡分开之后可以放到不同的命名空间,配置好ip即可通信
桥接式容器(bridged containers):
桥接式容器一般拥有两个接口:一个回环接口和一个连接至主机上某桥接设备的以太网接口
docker daemon启动时默认会创建一个名为docker0的网络桥,并且创建的容器为桥接式容器,其以太网接口桥接至docker0
--net bridge即为将容器接口添加至docker0桥
docker0桥为NAT桥,因此,桥接式容器可通过此桥接口访问外部网络,但防火墙规则阻止了一切从外部网络访问桥接式容器的请求
--docker run --rm --net bridege busybox ifconfig -a
可以为docker run 命令使用
--hostname HOSTNAME 选项为容器指定主机名,例如
docker run --rm --net bridge --hostname lala busybox:latest nslookup lala
--dns DNS_SERVER_IP 选项能够为容器指定所使用的dns服务器地址,例如
docker run --rm --net bridge --dns "8.8.8.8" busybox:latest
--add-host HOSTNAME:IP 选项能够为容器指定本地主机名解析项,例如
docker run --rm --dns 10.0.0.1 --add-host "lala:10.0.0.1" busybox:latest
封闭式网络(Closed containers):
不参与网络通信,运行于此类容器中的进程仅能访问本地回环接口
仅适用于进程无须网络通信的场景中,例如备份,进程诊断及各种离线任务等
--docker run --rm --net none busybox:latest ifconfig -a
完全开放式网络(opening inbound communication):
docker0为NAT桥,因此容器一般获得的是私有网络地址
可以把容器想象成宿主机NAT服务背后的主机
如果开放容器或其上的服务为外部网络访问,需要在宿主机上为其定义DNAT规则,例如
对某宿主机某IP地址的访问会全部映射给某容器地址
主机IP::容器ip
-A PREROUTING -d 主机ip -j DNAT --to-destination 容器ip
对宿主机某IP地址的某端口的访问映射给某容器地址的某端口
主机ip:port::容器ip:port
-A PREROUTING -d 主机ip -p {tcp|udp} --dport 主机端口 -j DNAT --to-detination 容器ip:容器port
docker run -p选项的使用格式:
-p <container port>
将指定的容器端口映射至主机所有地址的一个动态端口,一般在30000以后
-p <host port>:<container port>
将容器端口<container port>映射至指定的主机端口<hostport>
-p <ip>::<container port>
将指定的容器端口映射至主机指定的ip的动态端口
-p <ip>:<hostport>:<container port>
将指定的容器端口映射至主机指定的ip和端口
动态端口指随机端口,具体的映射结果可使用docker port命令查看
-P选项或--publish-all将容器的所有计划要暴露的端口全部映射至主机端口
计划要暴露的端口使用--expose选项指定
例如:docker run -d -P --expose 3333 --name web busybox:latest /bin/httpd -p 2222 -f
查看映射结果
docker port web
如果不想使用默认的docker0桥接口,或者需要修改此桥接口的网络属性,可通过为docker daemon命令使用
-b,--bip,--fixed-cidr,--default-gateway,--dns以及--mtu等选项进行设定
联盟容器(joined containers):
联盟式容器是指使用某个已存在容器的网络接口的容器,接口被联盟内的各容器共享使用,因此,
联盟式容器彼此间完全无隔离,例如
创建一个监听于2222端口的http服务容器
docker run -d -it --rm -p 2222 busybox:latest /bin/httpd -p 2222 -f
创建一个联盟式容器,并查看其监听的端口
docker run -it --rm --net container:web --name joined busybox:latest netstat -tan
联盟式容器彼此间虽然共享同一个网络名称空间,但其他名称空间如user,mount,uts还是隔离的
联盟式容器彼此间存在端口冲突的可能性,因此,通常只会在多个容器上的程序需要程序loopback接口通信
,或对某已存在的容器的网络属性进行监控时才使用此种模式的网络模型
docker默认是无法远程访问的,配置docker可以远程访问以及自定义网桥ip地址段:
note(通过docker命令可以创建自己的docker网桥(bridge))