Docker网络

igxiaoshan Lv5

官网码头工人运行参考 |码头工人文档 (docker.com)

docker网络介绍

  • docker未启动时,默认网络情况

    1
    2
    3
    4
    5
    6
    7
    8

    docker 未启动时,不包含docker0的虚拟网络

    lo: 本地网络(localhost)

    virbr0: 在CentOS7的安装过程中,如果有选择相关虚拟化的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡:它还有一个固定的默认IP地址 192.168.122.1 ),是做虚拟机网桥使用的,其作用是为连接其上的虚拟网卡提供NAT访问外网的功能

    #: 在Linux安装,勾选安装系统时候附带了libvirt服务才会生成的一个东西,如果不需要可以直接将libvirt服务卸载; yum remove libvirt-libs.x86_64
  • docker启动后,网络情况

    1
    2

    docker 启动后,会产生一个名为 docker0 的虚拟网桥

docker网络命令

  • 全部命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    [root@CentOS7_001 zyd]# 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.
    [root@CentOS7_001 zyd]#

  • 查看docker网络模式

    1
    2
    3
    4

    ## 查看docker网络模式命令

    docker network ls
  • 查看docker网络源数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    # 命令结构
    docker network inspect [OPTIONS] NETWORK [NETWORK...]


    [root@CentOS7_001 zyd]# docker network inspect bridge
    [
    {
    "Name": "bridge",
    "Id": "f5a026bc1a0286e3d6d8a5704cf25a60f7cd16e893a9d58f0b3b39a8d350aa28",
    "Created": "2023-07-03T09:44:52.274931144+08:00",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
    "Driver": "default",
    "Options": null,
    "Config": [
    {
    "Subnet": "172.17.0.0/16",
    "Gateway": "172.17.0.1"
    }
    ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
    "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {},
    "Options": {
    "com.docker.network.bridge.default_bridge": "true",
    "com.docker.network.bridge.enable_icc": "true",
    "com.docker.network.bridge.enable_ip_masquerade": "true",
    "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
    "com.docker.network.bridge.name": "docker0",
    "com.docker.network.driver.mtu": "1500"
    },
    "Labels": {}
    }
    ]

  • 创建docker网络

    1
    2
    3
    4
    # 命令结构
    docker network create [OPTIONS] NETWORK

    docker network create my_network
  • 删除docker网络

    1
    2
    3
    4
    # 命令结构
    docker network rm NETWORK [NETWORK...]

    docker network rm my_network

docker网络作用

容器间的互联和通信以及端口映射

容器IP变动的时候可以通过服务名直接网络通信而不受到影响

docker网络模式

网络模式介绍

Network Description 使用
none No networking in the container. 容器有独立的 Network namespaces ,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接, IP等 –network none
bridge (default) Connect the container to the bridge via veth interfaces. 为每一个容器分配、设置IP等,并将容器连接到一个 'docker0' 虚拟网桥,默认为该模式 –network bridge
默认使用docker0
host Use the host’s network stack inside the container. 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 –network host
container:<name|id> Use the network stack of another container, specified via its name or id. 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等 –network container:NAME或容器ID指定
NETWORK Connects the container to a user created network (using docker network create command) 将容器连接到用户创建的网络(使用命令)

容器实例内默认网络IP生产规则

案例

  • 成功创建两个ubuntu容器u1u2

    1
    2
    3
    4
    5
    [root@CentOS7_001 ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    dd1fcd31d420 ubuntu "/bin/bash" About a minute ago Up 5 seconds u2
    1dbdb42b4518 ubuntu "/bin/bash" 8 minutes ago Up 3 minutes u1
    [root@CentOS7_001 ~]#
  • 查看u1u2内部network实例

    u1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    [root@CentOS7_001 ~]# docker inspect u1 |tail -n 20
    "Networks": {
    "bridge": {
    "IPAMConfig": null,
    "Links": null,
    "Aliases": null,
    "NetworkID": "f5a026bc1a0286e3d6d8a5704cf25a60f7cd16e893a9d58f0b3b39a8d350aa28",
    "EndpointID": "ae82e5b9bc2c3b2d6d35fed23f836b712e1dc7a7f53ff6750279b9ea8273400a",
    "Gateway": "172.17.0.1", # 固定网关,不会变化
    "IPAddress": "172.17.0.2", # 容器ip
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:11:00:02",
    "DriverOpts": null
    }
    }
    }
    }
    ]
    [root@CentOS7_001 ~]#

    u2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    [root@CentOS7_001 ~]# docker inspect u2 |tail -n 20
    "Networks": {
    "bridge": {
    "IPAMConfig": null,
    "Links": null,
    "Aliases": null,
    "NetworkID": "f5a026bc1a0286e3d6d8a5704cf25a60f7cd16e893a9d58f0b3b39a8d350aa28",
    "EndpointID": "072a0543108455076d68be272cd03d395ae8be6a7fde1dcac461e86416f61a50",
    "Gateway": "172.17.0.1", # 固定网关
    "IPAddress": "172.17.0.3", # 容器ip
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:11:00:03",
    "DriverOpts": null
    }
    }
    }
    }
    ]
    [root@CentOS7_001 ~]#

    通过查看u1u2容器实例对比,固定网关IP为172.17.0.1,容器IP自动递增

  • 测试,关闭u2,启动容器u3查看内部实例

    关闭u2

    1
    2
    3
    4

    [root@CentOS7_001 ~]# docker stop u2
    u2
    [root@CentOS7_001 ~]#

    启动u3

    1
    2
    3
    4
    5
    6
    7
    8
    [root@CentOS7_001 ~]# docker run -it --name u3 ubuntu /bin/bash
    root@97b2e870414a:/# [root@CentOS7_001 ~]#
    [root@CentOS7_001 ~]#
    [root@CentOS7_001 ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    97b2e870414a ubuntu "/bin/bash" 10 seconds ago Up 9 seconds u3
    1dbdb42b4518 ubuntu "/bin/bash" 15 minutes ago Up 9 minutes u1
    [root@CentOS7_001 ~]#

    查看u3容器实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    [root@CentOS7_001 ~]# docker inspect u3 |tail -n 20
    "Networks": {
    "bridge": {
    "IPAMConfig": null,
    "Links": null,
    "Aliases": null,
    "NetworkID": "f5a026bc1a0286e3d6d8a5704cf25a60f7cd16e893a9d58f0b3b39a8d350aa28",
    "EndpointID": "a4c555dec467f15fc947eee14cfde60c4e4ea7e82dfbd7d48c4f538ceeb71ea2",
    "Gateway": "172.17.0.1", # 固定网关
    "IPAddress": "172.17.0.3", # 容器ip
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:11:00:03",
    "DriverOpts": null
    }
    }
    }
    }
    ]
    [root@CentOS7_001 ~]#

