docker 四种网络模型

2023-11-16

一.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.service

ip link set dev docker0 down


ip addr del 172.17.0.1/16 dev docker0

ip addr add 192.168.10.1/24 dev docker0


ip link  set dev docker0 up

systemctl 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=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=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.1
PING 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 nginx
90bf8ed3e5b93011d17ad3a8fe055858e75b16773de0f72dcf5c1519133a4d7c
 ##使用docker镜像nginx:latest 以  后台模式启动一个容器,并将容器命名为web1,-d打入后台,并返回容器ID,--name 指定容器名称
[root@foundation6 ~]# docker run -d --name web2 -p 8000:80 nginx
6b9a27a9a78b1f4276337776b3401f11f9b52eaa096fea673e67b4c7439bbc08
## 使用镜像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 ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
6b9a27a9a78b        nginx               "nginx -g 'daemon off"   7 seconds ago       Up 4 seconds        443/tcp, 0.0.0.0:8000->80/tcp   web2
90bf8ed3e5b9        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 :80
tcp        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 :8000
tcp        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 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 forever
.......

[root@foundation6 ~]# docker exec web3 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 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 forever
2: 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:ff
3: 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:ff
4: 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 forever
5: 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 forever
6: 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:ff
7: 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:ff
8: 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:ff
9: 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 forever
13: 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`     ##停止所有的容器
c6e2fe90a785
3314207a76dd
b81172cd9aef
6b9a27a9a78b
90bf8ed3e5b9
[root@foundation6 ~]# docker rm `docker ps -aq`            ##删除所有的容器
c6e2fe90a785
3314207a76dd
b81172cd9aef
6b9a27a9a78b
90bf8ed3e5b9

◆ 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 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 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 show
bridge name bridge id       STP enabled interfaces
br0     8000.f0761c81e3b6   no      enp7s0f1
docker0     8000.02427558f2fa   no      veth0      
##可以看到vnet0已经加入网桥
virbr0      8000.525400e20c7d   yes     virbr0-nic
virbr1      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]# ls
ipc  mnt  net  pid  user  uts
[root@foundation6 ns]# ll
total 0
lrwxrwxrwx 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 forever
14: 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 forever
14: 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.1
PING 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 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.042 ms
[root@foundation6 ns]# ip addr
1: 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 forever
2: 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 forever
3: 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:ff
4: 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 forever
5: 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 forever
6: 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:ff
7: 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:ff
8: 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:ff
9: 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 forever
17: 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.1
PING 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 ms
64 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.100
PING 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.66
PING 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 ms
64 bytes from 172.25.254.66: icmp_seq=2 ttl=64 time=0.036 ms


[root@foundation6 ns]# docker exec vm1 ping baidu.com
PING 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 ms
64 bytes from 123.125.114.144: icmp_seq=2 ttl=51 time=21.4 ms
##此时我们的宿主机和容器的网络是相通的,如果宿主机可以连接外网,我们容器也可以访问外网
[root@foundation6 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e0146efca427        ubuntu              "/bin/bash"         23 hours ago        Up 54 minutes                           vm1
[root@foundation6 ~]# docker stop vm1          ##停止容器

vm1
[root@foundation6 ~]# docker rm  vm1           ##删除容器
vm1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker 四种网络模型 的相关文章

随机推荐

  • vue Tesseract的 ocr 文字识别

    npm结果页 https www npmjs com package tesseract js tesseract官网地址 https tesseract projectnaptha com npm结果页 npm结果页 tesseract官
  • 如何优雅的统计代码耗时

    点击上方 小强的进阶之路 选择 星标 公众号 优质文章 及时送达 预计阅读时间 16分钟 作者 Jitwxs 原文链接 底部链接可直达 https jitwxs cn 5aa91d10 html 一 前言 代码耗时统计在日常开发中算是一个十
  • R语言—列表

    文章目录 列表 定义 创建列表 List 列表 List 元素的引用 列表 List 元素的修改 访问列表元素和值 去列表化 在列表上使用apply系列函数 递归型列表 列表 R语言的6种模式 向量 矩阵 数组 数据框 列表 因子 向量 矩
  • SQLite如何删除,修改、重命名列

    今天在SQLite数据库中添加了一列 后来发现列名写错了 于是使用SQL语句来修改列名 可是根本不管用 首先 请放弃alter吧 sqlite官方说明如下 SQLite supports a limited subset of ALTER
  • 【JS】JavaScript时间与时间戳相互转换

    时间与时间戳相互转换 1 2 时间 JS常用时间类型 1 2 1 GMT 格林尼治标准时 1 2 2 UTC 协调世界时 1 2 3 中国标准时间 1 2 4 ISO8601标准时间格式 1 2 5 时间戳 timestamp 1 时间戳转
  • spring boot项目自动加载引入外部bean

    前言 spring boot项目简化了对外部项目的引入 使我们能够狠方便的构建一个web项目 我们通常在开发的过程中会开发出一些公用的模块组件 这样在项目找那个引入后能够直接使用 减少了轮子的重复构造 同时服务引入的模块化操作 能够更多的节
  • CV学习:OpenCv快速入门(python版)

    本文代码全部可运行 笔者运行环境 python3 7 pycharm opencv4 6 此文是学习记录 记录opencv的入门知识 对各知识点并不做深入探究 文章的目的是让阅读者在极短的时间达到入门水平 在学习过程中 我们应养成 查询op
  • pygame用blit()实现动画效果

    pygame的的实现动画的方法有很多 但是都是围绕着表面进行的 也就是说实现动画的方式不同 但是本质其实都是对表面的不同处理方式而已 原理其实很简单 有点像我们做地铁的时候隧道里的广告一样 我们设置一个窗口 然后让窗口在一个画着很多帧图像的
  • 约束综合中的逻辑互斥时钟(Logically Exclusive Clocks)

    注 本文翻译自Constraining Logically Exclusive Clocks in Synthesis 逻辑互斥时钟的定义 逻辑互斥时钟是指设计中活跃 activate 但不彼此影响的时钟 常见的情况是 两个时钟作为一个多路
  • IDEA从安装到使用--相关配置详解

    IDEA从安装到使用 相关配置详解 作为一个技术小白 刚开始学习使用Intellij IDEA 入门时踩了很多的坑 这里写下我的第一篇博客 分享相关IDEA的配置方法 希望能为各位提供一点帮助 IDEA2018安装及破解 作者 志哥的成长笔
  • 大数(四则运算)

    四则运算 大数加法 高精度加法 大数减法 大数乘法 大数乘法 幂运算 大数乘法 高精度幂运算 大数除法 大数加法 思路 从后往前算 即由低位向高位运算 计算的结果依次添加到结果中去 最后将结果字符串反转 输入的时候两个数都是以字符串的形式输
  • 网站架构演变

    网站架构演变 大型网站介绍 与传统企业应用系统相比 大型互联网网站系统具有以下特点 1 大流量 高并发 这一点往往是传统企业应用系统根本就不会遇到的问题 比如Goole每日访问量都是几十亿 如果服务器端处理不好早就被压的宕机了 2 高可用
  • 环形缓冲区(1)

    声明 参考韦东山视频教程 如若侵权请告知 马上删帖致歉 个人总结 如有不对 欢迎指正 环形缓冲区 环形缓冲区的几个基本操作 申请内存空间 写操作 读操作 环形缓冲区小结 判断缓冲区是否为空 判断缓冲区是否写满 构建环形缓冲区 在 h文件中声
  • 【Augmentation Zoo】RetinaNet + VOC + KITTI的数据预处理-pytorch版

    整合前段时间看的数据增强方法 并测试其在VOC和KITTI数据上的效果 我的工作是完成了对VOC和KITTI数据的预处理 RetinaNet的模型代码来自pytorch retinanet 该项目github仓库在 https github
  • 中标麒麟+达梦数据库 无效的列名[AAAAAAAAAAAAAFS]

    目录 前言 解决办法 中标麒麟 解决办法 windows 前言 今天我将项目部署到中标麒麟服务器 发现原本好使的功能 只要一做添加操作就报如下错误 虽然报错 但数据还是添加了进去 这让我十分费解 解决办法 中标麒麟 问题出现在返回新增结果时
  • Next.js中使用antd修改其组件的默认样式

    在项目中使用了next js搭配了antd 其中需要自定义antd样式 在next js中如果想定义css 我用到的有两种方式 一种是直接使用行内式 div test div 另一种就是写一个css文件后引入 定义一个test module
  • SpringBoot(5)-SpringBoot整合其他项目

    SpringBoot 5 SpringBoot整合其他项目 1 整合Druid数据库连接池 1 1学习地址 1 2application yml 1 3访问一下 1 4随便执行一下新增 2 整合Redis 2 1添加redis pom依赖
  • mimikatz

    https blog gentilkiwi com mimikatz https github com ParrotSec mimikatz
  • C++day1(笔记整理)

    一 Xmind整理 二 上课笔记整理 1 第一个c 程序 hello world include
  • docker 四种网络模型

    一 docker网络基础知识 Docker在创建容器时有四种网络模式 bridge为默认不需要用 net去指定 其他三种模式需要在创建容器时使用 net去指定 bridge模式 使用 net bridge指定 默认设置 none模式 使用