Docker容器网络

前言

Docker有三种网络连接方式, bridgehostnone.
Docker会自动创建3个网络, 每种1个.

1
2
3
4
5
docker network ls
# NETWORK ID NAME DRIVER SCOPE
# 7b083adc391a bridge bridge local
# 5855c878dc68 host host local
# 9895a4ab897d none null local

bridge 网络隔离

默认的container使用的是bridge连接, container使用--link <container>可以连接到其他的container.
做到网络隔离的效果.

比如

1
2
3
4
5
6
7
8
9
10
11
# 1. 创建一个 bridge1 容器, 并查看ip地址
docker run -d --name bridge1 busybox /bin/sh -c "ping 192.168.0.1"
docker exec -it bridge1 ip a

# 2. 创建一个 bridge2 容器, 并 ping bridge1 的 ip 地址
docker run -d --name bridge2 --link bridge1 busybox /bin/sh -c "ping 192.168.0.1"
docker exec -it bridge2 /bin/ping bridge1的IP地址
docker exec -it bridge2 /bin/ping bridge1

# 3. 默认的 bridge 是单向的, bridge1 ping bridge2 失败
docker exec -it bridge1 /bin/ping bridge2

发现bridge2可以直接ping bridge1, 不用输入IP地址.
因为--link bridge1相当于给bridge2添加了一条DNS解析.
而且, 默认的 bridge 是单向的, 这句话先记着, 后面讲

我们可以自己创建一个bridge, 做网络隔离.

1
2
3
4
5
6
7
8
9
10
# 1. 创建自己的 bridge
docker network create -d bridge my-bridge
docker network ls

# 2. 创建一个新的 container 连接到 my-bridge
docker run -d --name bridge3 --link bridge1 --network my-bridge busybox /bin/sh -c "ping 192.168.0.1"

# 3. ping bridge1 失败
docker exec -it bridge3 /bin/ping bridge1的IP地址
docker exec -it bridge3 /bin/ping bridge1

bridge1 连接到 my-bridge上, 注意, 此时 bridge1 仍然存在于默认的 bridge 上.

1
2
3
4
5
6
7
8
9
10
# 1. 把 bridge1 连接到 my-bridge
docker network connect my-bridge bridge1

# 2. ping bridge1 成功
docker exec -it bridge3 /bin/ping bridge1的IP地址
docker exec -it bridge3 /bin/ping bridge1

# 3. ping bridge3 成功
docker exec -it bridge1 /bin/ping bridge3的IP地址
docker exec -it bridge1 /bin/ping bridge3

注意, 我们没有给bridge1添加--link bridge3, 只是连接到 my-bridge, 却可以ping bridge3.
因为和默认的bridge不同, 自己创建的bridge默认是双向的.

host 共享 network namespace

如果我们用Docker启动了一个nginx服务器.
此时, 只有宿主机可以访问Docker容器里的nginx服务器.

1
2
3
4
5
6
7
8
# 1. 运行本地服务器 nginx
docker run -d --name web-local nginx
# 2. 查看container的容器地址, 默认连接到 bridge 上
# 看 Containers 下的 IPv4Address, 得知 IP 地址为 172.17.0.2
docker network inspect bridge
# 3. 测试连接 nginx, 访问成功
ping 172.17.0.2
curl http://172.17.0.2

在宿主机里可以访问这个nginx, 但是在局域网的其他机器上, 却不能访问http://172.17.0.2.
我们需要把宿主机里的nginx暴露到外部来, 使用端口映射达到这个目的.
container80端口, 映射到宿主机的8080端口, 这样, 我们直接访问宿主机的8080端口, 就可以间接的访问到nginx.

1
docker run -d -p 8080:80 --name web-port-map nginx

以上文字和host毫无关联, 只是为下文做铺垫.
host可以共享宿主机的network namespace, 关于Linux network namespace可以看我的另一篇文章.
把它想象成一个网络沙箱即可.
还是用nginx做个简单例子, 我们从上面可以知道部署nginx需要做端口映射.
但是使用host共享宿主机的network namespace就可以不用做端口映射.

1
docker run -d --name web-host --network host nginx

注意, 这里没有使用端口映射.
然而, 我们依旧能在外部, 使用宿主机的IP地址, 访问到80端口的nginx.

none 断网操作

一般用于安全性, 保密性较高的程序.
直接隔离网络, 断网.

1
2
3
4
5
6
docker run -d --name net-none --network none busybox /bin/sh -c "while true; do sleep 3600;done"
docekr exec -it net-none ip a
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
# 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

点击进入云乞讨模式!
  • 本文作者: Ahaochan
  • 本文链接: Docker_network
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
0%