> 文章列表 > Docker网络详解

Docker网络详解

Docker网络详解

文章目录

    • 一、理解docker0网桥
    • 二、Docker网络模式
    • 三、Docker容器互联
    • 四、自定义网络

一、理解docker0网桥

  • 安装docker的时候,会生成一个docker0的虚拟网桥。

  • 每运行一个docker容器都会生成一个veth设备对,这个veth一个接口在容器里,一个接口在物理机上

安装网桥管理工具:

yum install bridge-utils -y

brctl show 可以查看到有一个docker0的网桥设备,下面有很多接口,每个接口都表示一个启动的docker容器,因为我在docker上启动了很多容器,所以interfaces较多,如下所示:

brctl show

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jz57eCx0-1681982020882)(D:\\MD归档文档\\IMG\\image-20230416124427955.png)]

二、Docker网络模式

run容器时 可以使用--network选项指定容器的网络模式,Docker有以下4中网络模式:

  • bridge模式:默认 使用–network=bridge指定
  • host模式:使用–network=host指定
  • none模式:使用–network=none指定
  • container模式:使用 --network=container:NAME指定

1、bridge模式:

  • 默认选择bridge的情况下,容器启动后会通过DHCP自动获取一个地址。
docker run -itd --name bridge --net=bridge centos
docker exec -it bridge /bin/bash
ip a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7CEMExEP-1681982020883)(D:\\MD归档文档\\IMG\\image-20230416114239871.png)]

2、host模式:

  • 指共享宿主机的网络
  • 如下案例:使用nginx镜像运行容器,会将80端口暴露在宿主机上面,直接宿主机就可以访问到80端口
docker run -itd --name host --net=host nginxcurl  http://127.0.0.1

3、none模式:

  • Docker 网络 none 模式不配置网络,只有 lo 网卡
docker run -itd --name none --net=none --privileged=true centos
docker exec -it none /bin/baship addr

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHqSxpx3-1681982020884)(D:\\MD归档文档\\IMG\\image-20230416113051841.png)]

4、container模式:

  • Docker 网络 container 模式是指,创建新容器的时候,通过–net container 参数,指定其和已经存在的某个容器共享一个 Network Namespace。

  • 如下图所示,右方黄色新创建的 container,其网卡共享左边容器。因此就不会拥有自己独立的 IP,而是共享左边容器的 IP 172.17.0.2,端口范围等网络资源,两个容器的进程通过 lo 网卡设备通信。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x4vsqxh7-1681982020884)(D:\\MD归档文档\\IMG\\image-20230416113255038.png)]

docker run -itd --name none --net=none --privileged=true centos
docker run -itd --name client-1 --net=container:none centos  # 共享none容器网络docker exec -it client-1 /bin/bash
ip addr

三、Docker容器互联

如果两台容器在同一个网卡情况下,使用IP地址是可以ping通对方的,但是不可以使用域名ping通对方,可以使用 --link 设置网络别名,之后使用别名访问对方。

格式如下:

docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE][COMMAND]

列如:

docker run -itd --name nginx nginx:1.17.1# 运行client容器,并且互联nginx容器设置别名为web
docker run -itd --name client --link=nginx:web centos:7# 进入client容器使用别名访问nginx容器
docker exec -it client /bin/bash
curl http://web

容器互联实现方式其实是在hosts文件添加相应内容,下面是client容器hosts文件内容:

172.17.0.3	web adb40f4648f4 nginx
172.17.0.4	fe0f0b9f842a

四、自定义网络

1、自定义网络创建:

创建mynet网络:

docker network create --driver bridge --subnet 10.10.14.0/24 --gateway 10.10.14.1 mynet
docker network ls
  • –driver 网络类型(默认为bridge)
  • –subent 子网(表示一个网段)
  • –gateway 网关

创建容器时指定mynet网络 并且指定IP地址

docker run -itd --name mynet-1 --net=mynet --ip=10.10.14.10 centos

查看 mynet-1 容器详细信息

docker inspect mynet-1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TxWrhjRM-1681982020884)(D:\\MD归档文档\\IMG\\image-20230416120944523.png)]

2、不同网段创建的容器是否可以访问

思考:如下图,不同网段创建的容器是否可以通信呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0PIIiitB-1681982020885)(D:\\MD归档文档\\IMG\\image-20230416122632916.png)]

docker run -itd --name Container-1 --ip=172.17.0.100 centos
docker run -itd --name Container-2 --net=mynet --ip=10.10.14.100 centosdocker exec -it Container-1 /bin/bash
ping 10.10.14.100

答案:不能通信,因为在不通网段。

如果想要实现不通网段通信则需要打通网络,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KmwHOpGV-1681982020885)(D:\\MD归档文档\\IMG\\image-20230416122606996.png)]

# 为Container-1打通mynet网络
docker network connect mynet Container-1docker exec -it Container-1 /bin/bash
ping 10.10.14.100

打通网络其实就是给 Container-1 再添加一块 mynet网卡

docker inspect Container-1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mwRqawJm-1681982020885)(D:\\MD归档文档\\IMG\\image-20230416123555583.png)]