Docker 容器网络
网络只不过是一个区域【数据交流】
- 默认情况下,所有容器都运行在 Docker 默认的网络空间中。
- 在默认网络中,每个容器都可以与其他容器通信,我们可以创建网络隔离。
Docker 网络类型
一般情况,分三种:
- none:对于这个容器,禁用所有网络
- host:对于独立容器,直接使用宿主机的网络
- bridge:配置桥接网络,桥接网络使用软件桥接,允许连接到同一桥接网络的容器进行通信,同时提供与未连接到该桥接网络的容器的隔离。默认使用的网络模式【启动 Docker 时,会自动创建一个默认的桥接网络】
默认桥接网络的一个缺点是不支持使用 DNS 自动发现容器服务。因此,如果您希望属于默认网络的容器能够相互通信,则必须使用
--link
选项静态允许通信发生。此外,通信需要容器之间的端口转发。并采用的复杂配置模式:overlay, ipvlan, macvlan 三者分别覆盖网络、控制 IP、控制 MAC
开始测试前需要两个容器 container
- 容器 A:
docker run -dit --name c-a alpine ash
- 容器 B:
docker run -dit --name c-b alpine ash
-it 应该都知道,
-d
是挂后台的意思
- alpine 镜像是基于 Alpine Linux 的最小 Docker 镜像,一般进行测试使用
- ash 是 shell,属于 Bourne shell 简化版本,特点是占用系统资源最少,感兴趣可以去学习,不过主流是 bash, zsh
上面在创建时,并没有什么特别的,根据默认创建那么它们应该是使用相同给默认桥接网络
learn@debian10:~/work$ docker network ls
NETWORK ID NAME DRIVER SCOPE
c8e2262fa6ef bridge bridge local
5050dfe48c19 host host local
ac4d3767e763 none null local
默认 bridge 网络的名称也是 bridge,追查 c8e2262fa6ef
网络,就是默认 bridge 那个使用 docker network inspect <network-name|network-id>
learn@debian10:~/work$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "c8e2262fa6ef5bf351c325efe2bebf715c8174641ee3be711e2989aed13c8803",
"Created": "2023-04-09T20:35:16.356724826+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": {
"83358fcb0195b367b553d7bb610d09a0f64bdbf77afb4b55a2d2371e1b69c1e9": {
"Name": "c-b",
"EndpointID": "1e9a8d123a4b38af5119185318bc43214b64ea49c2edb197ec986f136ba44578",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"9fe00453457a633a650d049083cc85c39b6b55a617e2d3b49d86864a1231d7e7": {
"Name": "c-a",
"EndpointID": "8a69f2d9e54411358b79138b3c662185c27d6d689d9ea26d289c49a0c9a4f9b9",
"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": {}
}
]
在 Containers
属性是可以看到它连接的两个容器 c-a
和 c-b
- 网络配置中可以看到网关是
172.17.0.1
c-a
分配的 IPv4 是172.17.0.2/16
c-b
分配的 IPv4 是172.17.0.3/16
我们使用 docker attach <container-name>
连接容器
- 说明这个子命令作用是将本地标准流附加到正在运行的容器
learn@debian10:~/work$ docker attach c-a
/ #
接下来我们使用的是 alpine 的 ash 作为 shell 不是 bash,我们已经进入 alpine 的 c-a 容器中
# 查看 c-a 中的网络接口,下面是完整命令,简化是 ip a
# 为什么没有使用 ifconfig,已经快淘汰 ...
ip addr show
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
4: eth0@if5: <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