结论

docker 内部的容器IP是会发生变化的

网络模式案例说明

bridge

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

  • 查看 bridge 网络详细信息

    详细说明

    详情版

1
2
3
4
5
6
7
8
9
10
11
12
1.Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个ip地址,称为Container-IP,同时Docker网络是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP通信。

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

3.网桥docker0创建一对对等虚拟设备接口,一个叫veth,另一个叫eht0,成对匹配。
3.1.整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口都叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
3.2.每个容器实例内部也有一块网卡,每个接口都叫eth0;
3.3.docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配

通过上述,讲宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的IP,此时两个容器的网络是互通的。

详细看下图

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
### 启动两个容器

[root@CentOs7_001 ~]# docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
faa368fd7fc21a3e98cea3bf281d0698ac041a0fbdc7e2563c93132a36db3242
[root@CentOs7_001 ~]# docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
bbf99486996455ad7b50b4d8cde3ed1af6c66b50ff43a01c696c6137cbc67132
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbf994869964 billygoo/tomcat8-jdk8 "catalina.sh run" 7 seconds ago Up 4 seconds 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp tomcat82
faa368fd7fc2 billygoo/tomcat8-jdk8 "catalina.sh run" 16 seconds ago Up 13 seconds 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tomcat81
[root@CentOs7_001 ~]#

