docker 四种网络模型

来源:互联网 发布:矩阵的奇异值如何计算 编辑:程序博客网 时间:2024/06/05 11:39

一.docker网络基础知识

Docker在创建容器时有四种网络模式,bridge为默认不需要用–net去指定,其他三种模式需要在创建容器时使用–net去指定。

bridge模式,使用–net=bridge指定,默认设置。
none模式,使用–net=none指定。
host模式,使用–net=host指定。
container模式,使用–net=container:容器名称或ID指定

bridge模式:docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。

host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。

container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。

docker网络初始化的过程如下:

初始化设备 —> 初始化bridge —> 初始化iptables —> 初始化ip foward(内核路由转发) — > register network job function —> end

二.docker网络基础配置
1 .doker网络默认

[root@foundation6 ~]# ip addr show docker0 9: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP     link/ether 02:42:1f:31:2f:82 brd ff:ff:ff:ff:ff:ff    inet 172.17.0.1/16 scope global docker0       valid_lft forever preferred_lft forever    inet6 fe80::42:1fff:fe31:2f82/64 scope link        valid_lft forever preferred_lft forever##Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1/16, 容器启动后都会被桥接到 docker0 上,并自动分配到一个 IP 地址。

2.如何修改 docker 的默认网络配置(如果需要设置的ip地址,不能和宿主机中的所有ip地址在一个网段)
1)用命令修改,重启后失效

systemctl stop docker.serviceip link set dev docker0 downip addr del 172.17.0.1/16 dev docker0ip addr add 192.168.10.1/24 dev docker0ip link  set dev docker0 upsystemctl start  docker.service

2)修改配置文件永久生效

[root@foundation6 ~]# systemctl stop docker        ##在修改配置文件前停掉服务[root@foundation6 ~]# cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service##配置文件的位置可以通过查看服务的状态看到,一般不对与源文件改动,复制一份到/etc/systemd/system/docker.service[root@foundation6 ~]# vim /etc/systemd/system/docker.service[Unit]                  Description=Docker Application Container Engine ##一段描述这个Unit文件的文字,通常只是简单的一句话Documentation=https://docs.docker.com       ##指定服务的文档,可以使一个或多个文档的URL路径After=network.target docker.socket      ##会在后面列出的所有模块全部启动完成以后,才会启动当前的服务Requires=docker.socket              ##依赖的其他 Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,并且如果其中有任意一个服务启动失败,这个服务也会被终止。[Service]                   ##这个段是 .service 文件独有的,也是对于服务配置最重要的部分Type=notify                 ##服务的类型ExecStart=/usr/bin/docker daemon -H fd:// --bip="192.168.10.1/24" --insecure-registry 172.25.254.66:5000        ##指定服务启动的主要命令,--bip="192.168.10.1/24"设定网桥地址MountFlags=slaveLimitNOFILE=1048576LimitNPROC=1048576LimitCORE=infinityTimeoutStartSec=0[Install]                   ##这部分配置需要通过 systemctl enable 命令来激活,并且可以通过 systemctl disable 命令禁用WantedBy=multi-user.target          ##列出依赖当前服务的模块[root@foundation6 ~]# systemctl daemon-reload  ##重新加载[root@foundation6 ~]# systemctl start docker   ##启动服务[root@foundation6 ~]# ip addr show docker0 9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN     link/ether 02:42:1f:31:2f:82 brd ff:ff:ff:ff:ff:ff    inet **192.168.10.1/24** scope global docker0       valid_lft forever preferred_lft forever    inet6 fe80::42:1fff:fe31:2f82/64 scope link        valid_lft forever preferred_lft forever[root@foundation6 ~]# ping 192.168.10.1PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.033 ms

3)docker网络模型详解
◆ 桥接

在bridge模式下,连在同一网桥上的容器可以相互通信(如果为了安全考虑,也可以设置禁止它们通信),容器也可以与外部通信,数据包从容器出来,由于容器是桥接到docker0上,所以数据包会发到docker0上,查看iptables的策略,会发现有一个策略,将源地址从172.17.0.1的包进行源地址转换,转化成宿主机的网卡地址,(注意ip foward功能要开启)因此只要宿主机可以与外部通信,那么容器就可以与外部通信。

Bridge 桥接模式的实现步骤如下:

1 Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0和veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。

2 Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0

3 Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式,Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

