docker网络基础
了解docker网络
两种docker网络
- 单主机与多主机的docker网络
网络驱动
网络驱动 | 介绍 |
---|---|
bridge | 桥接网络,这是默认的网络驱动程序 |
host | 主机网络 |
overlay | 覆盖网络 |
macvlan | 将mac地址分配给容器,使容器作为网络上的物理设备 |
none | 表示关闭容器的所有网络连接 |
网络插件 | 可以通过Docker安装和使用第三方的网络插件 |
选择网络驱动的原则
- 用户自定义桥接网络最适合用于同一个docker主机上运行多个容器之间需要通信的场景。
- host乌拉盖诺最适用于当网不能与docker主机隔离,而容器的其他地方需要被隔离的场景
- overlay网络适用于不同docker主机上运行的容器需要的通信的场景,或者多个应用程序通过Swarm集群服务一起工作的场景
- macvlan网络适用于从虚拟机迁移过来的场景,或者向网络上的乌力吉一样,拥有独立的mac地址的场景
- 迪斯拉罕网络插件适用与将docker与专用网络栈进行集成的场景
容器的网络模式
创建容器时,可以指定容器的我那个若模式。docker可以有以下四种模式:
一.bridge 模式
1.了解
- 生产环境中被弃用。
- docker守护进程为每一个启动的容器创建一个VETH对 设备。VETH对设备总是成对出现,他们组成了一个数据通道。数据从一个设备进入,就会从另一个设备出来。
- docker守护进程为每一个启动的容器创建一个VETH对 设备。VETH对设备总是成对出现,他们组成了一个数据通道。数据从一个设备进入,就会从另一个设备出来。
- 默认配置运行一个容器,会添加一张VETH的网卡。
- 删除容器,网卡消失。
- docker0 是docker的守护进程一启动,就会在主机上创建docker0的虚拟网桥
2.操作
(1).查看网络连接和查看网络详细信息
[root@hmm ~]# docker network inspect bridge //查看网络详情
[
{
"Name": "bridge",
"Id": "5afc9ac7b6a51ccd2d1a6fe00c6b5e64760817ff084b8d10609cf52686978a49",
"Created": "2024-04-09T16:01:59.731474913+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": {
"0557f384f47cc9a105ea79770dcaa5455c1b501dfb5cd8d2e7844ef18ef1c8cf": {
"Name": "gifted_shannon",
"EndpointID": "5dd14220ecb730e61bafb08715a4acab3ebb4fe5492bbe377fe79da3cdcd524f",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"34f04786c73664ed062d99fc4b8d96a462810e581573f2278ea80d11dbfa548b": {
"Name": "myregistry",
"EndpointID": "b8a0deb96a314ead633c3d7dca013124144cbebac4b385fb7e4e07242f3e55ed",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"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": {}
}
]
[root@hmm ~]# docker network ls //查看网络列表
NETWORK ID NAME DRIVER SCOPE
5afc9ac7b6a5 bridge bridge local
67bc430327bc host host local
5f92e59bee8f none null local
eg:
- 容器的网络桥接信息中,网络和默认桥接网络完全对应
docker守护进程为每一个启动的容器
二.host模式
1.了解host模式
- 选择host模式的容器使用host驱动,直接连接到docker主机网络栈。这种网络模式实质上是关闭docker网络,而让容器直接使用主机操作系统的网络
- host模式没有为容器创建一个隔离的网络环境,容器没有隔离的网络名称空间,也不会获得一个独立的网络名称空间,而是和docker主机共用一个网络名称空间
三.container模式
1.了解
- 主要用于容器和容器的直接频繁交流的情况
- 该模式指定新创建的容器和现有的一个容器,而不是和docker主机共享同一个网络名称空间
- 两个容器除了网络方面,其他的如文件系统,进程列表等还是互相隔离的。两个容器的进程可以通过回环网络接口进行通信的
四.none模式
1.了解 - 将容器放置在自己的网络栈中,但是并不进行任何配置,实际上关闭了容器的网络功能。
五。用户自定义网络
1.了解 - 可以使用docker网络驱动,或第三方网络驱动插件创建一个自定义的网络,然后将多个容器连接到同一个自定义网络
- 用户自定义桥接网络与默认桥接网络的主要区别
- 优点:可以通过名称或者别名互相访问。
2.实操
(1)默认情况下,容器之间不能用别名访问
[root@hmm ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0557f384f47c centos "/bin/bash" 19 minutes ago Up 19 minutes gifted_shannon
34f04786c736 registry:latest "/entrypoint.sh /etc…" 13 days ago Up About an hour 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp myregistry
[root@hmm ~]# docker exec -ti 055 /bin/bash
[root@0557f384f47c /]# 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.151 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.060 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.060/0.105/0.151/0.046 ms
[root@0557f384f47c /]# ping 34f04786c736
ping: 34f04786c736: Name or service not known
[root@0557f384f47c /]# //可以使用ip ping ,但是使用主机名时访问不到
容器之间的通信方案
传统的容器连接
[root@hmm ~]# docker run -tid --name yun3test centos
93baea338e296e65137c58caaa91f4f48495340cbe018e9d3404b44492e47267
[root@hmm ~]# docker run -tid --link yun3test:y3t centos //要连接的容器名字:别名
524cd67dc2fe09e41858443b79a4e8d2cbad443cf432c01707192d40f19e457c
[root@hmm ~]# docker exec -ti 524c /bin/bash
[root@524cd67dc2fe /]# ping y3t //使用定义的别名连接
PING y3t (172.17.0.4) 56(84) bytes of data.
64 bytes from y3t (172.17.0.4): icmp_seq=1 ttl=64 time=0.198 ms
64 bytes from y3t (172.17.0.4): icmp_seq=2 ttl=64 time=0.054 ms
^C
--- y3t ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.054/0.126/0.198/0.072 ms
[root@524cd67dc2fe /]#
从外部访问容器
1.介绍
简单来说就是 将容器的一个端口映射到docker主机上的一个端口,允许从外部网络通过端口访问容器
要让容器能够被外部网络(docker主机外部)或者那些未连接到该端口访问容器。
2.实例:
root@hmm ~]# docker run -tid -p 8080:80 --name web-test httpd
7461b82860224f05276b12cae589fd89fa213ccc15d3222e08232c02125608d3
[root@hmm ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7461b8286022 httpd "httpd-foreground" 8 seconds ago Up 7 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp web-test
34f04786c736 registry:latest "/entrypoint.sh /etc…" 2 weeks ago Up 36 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp myregistry
[root@hmm ~]# curl 10.0.0.10:8080
<html><body><h1>It works!</h1></body></html>
[root@hmm ~]#
补充:-p和-P的区别
- -p(静态
[root@hmm ~]# docker run -tid --name web-test3 -p 8081:80 httpd
efbee0e06554994c394c01668ad83147b8d7b47aafc70b81559841915d3cd1b6
[root@hmm ~]# docker port web-test3
80/tcp -> 0.0.0.0:8081
80/tcp -> [::]:8081
[root@hmm ~]# curl http://10.0.0.10:8081
<html><body><h1>It works!</h1></body></html>
[root@hmm ~]#
- -P(动态
[root@hmm ~]# docker run -tid --name web-test2 -P httpd
0b7a0b621f553c8668b274be47aa4da30e80ea038e55f427cbda686742b8e649
[root@hmm ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b7a0b621f55 httpd "httpd-foreground" About a minute ago Up 59 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp web-test2
7461b8286022 httpd "httpd-foreground" 7 minutes ago Up 7 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp web-test
34f04786c736 registry:latest "/entrypoint.sh /etc…" 2 weeks ago Up 43 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp myregistry
[root@hmm ~]# docker port web-test2
80/tcp -> 0.0.0.0:32768
80/tcp -> [::]:32768
[root@hmm ~]# curl http://10.0.0.10:32768
<html><body><h1>It works!</h1></body></html>
[root@hmm ~]# //可以使用多个-p设置任意数量的端口映射
了解容器的网络配置用法
一.设置容器网络连接
1.容器启动时,可以用--network选项设置容器要连接的网络,即网络模式
- none:使用none模式,容器不联网
- bridge:使用默认桥接网络
- hosy:使用默认的主机网络
- container:容器使用另一个容器的网络
- 网络名或网络ip:连接自定义网络,通常用这个。
2.案例:
none:
[root@hmm ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9157d67bb75c bridge bridge local
67bc430327bc host host local
5f92e59bee8f none null local
[root@hmm ~]# docker run --network none -tid --name none-test1 centos
e488e527ebc0b4a9c0b1b3706d47b5338b045d58aba0a8f372934bb4b6b4f7bf
[root@hmm ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e488e527ebc0 centos "/bin/bash" 44 seconds ago Up 43 seconds none-test1
411f6067d60a centos "/bin/bash" 2 minutes ago Up 2 minutes none-test
efbee0e06554 httpd "httpd-foreground" 12 minutes ago Up 12 minutes 0.0.0.0:8081->80/tcp, :::8081->80/tcp web-test3
0b7a0b621f55 httpd "httpd-foreground" 15 minutes ago Up 15 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp web-test2
7461b8286022 httpd "httpd-foreground" 22 minutes ago Up 22 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp web-test
34f04786c736 registry:latest "/entrypoint.sh /etc…" 2 weeks ago Up 58 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp myregistry
[root@hmm ~]# docker inspect none-test1 --format="{{ json .HostConfig.NetworkMode }}" //json后面需要空格 表示应用的变量
"none"
[root@hmm ~]#
二.为容器添加网络作用域的别名
1.解释
容器在网络作用域中允许有别名,别名在所在的网络中可以直接访问
使用--network-alias选项指定容器在网络中的别名
2.实例
- 网络作用域别名只支持用户自定义网络
错误:
[root@hmm ~]# docker run -tid --name test-alias --network-alias websrv can
docker: network-scoped aliases are only supported for user-defined networks.
See 'docker run --help'.
[root@hmm ~]#
//使用用户默认的网络使用自定义 是不支持的
成功:
[root@hmm ~]# docker network create --driver bridge yun3-nat
167e7d89276f2c1974ee208271a4f97b31ef1f836856360179bc8cff19b5ed7a
[root@hmm ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9157d67bb75c bridge bridge local
67bc430327bc host host local
5f92e59bee8f none null local
167e7d89276f yun3-nat bridge local
[root@hmm ~]# docker run -tid --name test-alias01 --network yun3-nat --network-alias ta01 centos
c88e88c2559b8572bcfe84b36d2272525ff0995fc7429d9cfe9ebb9bccd5c2ab
[root@hmm ~]# docker run -tid --name test-alias02 --network yun3-nat --network-alias ta02 centos
59b7a48e36393570e5ff57b4e2dc22ba6e0123adb2ad44972ad95bfdc1dcaed0
[root@hmm ~]# docker exec -ti test-alias01 /bin/bash
[root@c88e88c2559b /]# ping ta02
PING ta02 (172.18.0.3) 56(84) bytes of data.
64 bytes from test-alias02.yun3-nat (172.18.0.3): icmp_seq=1 ttl=64 time=0.247 ms
^C
--- ta02 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.247/0.247/0.247/0.000 ms
[root@c88e88c2559b /]# ping alias02
ping: alias02: Name or service not known
[root@c88e88c2559b /]# ping test-alias02
PING test-alias02 (172.18.0.3) 56(84) bytes of data.
64 bytes from test-alias02.yun3-nat (172.18.0.3): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from test-alias02.yun3-nat (172.18.0.3): icmp_seq=2 ttl=64 time=0.146 ms
^C
--- test-alias02 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1004ms
rtt min/avg/max/mdev = 0.049/0.097/0.146/0.049 ms
[root@c88e88c2559b /]#
三.设置容器的ip地址
四.设置容器的网络接口mac地址
五.设置