### 查看此时网络状况

[root@CentOs7_001 ~]# ip addr | tail -n 8
10: vethf976c54@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 22:45:d0:e1:9c:0b brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::2045:d0ff:fee1:9c0b/64 scope link
valid_lft forever preferred_lft forever
12: vethd6d8297@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether ca:cb:0f:fb:c9:ba brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::c8cb:fff:fefb:c9ba/64 scope link
valid_lft forever preferred_lft forever
[root@CentOs7_001 ~]#


### 进入容器中,查看两个容器内部网络
#### tomcat81
[root@CentOs7_001 ~]# docker exec -it tomcat81 /bin/bash
root@faa368fd7fc2:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@faa368fd7fc2:/usr/local/tomcat#

#### tomcat82

[root@CentOs7_001 ~]# docker exec -it tomcat82 /bin/bash
root@bbf994869964:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@bbf994869964:/usr/local/tomcat#


#### 图示如下

bridge网络案例

host

直接使用宿主机的IP与外界进行通信,不再需要额外进行NAT转换

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

如下图

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
### 启动一个容器,使用host模式

[root@CentOs7_001 ~]# docker run -d -p 8083:8080 --net=host --name tomcat83 billygoo/tomcat8-jdk8
WARNING: Published ports are discarded when using host network mode
cba24b7557befd5e8243780ce13ba2052aa26d703849580d557eee732fbf0642
[root@CentOs7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cba24b7557be billygoo/tomcat8-jdk8 "catalina.sh run" 3 seconds ago Up 2 seconds tomcat83
[root@CentOs7_001 ~]#


### WARNING: Published ports are discarded when using host network mode
#### 问题:
#### docker启动时遇到warning警告
#### 原因:
#### docker启动时,指定 --net=host 或者 -net=host,如果还指定了 -p 映射端口,这个时候就会有此警告;并且通过 -p 设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增
#### 解决:
#### 解决的办法就是使用docker的其他网络模式,例如 -net=bridge 这样可以解决问题;或者直接无视


### 避免 warning 警告产生
#### 删除之前的tomcat83容器后重试
[root@CentOs7_001 ~]# docker run -d --net=host --name tomcat84 billygoo/tomcat8-jdk8
d1fb6721b30145f01a78676aded8c200043a4479ebbfd494e631a53319789e57
[root@CentOs7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1fb6721b301 billygoo/tomcat8-jdk8 "catalina.sh run" 4 seconds ago Up 2 seconds tomcat84
bbf994869964 billygoo/tomcat8-jdk8 "catalina.sh run" 6 hours ago Up 6 hours 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp tomcat82
faa368fd7fc2 billygoo/tomcat8-jdk8 "catalina.sh run" 6 hours ago Up 6 hours 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tomcat81
[root@CentOs7_001 ~]#


###########################################################
### 对比与bridge模式的区别

[root@CentOs7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1fb6721b301 billygoo/tomcat8-jdk8 "catalina.sh run" 4 seconds ago Up 2 seconds tomcat84
bbf994869964 billygoo/tomcat8-jdk8 "catalina.sh run" 6 hours ago Up 6 hours 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp tomcat82
faa368fd7fc2 billygoo/tomcat8-jdk8 "catalina.sh run" 6 hours ago Up 6 hours 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tomcat81
[root@CentOs7_001 ~]# docker stop bbf994869964 faa368fd7fc2
bbf994869964
faa368fd7fc2
[root@CentOs7_001 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 63070sec preferred_lft 63070sec
inet6 fe80::5054:ff:fe4d:77d3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:ac:f9:6b brd ff:ff:ff:ff:ff:ff
inet 192.168.33.101/24 brd 192.168.33.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:feac:f96b/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:d5:77:0a:48 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d5ff:fe77:a48/64 scope link
valid_lft forever preferred_lft forever
[root@CentOs7_001 ~]#


### 进入到容器内部
[root@CentOs7_001 ~]# docker exec -it tomcat84 /bin/bash
root@CentOs7_001:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 63033sec preferred_lft 63033sec
inet6 fe80::5054:ff:fe4d:77d3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:ac:f9:6b brd ff:ff:ff:ff:ff:ff
inet 192.168.33.101/24 brd 192.168.33.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:feac:f96b/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:d5:77:0a:48 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d5ff:fe77:a48/64 scope link
valid_lft forever preferred_lft forever
root@CentOs7_001:/usr/local/tomcat#


### 查看容器内部网络情况
[root@CentOs7_001 ~]# docker inspect tomcat84 | tail -n 20
"Networks": {
"host": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "71cbdee3627d592c4b7b4609b17241677f519c59222ba6709968b60fd0cade1f",
"EndpointID": "444f8d7347dea030bf77256fa19dc195eda5c0f2407b2da8633465a6384b9d18",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
}
}
]
[root@CentOs7_001 ~]#

host网络案例



在使用host网络模式时,不需要设置 -p 的端口映射,如何访问容器?

http:宿主机IP:8080/

可以直接使用IP+默认端口号,可以访问成功;因为此时容器的IP借用主机的,所以容器共享宿主机网络IP;这样的好处就是外部主机和容器可以直接通信

none

在none模式下,并不为Docker容器进行网络配置

也就是说,这个Docker容器没有网卡、IP、路由等信息;只有一个lo需要我们自己为Docker容器添加网卡、配置IP等

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

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
### 启动一个容器,使用none模式

[root@CentOs7_001 ~]# docker run -d --net=none --name tomcat85 billygoo/tomcat8-jdk8
5bea8ea317d59d7723f0ec6bc4baaabee459c81cde607056160e5bfe7a44e04c
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5bea8ea317d5 billygoo/tomcat8-jdk8 "catalina.sh run" 12 seconds ago Up 11 seconds tomcat85
d1fb6721b301 billygoo/tomcat8-jdk8 "catalina.sh run" 18 minutes ago Up 18 minutes tomcat84
[root@CentOs7_001 ~]#

#### 容器内部网络情况
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]# docker inspect tomcat85 |tail -n 20
"Networks": {
"none": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "020e19a8bdbe1fc5e7513f84fce8f6e2f2ce40bd3d3e7bce6de637bdcceec218",
"EndpointID": "a90b5635332b784a5e756aac6d4c007c1237dad5877940aeef4cfacd6834c44f",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
}
}
]
[root@CentOs7_001 ~]#