[root@foundation6 ~]# docker run -d --name web1 nginx90bf8ed3e5b93011d17ad3a8fe055858e75b16773de0f72dcf5c1519133a4d7c ##使用docker镜像nginx:latest 以  后台模式启动一个容器,并将容器命名为web1,-d打入后台,并返回容器ID,--name 指定容器名称[root@foundation6 ~]# docker run -d --name web2 -p 8000:80 nginx6b9a27a9a78b1f4276337776b3401f11f9b52eaa096fea673e67b4c7439bbc08## 使用镜像nginx:latest以后台模式启动一个容器,将容器的80端口映射到宿主机的8080端口,即当访问宿主机的8000端口时会转到容器的80端口,也就是nginx的界面-p进行了端口映射,将容器web2的80端口映射到宿主机的8000端口,进行完该操作查看iptables会发现多了一条策略[root@foundation6 ~]# iptables -t nat -nL....DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:172.17.0.3:80[root@foundation6 ~]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES6b9a27a9a78b        nginx               "nginx -g 'daemon off"   7 seconds ago       Up 4 seconds        443/tcp, 0.0.0.0:8000->80/tcp   web290bf8ed3e5b9        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        80/tcp, 443/tcp                 web1

测试:在宿主机上分别访问172.17.0.3和127.25.254.66:8000就会发现可以看到nginx的测试页面
这里写图片描述

查看端口:

[root@foundation6 ~]# netstat -antlp |grep :80tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1479/httpd          tcp        0      0 192.168.0.126:56394     203.208.43.122:80       ESTABLISHED 9432/firefox       [root@foundation6 ~]# netstat -antlp |grep :8000tcp        0      0 172.25.254.66:36688     172.25.254.66:8000      ESTABLISHED 9432/firefox        tcp6       0      0 :::8000                 :::*                    LISTEN      21983/docker-proxy 

◆ Host 网络模式:使用与宿主机相同的命名空间
host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性的弱化,即容器不再拥有隔离、独立的网络栈。另外,使用 host 模式的 Docker Container 虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网络模式容器的端口映射。

[root@foundation6 ~]# docker run -it --name web4 --net host ubuntu##使用镜像ubuntu以交互式运行一个容器,-i 指运行交互式,-t 为容器重新分配一个伪终端,--name 为容器指定名称为web4,--net指定容器的网络连接类型,这里指定的是host模式root@foundation6:/# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever.......[root@foundation6 ~]# docker exec web3 ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever.......##web3 和web4使用的是桥接模式,会直接使用宿主机的网络

测试:
在网页访问宿主机的80端口就会发现访问到了nginx页面并不是宿主机真实的apache界面,我们的宿主机并没有配置nginx服务:
这里写图片描述

