Docker 网络

本文最后更新于:2024年3月18日 凌晨

Docker 网络

  • docker网络实现原理是通过veth-pair实现的,veth-pair是一对的虚拟设备接口,总是成对出现的,一段连接协议,另一段彼此相连,充当连接各种虚拟网络设备的桥梁。
  • 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
  • Docker中的所有的网络接口都是虚拟的。

port

  • 快捷地查看端口的绑定情况。
1
$ docker port 容器名端口号。

实例

1
2
$ docker port adoring_stonebraker 5000
127.0.0.1:5001

docker虚拟网络管理

network ls

  • 可以查看所有创建的网络情况。
1
2
3
4
5
6
7
$ docker network ls

NETWORK ID NAME DRIVER SCOPE
bf09a744b7c6 bridge bridge local
3e193114b45d hadoop bridge local
e0b336240072 host host local
3040b975b80d none null local

network inspect

  • 查看docker网络的详细信息。
1
$ docker network inspect 网络编号。

实例

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
$ docker network inspect 3e193114b45d

[
{
"Name": "hadoop",
"Id": "3e193114b45db660af253a1dfa4c5d08947d7a53040c699b3496731a04f91e9a",
"Created": "2020-09-29T06:30:33.919043629Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

network create

  • 新建自定义docker虚拟网络。
  • 当多个容器加入同一个docker虚拟网络后,可以通过容器名替代ip访问其他容器。
1
$ docker network create -d 网络类型网络名。
  • -d:指定 Docker 网络类型,有 bridge,overlay等,其中 overlay 网络类型用于 Swarm mode
  • –subnet:指定子网(192.168.0.0/16)
  • –gateway:指定网关。

network rm

  • 移除docker虚拟网络。
1
$ docker network rm 网络名。

容器连接网络

  • Docker容器运行的时候有host,bridge,none三种网络可供配置。
    • 默认是bridge,即桥接网络,以桥接模式连接到宿主机。
    • host是宿主网络,即与宿主机共用网络。
    • none则表示无网络,容器将无法联网。

birdge

  • 使用host.docker.internal这个特殊的DNS名称来解析宿主机IP
  • 使用容器名解析其他容器的IP,在 Docker Compose 中也可以使用服务名解析其他容器的IP
1
$ docker run -d -p 主机端口:容器端口容器名。
  • -P:是容器内部端口随机映射到主机的高端口。
  • -p:是容器内部端口绑定到指定的主机端口。
  • 另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1
1
2
3
4
5
6
7
$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
95c6ceef88ca training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker
33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik
fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
  • 这样我们就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口。
  • 上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp

host

  • 当容器使用host网络时,容器与宿主共用网络。
  • 使用host网络可以使用localhost访问宿主机,因而通用性比上一种方法好。
  • 但是,由于host网络没有bridge网络的隔离性好,使用host网络安全性不如bridge高。
1
$ docker run -d --name nginx --network host nginx
  • 上面的命令中,没有必要像前面一样使用-p来映射端口,是因为本身与宿主机共用了网络,容器中暴露端口等同于宿主机暴露端口。

连接自定义docker虚拟网络

1
$ docker run -d --network 网络名容器名。

实例

  • 运行一个容器并连接到新建的 test-net 网络:
1
$ docker run -d --name test1 --network test-net ubuntu /bin/bash
  • 打开新的终端,再运行一个容器并加入到 test-net 网络:
1
$ docker run -d --name test2 --network test-net ubuntu /bin/bash

容器与网络连接与断开

network connect

  • 将容器与docker虚拟网络连接。
  • 单个容器可与多个docker虚拟网络连接。
1
$ docker network connect 网络名容器名。

network disconnect

  • 将容器与docker虚拟网络断开连接。
1
$ docker network connect 网络名容器名。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!