#### 容器实例内部网络情况
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]# docker exec -it tomcat85 /bin/bash
root@5bea8ea317d5:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
root@5bea8ea317d5:/usr/local/tomcat#

none网络案例

container

container网络模式

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

演示案例

由于tomcat会公用同一个ip和同一个端口,导致端口冲突,不适合使用tomcat演示;

换个镜像演示

Alpine Linux是一款独立的,非商业的通用的Linux发行版,专为追求安全性,简单性和资源效率的用户而设计.因为它小,简单而且安全;所以作为基础镜像是非常好的一个选择.

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## 启动两个alpine容器
### alpine1
[root@CentOs7_001 ~]# docker run -it --name alpine1 alpine /bin/sh
/ # ip addr
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:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #

### alpine2
[root@CentOs7_001 ~]# docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
/ # ip addr
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:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #


网络案例

由于此时 alpine2依赖 alpine1的网络;如果此时关闭 alpine1;在观察alpine2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 演示案例,关闭alpine1服务;观察alpine2容器网络
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
230b90dfcb66 alpine "/bin/sh" 10 minutes ago Up 10 minutes alpine2
a8a00f4e12c3 alpine "/bin/sh" 12 minutes ago Up 11 minutes alpine1
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]# docker stop alpine1
alpine1
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
230b90dfcb66 alpine "/bin/sh" 10 minutes ago Up 10 minutes alpine2
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]#
[root@CentOs7_001 ~]# docker exec -it alpine2 /bin/sh
/ # ip addr
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
/ #

