【14】Docker network | bridge | host | none | container

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

1、Docker 运行的基本流程为:

2、Docker0

 3、Docker默认的三种网络模式

4、Docker的网络命令

5、网络模式

6、实例:

7、bridge模式

8、host模式

9、none模式

10、container模式

11、自定义网络


1、Docker 运行的基本流程为:

  • 1.用户是使用 Docker Client与 Docker Daemon建立通信并发送请求给后者
  • 2.Docker Daemon作为 Docker 架构中的主体部分首先提供 Docker Server 的功能使其可以接受 Docker Client的请求。
  • 3.Docker Engine 执行 Docker内部的一系列工作每一项工作都是以一个Job的形式的存在。
  • 4.Job的运行过程中当需要容器镜像时则从 Docker Reisty 中下载境像并通过镜像管理驱动 Graph driver将下载像以Graph的形式存储。
  • 5.当需要为 Docker创建网络环境时通过网络管理驱动 Network driver创建并配置 Docker容器网络环境。
  • 6.当需要限制 Docker容器运行资源或执行用户指令等操作时则通过 Execdriver来完成。
  • 7.Libcontainer是一项独立的容器管理包Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。

2、Docker0

Docker启动的时候会在主机上自动创建一个docker0网桥所有容器的启动如果没有指定网络模式的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口)该桥接网络的名称为docker0它在内核层连通了其他的物理或虚扣网卡这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的地址和子网掩码让主机和容器之间可以通过网桥相互通信

 3、Docker默认的三种网络模式

[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
919709756d0d   bridge    bridge    local
cf00b70b0a68   host      host      local
b5230e2ac5d0   none      null      local

4、Docker的网络命令

[root@localhost ~]# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network                         #连接网络         
  create      Create a network                                         #创建网络
  disconnect  Disconnect a container from a network                    #中断网络
  inspect     Display detailed information on one or more networks     #查看网络的详细信息
  ls          List networks                                            #列出网络
  prune       Remove all unused networks                               #删除没用的网络
  rm          Remove one or more networks                              #删除网络

Run 'docker network COMMAND --help' for more information on a command.

5、网络模式

bridge

  • 为每一个容器分配、设置IP 等并将容器连接到一个 docker0
  • 虚拟网桥默认为该模式

host

  • 容器将不会虚拟出自己的网卡配置自己的IP等而是使用宿主机的IP 和端口。

none

  • 容器有独立的 Network namespace但并没有对其进行任何网络设置如分配 veth pair 和网桥连接IP 等。

container

  • 新创建的容器不会创建自己的网卡和配置自己的IP而是和一个指定的容器共享IP、端口范围等
  • 命令:--network bridge/host/none/container

6、实例:

[root@localhost ~]# docker run -it --name u1 ubuntu /bin/bash
root@af09658d26d3:/# 
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
af09658d26d3   ubuntu    "/bin/bash"   11 seconds ago   Up 9 seconds             u1
[root@localhost ~]# docker inspect u1 |tail -n 20 
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "919709756d0d3b1fb9f24c9b10409340ff5e7bedf5e7e3bdc28e9d7d597e126c",
                    "EndpointID": "0bf213d3d0d05cb81a06b1fd98520944205a3860ec02fe965bba1df21fcf523b",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

7、bridge模式

1 、Docker使用Linux桥接在宿主机虚拟一个Docker容器网桥(docker0) Docker启动一个容器时会根Docker网桥的网段分配给容器一个IP地址,称为Container-IP同时Docker网桥是每个容器的默认网关因为在同一宿主机内的容器都接入同一个网桥这样容器之间就能够通过容器的Container-IP直接通信。

2 、docker run 的时候没有指定network的话默认使用的网桥模式就是bridge使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的nework的eth0eth1eth2. 代表网卡一网卡二网卡三...lo代表127.0.0.1即locahost, inet addr用来表示网卡的IP地:

3 、网桥docker0创建一对对等虚拟设备接口一个叫veth另一个叫eth0成对匹配。

      3.1 整个宿主机的网桥模式都是docker0类似一个交换机有一堆接口每个接口叫veth在本地主机和 容器内分别创建一个虚拟接口并让他们彼比联通(这样一对接口叫veth pair) ;

     3.2 每个容器实例内部也有一块网卡每个接口叫eth0;

     3.3 docker0上面的每个veth匹配某个容器实例内部的eth0两两配对一一匹配。通过上述将宿主机 上的所有容器都连接到这个内部网络上两个容器在同一个网络下,会从这个网关下各自拿到分配的ip此时两个容器的网络是互通的。

 

8、host模式

容器将不会获得一个独立的Network Namespace而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

 

 

[root@localhost ~]# docker run -d --network host --name tomcat01 tomcat
08850fe8df1aa99e21d9ec25c9bd3139e9f6fb2333bf35a489f733fefc711c32

9、none模式

禁用网络功能只有lo标识(就是127.0.0.1表示本地回环)

10、container模式

新创建的容器不会创建自己的网卡和配置自己的IP而是和一个指定的容器共享IP、端口范围

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡配置自己的IP而是和一个指定的容器共享IP、端口范围等。同样两个容器除了网络方面其他的如文件系统、进程列表等还是隔离的。

 

 

[root@localhost ~]# docker run -d -p 8085:8080 --name my_tomcat tomcat
18a598a32b335fb9822c74c6cceeffbbe39a512a615cd41e3c7914e4918eaaa2
[root@localhost ~]# docker run -d --network container:my_tomcat  --name my_tomcat01 tomcat
6720ae57b43a72f7faeb3cda5bf6609f7facb5984434e9633d2a76bce3bde366
[root@localhost ~]# 

以上不适合因为两个tomcat共用8080

下面做举例 

[root@localhost ~]# docker run -it --name alpine01 alpine /bin/sh
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
59bf1c3509f3: Pull complete 
Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300
Status: Downloaded newer image for alpine:latest
/ # 
/ # 
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    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
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # 

 再另开一个窗口

[root@localhost ~]# docker run -it --network container:alpine01 --name alpine02 alpine /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    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
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ^C

 #再第一个容器停掉后第二个容器的网络也丢了

11、自定义网络

【1】新建网络

[root@localhost ~]# docker network create my_network
d51fe35c177df6be0a3bf3468e740ecacd650e7ec4113165941a8581a05e2ee9

 【2】先建立一个容器用自定义的额网络

[root@localhost ~]# docker run -it --network my_network --name alpine03 alpine sh

/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    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
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

 【3】再用自定义的网络建立一个容器并用名字ping发现可以ping通

[root@localhost ~]# docker run -it --network my_network --name alpine04 alpine sh

/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    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
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping alpine03
PING alpine03 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.113 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.274 ms
^C
--- alpine03 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.113/0.193/0.274 ms
/ # 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker