文章目录
- 一、理解docker0网桥
- 二、Docker网络模式
- 三、Docker容器互联
- 四、自定义网络
一、理解docker0网桥
- 安装docker的时候,会生成一个docker0的虚拟网桥。
- 每运行一个docker容器都会生成一个veth设备对,这个veth一个接口在容器里,一个接口在物理机上
安装网桥管理工具:
yum install bridge-utils -y
brctl show 可以查看到有一个docker0的网桥设备,下面有很多接口,每个接口都表示一个启动的docker容器,因为我在docker上启动了很多容器,所以interfaces较多,如下所示:
brctl show
二、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
2、host模式:
- 指共享宿主机的网络
- 如下案例:使用nginx镜像运行容器,会将80端口暴露在宿主机上面,直接宿主机就可以访问到80端口
docker run -itd --name host --net=host nginx
curl 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/bash
ip addr
4、container模式:
- Docker 网络 container 模式是指,创建新容器的时候,通过–net container 参数,指定其和已经存在的某个容器共享一个 Network Namespace。
- 如下图所示,右方黄色新创建的 container,其网卡共享左边容器。因此就不会拥有自己独立的 IP,而是共享左边容器的 IP 172.17.0.2,端口范围等网络资源,两个容器的进程通过 lo 网卡设备通信。
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
2、不同网段创建的容器是否可以访问
思考:如下图,不同网段创建的容器是否可以通信呢?
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 centos
docker exec -it Container-1 /bin/bash
ping 10.10.14.100
答案:不能通信,因为在不通网段。
如果想要实现不通网段通信则需要打通网络,如下图:
# 为Container-1打通mynet网络
docker network connect mynet Container-1
docker exec -it Container-1 /bin/bash
ping 10.10.14.100
打通网络其实就是给 Container-1 再添加一块 mynet网卡
docker inspect Container-1