### 随着alpine1关闭;alpine2网络通道也关闭了,只剩下lo模式

自定义网络

  • docker link 介绍

容器互联

– link 可以通过容器名互相通信,容器间共享环境变量

– link 主要用来解决两个容器通过ip地址连接时容器ip地址会变的问题

–link案例

1
2
3
4
5
6
7
## 先创建启动mysql容器
docker run -dti --name db --restart=always -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=blog mysql:5.7
# -dti:指定容器运行在交互模式下,并将其连接到终端
# --name db:为容器指定名称 db,以便后续操作直接使用容器名
# --restart=always:指定容器在退出后总是自动重启
# -e MYSQL_ROOT_PASSWORD=root:设置mysql的root用户密码为root
# -e MYSQL_DATABASE=blog:创建一个名为blog的数据库
1
2
3
4
5
6
7
8
9
10
## 创建启动源容器wordpress
### 使用--link
### docker run -dti --name 容器名 --restart=always -v 本地目录:容器内目录 -p 本地端口:容器端口 --link 数据库容器名:数据库容器别名 wordpress镜
docker run -dti --name blog --restart=always -v /mydata/web:/var/www/html -p 8089:80 --link db:mysql wordpress
# -dti:指定容器运行在交互模式下,并将其连接到终端
# --name blog:为容器指定名称 blog,以便直接使用容器名
# --restart=always:指定容器在退出后总是自动重启
# -v /mydata/web:/var/www/html:将宿主机上 /mydata/web 目录映射到容器中的 /var/www/html 目录,实现数据持久化
# -p 8089:80:将容器内部的80端口映射到宿主机上的8089端口,以便外部网络可以访问容器中的网站
# --link db:mysql:将容器与另一个名为 db 的容器连接起来,并设置别民为 mysql,以便在后续操作中引用该容器

验证: 连通性验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
## 启动的容器host

[root@CentOS7_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c48b8c6bc4d2 wordpress "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:8089->80/tcp, :::8089->80/tcp blog
580cf83c51ab mysql:5.7 "docker-entrypoint.s…" 36 minutes ago Up 36 minutes 3306/tcp, 33060/tcp db
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]# docker exec -it db cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 580cf83c51ab

[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]# docker exec -it blog cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 mysql 580cf83c51ab db
172.17.0.3 c48b8c6bc4d2
[root@CentOS7_001 ~]#

自定义网络案例

  • 使用自定义网络之前
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

# 启动两个tomcat容器
docker run -dti --name tomcat1 -p 8081:8080 billygoo/tomcat8-jdk8
docker run -dti --name tomcat2 -p 8082:8080 billygoo/tomcat8-jdk8


## 运行结果
[root@CentOS7_001 zyd-tag]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0708901345c3 billygoo/tomcat8-jdk8 "catalina.sh run" 2 seconds ago Up 1 second 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp tomcat2
7988714376ad billygoo/tomcat8-jdk8 "catalina.sh run" 27 minutes ago Up 27 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tomcat1


## 查看网络情况
[root@CentOS7_001 zyd-tag]# docker exec -it tomcat1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
2935: eth0@if2936: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@CentOS7_001 zyd-tag]#
[root@CentOS7_001 zyd-tag]#
[root@CentOS7_001 zyd-tag]# docker exec -it tomcat2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
3217: eth0@if3218: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@CentOS7_001 zyd-tag]#


