写点什么

docker 的 bridge,container 网络模式

作者:忙着长大#
  • 2022-10-23
    广东
  • 本文字数:2435 字

    阅读完需:约 8 分钟

Docker 网络

Docker 服务安装完成之后,默认在每个宿主机会生成一个名称为 docker0 的网卡其 IP 地址都是 172.17.0.1/16,并且会生成三种不能类型的网络

root@yt:/data/nginx/conf# ifconfig docker0docker0: 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 listNETWORK ID     NAME      DRIVER    SCOPEc8ba4f5106da   bridge    bridge    local4c4c8c5bdfbb   host      host      localf5bef3dfe491   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.2495b651da50023a89e40abc967b5d5641ca6ffca66abbd1dc185ab5c411607e5root@yt:~# root@yt:~# root@yt:~# docker psCONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES495b651da500   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-containerf45b71664cab   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 andworking. 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     NAMESroot@yt:~# docker run -it -d --name nginx-container -p 80:80 --net=bridge nginx:1.22.0-alpineb2d02b67330317cdbc6d23cc1f8b1dac596d2419711e45149941c347f8f0fa98root@yt:~# docker run -it -d --name php-container --net=container:nginx-container php:7.4.30-fpm-alpine73f91263ee10215de48ba85402015660c9d346cbf2794ee3c60837e9fdd68e64root@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 forever36: 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/ # exitroot@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 forever36: 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 # exitroot@yt:~# 
复制代码


用户头像

忙着长大#

关注

还未添加个人签名 2022-02-09 加入

还未添加个人简介

评论

发布
暂无评论
docker 的 bridge,container网络模式_,docker_忙着长大#_InfoQ写作社区