◆ Container 网络模式:
(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
(2) 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用other container 的 namespace。
Docker Container 的 other container 网络模式,可以用来更好的服务于容器间的通信。在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输效率较高。虽然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。但是需要注意的是,它并没有改善容器与宿主机以外世界通信的情况。

[root@foundation6 ~]# docker run -it --name web5 --net container:web4 ubuntu##web5会直接使用web4的网络,因为web4使用的是host模型使用的是宿主机网络,因此web5显示的也是宿主机的网络**root@foundation6:/# ip addr**1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever2: enp7s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000    link/ether f0:76:1c:81:e3:b6 brd ff:ff:ff:ff:ff:ff3: wlp8s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000    link/ether c4:8e:8f:0c:a9:71 brd ff:ff:ff:ff:ff:ff4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default     link/ether f0:76:1c:81:e3:b6 brd ff:ff:ff:ff:ff:ff    inet 172.25.254.66/24 brd 172.25.254.255 scope global br0       valid_lft forever preferred_lft forever    inet 172.25.66.250/24 brd 172.25.66.255 scope global br0       valid_lft forever preferred_lft forever5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default     link/ether 52:54:00:e2:0c:7d brd ff:ff:ff:ff:ff:ff    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0       valid_lft forever preferred_lft forever6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500    link/ether 52:54:00:e2:0c:7d brd ff:ff:ff:ff:ff:ff7: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default     link/ether 52:54:00:91:4b:52 brd ff:ff:ff:ff:ff:ff8: virbr1-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr1 state DOWN group default qlen 500    link/ether 52:54:00:91:4b:52 brd ff:ff:ff:ff:ff:ff9: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default     link/ether 02:42:75:58:f2:fa brd ff:ff:ff:ff:ff:ff    inet 192.168.10.1/24 scope global docker0       valid_lft forever preferred_lft forever    inet6 fe80::42:75ff:fe58:f2fa/64 scope link        valid_lft forever preferred_lft forever##Docker 在启动时会创建一个虚拟网桥 docker0,容器启动后都会被桥接到 docker0 上,并自动分配到一个 IP 地址11: veth3fc6eda@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default     link/ether 62:fa:23:8b:95:9f brd ff:ff:ff:ff:ff:ff    inet6 fe80::60fa:23ff:fe8b:959f/64 scope link        valid_lft forever preferred_lft forever13: vethb285c19@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default     link/ether 66:fa:71:07:e2:1a brd ff:ff:ff:ff:ff:ff    inet6 fe80::64fa:71ff:fe07:e21a/64 scope link        valid_lft forever preferred_lft forever[root@foundation6 ~]#  docker stop `docker ps -aq`     ##停止所有的容器c6e2fe90a7853314207a76ddb81172cd9aef6b9a27a9a78b90bf8ed3e5b9[root@foundation6 ~]# docker rm `docker ps -aq`            ##删除所有的容器c6e2fe90a7853314207a76ddb81172cd9aef6b9a27a9a78b90bf8ed3e5b9

◆ None 网络模式:
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docker Container 做了极少的网络设定,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

在 none 网络模式下分配固定 ip:
netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。使用 netns 创建的网络空间独立于当前系统的网络空间,其中的网络设备以及 iptables 规则等都是独立的,就好像进入了另外一个网络一样。

[root@foundation6 ~]#  docker run -it --net none --name vm1 ubuntu ##使用镜像ubuntu以交互式运行一个容器,-i 指运行交互式,-t 为容器重新分配一个伪终端,--name 为容器指定名称为vm1,--net指定容器的网络连接类型,这里指定的是none模式root@e0146efca427:/# root@e0146efca427:/# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever           ##没有ip

容器间互联:
–link 参数可以在不映射端口的前提下为两个容器间建立安全连接, –link 参数可以连接一个或多个容器到将要创建的容器,–link表示添加连接到另一个容器。
–link 参数的格式为 –link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名。

[root@foundation6 ~]# ip link add veth0 type veth peer name veth1   ##将veth设备一端接入ovs网桥br-int中[root@foundation6 ~]# brctl addif docker0 veth0        ##将veth0加入网桥[root@foundation6 ~]#  brctl showbridge name bridge id       STP enabled interfacesbr0     8000.f0761c81e3b6   no      enp7s0f1docker0     8000.02427558f2fa   no      veth0      ##可以看到vnet0已经加入网桥virbr0      8000.525400e20c7d   yes     virbr0-nicvirbr1      8000.525400914b52   yes     virbr1-nic[root@foundation6 ~]# ip link set up veth1             ##启动新加端口[root@foundation6 ~]# ip link set up veth0[root@foundation6 ~]# docker inspect vm1 | grep Pid    ##配置容器的网络namespace            "Pid": 6328,            "PidMode": "",            "PidsLimit": 0,[root@foundation6 ~]# cd /proc/6328/ns/[root@foundation6 ns]# lsipc  mnt  net  pid  user  uts[root@foundation6 ns]# lltotal 0lrwxrwxrwx 1 root root 0 Aug 13 07:51 ipc -> ipc:[4026532403]lrwxrwxrwx 1 root root 0 Aug 13 07:51 mnt -> mnt:[4026532401]lrwxrwxrwx 1 root root 0 Aug 13 07:42 net -> net:[4026532406]lrwxrwxrwx 1 root root 0 Aug 13 07:51 pid -> pid:[4026532404]lrwxrwxrwx 1 root root 0 Aug 13 07:51 user -> user:[4026531837]lrwxrwxrwx 1 root root 0 Aug 13 07:51 uts -> uts:[4026532402][root@foundation6 ns]# ln -s /proc/6328/ns/net /var/run/netns/6328  ##制作软连接[root@foundation6 ns]# ip link set veth1 netns 6328         ##将veth1连接容器网络[root@foundation6 ns]# docker exec vm1 ip addr              ##查看容器网络1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever14: veth1@if15: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000    link/ether 36:b8:d2:64:35:7c brd ff:ff:ff:ff:ff:ff[root@foundation6 ns]# ip netns exec 6328 ip link set veth1 name eth0##veth1改名为eth0[root@foundation6 ns]# ip netns exec 6328 ip link set eth0 up       ##启用eth0设备[root@foundation6 ns]# ip netns exec 6328 ip addr add 192.168.10.100/24 dev eth0 ##为 namespace 中指定设备设置 ip[root@foundation6 ns]# docker exec vm1 ip addr                      ##ip设置成功1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever14: eth0@if15: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state LOWERLAYERDOWN group default qlen 1000    link/ether 36:b8:d2:64:35:7c brd ff:ff:ff:ff:ff:ff    inet 192.168.10.100/24 scope global eth0       valid_lft forever preferred_lft forever[root@foundation6 ns]# ip netns exec 6328 route add default gw 192.168.10.1##设置网关[root@foundation6 ns]#  ip link set dev veth0 up[root@foundation6 ns]# docker exec vm1 ping 192.168.10.1PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.046 ms64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.042 ms64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.042 ms[root@foundation6 ns]# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever2: enp7s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether f0:76:1c:81:e3:b6 brd ff:ff:ff:ff:ff:ff    inet 192.168.0.126/24 brd 192.168.0.255 scope global dynamic enp7s0f1       valid_lft 6856sec preferred_lft 6856sec    inet6 fe80::f276:1cff:fe81:e3b6/64 scope link        valid_lft forever preferred_lft forever3: wlp8s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000    link/ether c4:8e:8f:0c:a9:71 brd ff:ff:ff:ff:ff:ff4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff    inet 172.25.254.66/24 brd 172.25.254.255 scope global br0       valid_lft forever preferred_lft forever    inet 172.25.66.250/24 brd 172.25.66.255 scope global br0       valid_lft forever preferred_lft forever    inet6 fe80::f276:1cff:fe81:e3b6/64 scope link        valid_lft forever preferred_lft forever5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN     link/ether 52:54:00:e2:0c:7d brd ff:ff:ff:ff:ff:ff    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0       valid_lft forever preferred_lft forever6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500    link/ether 52:54:00:e2:0c:7d brd ff:ff:ff:ff:ff:ff7: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN     link/ether 52:54:00:91:4b:52 brd ff:ff:ff:ff:ff:ff8: virbr1-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr1 state DOWN qlen 500    link/ether 52:54:00:91:4b:52 brd ff:ff:ff:ff:ff:ff9: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP     link/ether 02:42:75:58:f2:fa brd ff:ff:ff:ff:ff:ff    inet 192.168.10.1/24 scope global docker0       valid_lft forever preferred_lft forever    inet6 fe80::42:75ff:fe58:f2fa/64 scope link        valid_lft forever preferred_lft forever17: veth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master docker0 state UP qlen 1000    link/ether 1a:b2:39:f5:0f:63 brd ff:ff:ff:ff:ff:ff link-netnsid 0    inet6 fe80::18b2:39ff:fef5:f63/64 scope link        valid_lft forever preferred_lft forever[root@foundation6 ns]# docker exec vm1 ping 192.168.10.1PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.045 ms64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.043 ms[root@foundation6 ns]# docker exec vm1 ping 192.168.10.100PING 192.168.10.100 (192.168.10.100) 56(84) bytes of data.64 bytes from 192.168.10.100: icmp_seq=1 ttl=64 time=0.039 ms[root@foundation6 ns]# docker exec vm1 ping 172.25.254.66PING 172.25.254.66 (172.25.254.66) 56(84) bytes of data.64 bytes from 172.25.254.66: icmp_seq=1 ttl=64 time=0.047 ms64 bytes from 172.25.254.66: icmp_seq=2 ttl=64 time=0.036 ms[root@foundation6 ns]# docker exec vm1 ping baidu.comPING baidu.com (123.125.114.144) 56(84) bytes of data.64 bytes from 123.125.114.144: icmp_seq=1 ttl=51 time=21.5 ms64 bytes from 123.125.114.144: icmp_seq=2 ttl=51 time=21.4 ms##此时我们的宿主机和容器的网络是相通的,如果宿主机可以连接外网,我们容器也可以访问外网[root@foundation6 ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMESe0146efca427        ubuntu              "/bin/bash"         23 hours ago        Up 54 minutes                           vm1[root@foundation6 ~]# docker stop vm1          ##停止容器vm1[root@foundation6 ~]# docker rm  vm1           ##删除容器vm1
原创粉丝点击