## 测试ip互通
[root@CentOS7_001 zyd-tag]# docker exec -it tomcat1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.056 ms
--- 172.17.0.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.052/0.056/0.064/0.008 ms
[root@CentOS7_001 zyd-tag]#
[root@CentOS7_001 zyd-tag]# docker exec -it tomcat2 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.069 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.055 ms
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.050/0.057/0.069/0.011 ms
[root@CentOS7_001 zyd-tag]#


## 测试容器名互通
[root@CentOS7_001 zyd-tag]# docker exec -it tomcat2 ping tomcat1
ping: tomcat1: Name or service not known
[root@CentOS7_001 zyd-tag]# docker exec -it tomcat1 ping tomcat2
ping: tomcat2: Name or service not known
[root@CentOS7_001 zyd-tag]#

  • 使用自定义网络

自定义桥接网卡:自定义网络默认使用的是桥接网络brideg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
## 新建自定义网络
docker network create test_my_network
## 新建两个容器,使用自定义的网络
docker run -dti --name tomcat1 -p 8083:8080 --net test_my_network billygoo/tomcat8-jdk8
docker run -dti --name tomcat2 -p 8084:8080 --net test_my_network billygoo/tomcat8-jdk8


[root@CentOS7_001 ~]# docker exec -it tomcat1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
3312: eth0@if3313: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:13:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.19.0.3/16 brd 172.19.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]# docker exec -it tomcat2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
3310: eth0@if3311: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:13:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.19.0.2/16 brd 172.19.255.255 scope global eth0
valid_lft forever preferred_lft forever

## 测试容器名互通
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]# docker exec -it tomcat1 ping tomcat2
PING tomcat2 (172.19.0.2) 56(84) bytes of data.
64 bytes from tomcat2.test_my_network (172.19.0.2): icmp_seq=1 ttl=64 time=0.063 ms
64 bytes from tomcat2.test_my_network (172.19.0.2): icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from tomcat2.test_my_network (172.19.0.2): icmp_seq=3 ttl=64 time=0.050 ms
--- tomcat2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.050/0.055/0.063/0.010 ms
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]# docker exec -it tomcat2 ping tomcat1
PING tomcat1 (172.19.0.3) 56(84) bytes of data.
64 bytes from tomcat1.test_my_network (172.19.0.3): icmp_seq=1 ttl=64 time=0.043 ms
64 bytes from tomcat1.test_my_network (172.19.0.3): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from tomcat1.test_my_network (172.19.0.3): icmp_seq=3 ttl=64 time=0.074 ms
64 bytes from tomcat1.test_my_network (172.19.0.3): icmp_seq=4 ttl=64 time=0.054 ms
--- tomcat1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.043/0.058/0.074/0.011 ms
[root@CentOS7_001 ~]#


## 查看容器使用网络
[root@CentOS7_001 ~]# docker inspect tomcat1 |tail -n 22
"Networks": {
"test_my_network": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"2023330c8bc7"
],
"NetworkID": "55af0827e416760bb36df2cf73ee4807651d08ed11f45bf2daf6564da13d2db2",
"EndpointID": "cfaf00328fde61b11da0faeddde7faf4d3cd84a6f57546a44875123d6c924efe",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:03",
"DriverOpts": null
}
}
}
}
]
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]#
[root@CentOS7_001 ~]# docker inspect tomcat2 |tail -n 22
"Networks": {
"test_my_network": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"ac0155a6a48f"
],
"NetworkID": "55af0827e416760bb36df2cf73ee4807651d08ed11f45bf2daf6564da13d2db2",
"EndpointID": "ac26e9de09d09315133ccd034bc07af3b1091be78cdfe04cccc5d7acf52f465b",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:02",
"DriverOpts": null
}
}
}
}
]
[root@CentOS7_001 ~]#

结论

自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都名能通)

贴一个架构图