一、docker原生网络
- docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。
- docker安装后会自动创建3种网络:bridge、host、none
Docker在启动时会开启一个Linux bridge(虚拟网桥设备)docker0,默认的地址为172.17.0.1/16,容器启动后都会被桥接到docker0上,并自动分配到一个ip地址.
实验:
1.查看docker的网络有哪些(发现有三种, bridge,host,none)
2.查看server2上的ip,发现docker0
[root@server2 docker]# yum install -y bridge-utils
[root@server2 docker]# brctl show
[root@server2 docker]# docker images
[root@server2 docker]# docker run -d --name demo nginx
[root@server2 docker]# docker inspect demo
[root@server2 docker]# ip addr
1.docker网络中的bridge网络模式
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网。
[root@server2 docker]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242480d51fc no vethe8c0370
[root@server2 docker]# docker run -it --rm busybox
[root@server2 docker]# iptables -t nat -nL
Bridge桥接模式的缺陷:
该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
2. docker网络中的host网络模式
- host网络模式需要在容器创建时指定–network=host
- host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。
- host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
创建host网络模式的一个容器并查看ip,会发现此时的ip与宿主机(docker0)中的ip一样
[root@server2 docker]# docker run -it --rm --network host busybox
/ # ip addr
/ #
[root@server2 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98199ce260c1 nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp demo
[root@server2 docker]# docker rm -f demo
demo
[root@server2 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98199ce260c1 nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp demo
[root@server2 docker]# docker rm -f demo
demo
[root@server2 docker]# docker run -d --name demo --network host nginx ##端口冲突
[root@server2 docker]# docker run -d --name demo2 --network host nginx
[root@server2 docker]# docker ps
[root@server2 docker]# docker ps -a
[root@server2 docker]# netstat -antlp
[root@server2 docker]# docker rm -f demo2
demo2
[root@server2 docker]#
3. docker网络中的none网络模式
none模式是指禁用网络功能,只有lo接口,在容器创建时使用–network=none指定。
创建一个none网络模