默认在每个宿主机会生成一个名称为docker0的网卡 默认是172.17.0.1/16
每次新建容器后
宿主机多了一个虚拟网卡和容器的网卡组合成一个网卡
容器会自动获取一个172.17.0.0/16网段的随机地址
容器获取的地址并不固定,每次容器重启,可能会发生地址变化
默认情况下:同一个宿主机的不同容器可相互通信
不同宿主机之间容器IP地址重复,默认不能相互通信
dockerd --icc (默认为true)
此配置可以禁止同一个宿主机的容器之间通信
修改/lib/systemd/system/docker.service文件
ExecStart=/usr/bin/dockerd -H fd:// --containerd==/run/containerd/containerd,sock--icc=false
默认docker后会自动生成一个docker0的网桥,使用的IP是172.17.0.0.1/16,可能和宿主机的网段发生冲突,可将其修改为其他网段的地址,避免冲突
方法1
vim /etc/docker/daemon.json 此文件也用于镜像加速
添加 "bip":"192.168.100.1/24"
方法2
vim /lib/systemd/system/dicker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd==/run/containerd/containerd,sock--icc=false--bip=192.168.100.1/24
重启配置文件:systemctl daemon-reload systemctl restart docker.service
注意:这两种方法不可混用,否则将无法启动docker服务
新建容器默认使用docker0的网络配置,可以修改默认指向自动义的网桥网络
1.安装bridge-utils包
使用brctl创建网桥 brctl addbr br0
2.使用 ip address 命令 指定网桥的网段
ip address a 192.168.100.1/24 dev br0
3.指定网桥
vim /lib/systemd/system/dicker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd==/run/containerd/containerd,sock-b br0
重启配置文件:systemctl daemon-reload systemctl restart docker.service
新建容器时,docker会自动分配容器名称,容器ID和IP地址,导致容器名称,容器ID和IP都不固定
固定名称实现确定目标的通信
两种固定名称:容器名称 容器名称的别名
同一个宿主机上的容器之间可以通过自定义的容器名称i相互访问
注:如果被引用的容器地址变化,必须重启当前容器才能生效
docker run创建容器,可使用--link选项实现容器名称的引用
其本质就是在容器内的/etc/hosts中添加--link后指定的容器的IP和主机名的对应关系,从而实现名称解析
--link list
格式:
先创建指定名称的容器 docker run --name <容器名称>
在创建容器时引用上面容器的名称 docker run --link <目标通信的容器ID或容器名称>
自定义的容器名称可能后期会发生变化,一旦名称发生变化,容器内程序之间也必须要随之发生变化,因此可以使用自定义别名的方式解决,即容器名称可以随意更改,只要比更改别名即可
容器别名实现
命名格式:
先创建指定名称的容器 docker run --name <容器名称>
给上面创建的容器起别名,来创建容器 docker run --name <容器名称> --link <目标容器名称>:"<容器别名1>,<容器别名2>.."
docker的网络支持5种网络模式:
none bridge host container network-name
查看网络模式 docker network ls
默认新建的容器使用Bridge模式
创建容器时,指定网络模式 docker run --network
none
bridge
host
container:<容器名或容器ID>
<自定义网络名称>
本模式是docker的默认模式,即不指定任何模式就是bridge模式,此模式创建的容器会为每一个容器分配自己的网络IP等信息,并将容器连接到一个虚拟网桥与外界通信
NAT模式通过SNAT访问外网,使用DNAT可以让容器被外部主机访问
此模式宿主机需要启动ip_forward功能
查看bridge模式信息 docker network inspect bridge
安装docker后,默认启用ip_forward 可通过文件查看 /proc/sys/net/ipv4_forward
有两种方法修改默认的bridge模式的网络配置,两种方式只能选一种,否则会导致冲突,docker服务无法启动
指定host模式启动的容器,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址。
访问容器的时候直接使用宿主机IP和容器端口即可,适用于运行容器端口比较固定的业务
使用参数 --network host指定
共享主机网络
网络性能无损耗
网络故障排除相对简单
各容器网络无隔离
网络资源无法分别统计
端口管理困难,容易产生端口冲突
不支持端口映射
docker run -d --network host .....
在使用none模式后,Docker容器不会进行任何网络配置,没有网卡,没有IP和路由,默认无法与外界通信,需要手动添加网卡配置
使用参数 --network none指定
默认无网络功能,无法和外部通信
无法实现端口映射
适用于测试环境
docker run --network none ....
使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网络,新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个被指定的已存在的容器共享IP和端口范围,因此这个容器端口不能和被指定容器的端口冲突
使用参数--network container:名称或ID指定
与宿主机网络空间隔离
容器间共享网络空间
适合频繁的容器间的网络通信
直接使用对方的网络,较少使用
docker run --network container:name|ID ....
注:自定义网络内的容器可以直接通过容器名进行相互的访问,而无需使用--link
docker network create -d
注意:mode不支持host和none,默认是bridge模式