Docker 网络
Docker 服务安装完成之后,默认在每个宿主机会生成一个名称为 docker0 的网卡其 IP 地址都是 172.17.0.1/16,并且会生成三种不能类型的网络
root@yt:/data/nginx/conf# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:1eff:fe3b:1439 prefixlen 64 scopeid 0x20<link>
ether 02:42:1e:3b:14:39 txqueuelen 0 (Ethernet)
RX packets 127 bytes 14173 (14.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 158 bytes 15551 (15.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
复制代码
另外会额外创建三个默认网络,用于不同的使用场景
root@yt:/data/nginx/conf# docker network list
NETWORK ID NAME DRIVER SCOPE
c8ba4f5106da bridge bridge local
4c4c8c5bdfbb host host local
f5bef3dfe491 none null local
复制代码
bridge:桥接网络,默认使用的模式,容器基于 SNAT 进行地址转换访问宿主机以外的环境
host:直接使用宿主机的网络( 不创建 net namespace),性能最好,但是容器端口不能冲突
none:容器不会分配有效的 IP 地址(只有一个回环网卡用于内部通信),用于离线数据处理等场景
本文主要使用 bridge 和 container 网络模式
Docker 网络 bridge 模式
docker 的默认模式即不指定任何模式就是 bridge 模式,也是目前使用比较多的网络模式,此模式创建的容器会为每一个容器分配自己的网络 IP 等信息,并将容器连接到一个虚拟网桥与外界通信
启动容器不指定--net 参数默认就是 bridge 模式,使用-p 实现宿主机和 docker 容器的端口映射,下面是将宿主机的 81 端口映射到容器的 80 端口。
root@yt:~# docker run -it -d --name nginx-web1-bridge-test-container -p 81:80 --net=bridge nginx:1.20.2
495b651da50023a89e40abc967b5d5641ca6ffca66abbd1dc185ab5c411607e5
root@yt:~#
root@yt:~#
root@yt:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
495b651da500 nginx:1.20.2 "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp nginx-web1-bridge-test-container
f45b71664cab nginx:1.20.2 "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp wonderful_khayyam
复制代码
访问 81 端口,访问正常
root@yt:~# curl localhost:81
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@yt:~#
复制代码
Docker 网络-container 模式
Container 模式即容器模式,使用参数 --net=container:目标容器名称/ID 指定,使用此模式创建的容器需指定和一个已经存在的容器共享一个网络 namespace,而不会创建独立的 namespace,即新创建的容器不会创建自己的网卡也不会配置自己的 IP,而是和一个已经存在的被指定的目标容器共享对方的 IP 和端口范围,因此这个容器的端口不能和被指定的目标容器端口冲突,除了网络之外的文件系统、用户信息、进程信息等仍然保持相互隔离,两个容器的进程可以通过 lo 网卡及容器 IP 进行通信。
创建容器
root@yt:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@yt:~# docker run -it -d --name nginx-container -p 80:80 --net=bridge nginx:1.22.0-alpine
b2d02b67330317cdbc6d23cc1f8b1dac596d2419711e45149941c347f8f0fa98
root@yt:~# docker run -it -d --name php-container --net=container:nginx-container php:7.4.30-fpm-alpine
73f91263ee10215de48ba85402015660c9d346cbf2794ee3c60837e9fdd68e64
root@yt:~#
复制代码
查看容器 ip,可以看到两个容器的 ip 是相同的
root@yt:~# docker exec -it nginx-container sh
/ # ip a
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
36: eth0@if37: <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
/ # exit
root@yt:~# docker exec -it php-container sh
/var/www/html # ip a
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
36: eth0@if37: <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
/var/www/html # exit
root@yt:~#
复制代码
评论