docker 安装后自动会创建一个软交换机docker0,他既可以扮演二层的交换设备也可以扮演二层的网卡设备,不给地址的话就是交换机,给地
址的话既能当交换机又能当网卡。每当创建一个容器的时候就会创建一段网卡,一半连到容器上一半连到宿主机上,并且关联到了docker0,相
当于用一根网线连接了容器和软交换机docker0,
每当创建一个容器并分配地址以后,就会在物理主机上生成一个iptables规则
docker有四种网络模型,若在容器创建时没有指定那么通通默认为第二种网络,桥接式网络,并且这个是nat桥不是物理桥。
a、closed container封闭式容器,只有回环口。
b、brdged container 桥接式容器,有虚拟网卡,连接到docker网桥上,默认网络地址为172.17.0.0/16
c、joined container 联盟式容器,让容器一部分名称空间是隔离的。
d、open container 开放式容器,和物理机共享名称空间
DOCKER默认的网段 172.17.0.0
创建网段
你可以指定IP地址域来创建虚拟网段或不指定IP地址域来创建虚拟网段
[root]# docker network create --subnet 172.18.0.0/24 mynet1
[root]# docker inspect mynet1
{
subnet: 172.18.0.0/24,
gateway: 172.18.0.1
}
or
[root]# docker network create mynet1
[root]# docker inspect mynet1
{
subnet: 172.19.0.0/24.
gateway: 172.19.0.1
}
删除网段
[root]# docker network rm mynet1
docker0网桥设备 |
---|
默认允许所有容器互联 | 拒绝容器间互联 | 允许特定容器间的连接 |
---|
容器的互联有三种方式
在同一宿主机下,容器联接是通过网桥连接的,docker 提供了一个设置选项来打开允许所有容器互联
docker 守护进程的启动选项
--icc=true 默认
[root]# vi /etc/default/docker
添加 --icc=true 到 DOCKER_OPTS 设置为允许所有容器互联
DOCKER_OPTS-"--icc=true"
实操举例
1.1 启动同一宿主机下的两容器
[root]# docker run -it -p 80 --name firstcentos centos
[root]# docker run -it -p 80 --name secondcentos centos
在两台容器上都安装Nginx
然后在第一个容器中启动Nginx服务
[root@firstcentos]# nginx
取的在第一个容器的IP地址
[root@firstcentos]# ip addr show
eth12 172.17.0.2
在第二个容器中启动Nginx服务
[root@secondcentos]# nginx
[root@secondcentos]# ip addr show
eth14 172.17.0.3
ping 第一个容器的IP地址
[root@secondcentos]# ping 172.17.0.2
succeful
訪问第一个容器的Nginx服务
[root@secondcentos]# curl http://172.17.0.2
nginx 信息
两容器是联通的
docker 守护进程的启动选项
--icc=false
[root]# vi /etc/default/docker
添加 --icc=false 到 DOCKER_OPTS 设置为拒绝所有容器互联
DOCKER_OPTS-"--icc=false"
[root]# systemctl restart docker
需要三个配置
--icc=false
--iptables=true
--link
修改docker默认配置文件
[root]# vi /etc/default/docker
添加 --icc --iptables 到DOCKER_OPTS中
DOCKER_OPTS=" --icc=false --iptables=true"
[root]# systmectl restart docker
现在,容器间是不能互相訪问的
我们利用 --link 创建第三个容器,允许它能訪问第一容器,但不能訪问第二个容器
[root]# docker run -it --name threecentos --link=firstcentos:firsttest centos
[root]# curl firsttest
如果不能成功,检查防火墙
[root]# iptables -L -n
把iptables 清空
[root]# iptables -F
重新启动docker服务
[root]# systemctl start docker
启动容器
[root]# docker restart firstcentos secondcentos threecentos
启动firstcentos 的Nginx
[root]# docker attache firstcentos
[root@firstcentos]# nginx
启动threecentos容器
[root]# docker attach threecentos
从第三容器訪问第一容器
[root@threecentos]# curl firsttest
显示NGINX 信息,訪问成功
ip_forward 和 iptables决定了容器与外部网络的连接
ip_forward | iptables | 端口映射訪问 | 限制IP訪问容器 |
---|
在Linux系统中如果要开启数据转发功能,可用以下的Linux命令来查看数据转发功能是否开发
[root]# sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding=0 // 0 就是关闭 1 就是开启
如果在docker系统中启动Linux数据转发功能,就必须要配置/etc/default/docker默认配置文件
[root]# vi /etc/default/docker
添加 --ip-forward=true 到 DOCKER_OPTS
DOCKER_OPTS=" --ip-forward=true"
当设置 --ip-forward=true时,Linux的net.ipv4.conf.all.forwarding 就为 1
查看forward output 等表
[root]# iptables -L -n
在第一台的虚拟机上
[root]# docker run -it -p 32768:80 --name firstcentos centos
[root@89087654]# nginx
ctrl+P+Q 退出容器
[root]# ip addr show
ens33 192.168.28.128
查看容器的端口映射
[root]# docker port firstcentos
80/tcp -> 0.0.0.0:32768
从本虚拟机訪问容器firstcentos中的Nginx
[root]# curl 127.0.0.1:32768
显示nginx信息
启动第二台虚拟机
从第二台虚拟机上远程訪问第一台虚拟机容器firstcentos上的Nginx服务
[root]# curl 192.168.28.128:32768
显示nginx信息
例子
在另一虚拟机上新建一个容器 fourcentos
[root]# docker run -it -p 80 --name fourcentos centos
[root@984746443]# nginx
ctrl+P+Q 退出容器
[root]# ip addr show
ens33 10.200.55.3
现在设置: 不允许192.168.28.128的那一台机訪问本机
在本机的iptables中添加一条新规则
[root]# iptables -I docker -s 10.200.55.3 -d 192.168.28.128 -p TCP --dport 80 -j DROP
-I docker 新加一条docker规则
-s 10.200.55.3 源地址
-d 192.168.28.128 目的地址
-P TCP 使用的协仪
--dport 80 目的端口
-J DROP 所需要的操作
由于Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,也就是说容器中的IP 是由docker0网桥分配的,所以,如果希望Docker
跨主机访问,最简单的方式就是将不同主机的 docker0 网桥设置为同一网段。那么怎么实现跨主机呢?将本机网卡host eth0 端口也通过网桥来连接,
但是通过这种桥接,所有网卡端口都要在一个网段下,所以要对每个Docker守护进程对ip的分配做出限制
-
环境配置
创建两台虚拟机 host1 ip: 192.168.28.5 端口 eth0 host2 ip: 192.168.28.8 端口 eth1 网关 : 192.168.28.2 对容器ip的划分: Host1: 192.168.28.64/26
地址范围: 192.168.28.65~192.168.28.126
Host2: 192.168.28.128/26
地址范围: 192.168.28.129~192.168.28.190
需要的操作:
以下,以Host1 为例,Host2 上操作相似,只是网卡名字不一样
1、删除旧网桥
[root]# systemctl stop docker
[root]# ip link set dev docker0 down
[root]# brctl delbr docker0
2、修改/etc/docker/daemon.json文件
设置网桥docker0的IP
[root]# vi /etc/docker/daemon.json
{
"bip":"192.168.28.5", //设置网桥docker0的IP
“fixed-cidr”:“192.168.28.64/26” //-fixed-cidr用来限定为容器分配的IP地址范围
}
3. 启动网桥docker0
[root]# ip link set dev docker0 up
4. 桥接本地网卡
[root]# brctl addif docker0 ens33
ens33 //本地网卡
5. 重启docker服务
[root]# systemctl daemon-reload
[root]# systemctl start docker
6.
1、删除旧网桥
[root]# systemctl stop docker
[root]# ip link set dev docker0 down
[root]# brctl delbr docker0
2、手动创建一个新的网桥名称为 bridge0
[root]# brctl addbr bridge0
为网桥分配一个同网段ip
[root]# ifconfig bridge0 192.168.28.5 netmask 255.255.255.0
启动网桥bridge0
[root]# ip link set dev bridge0 up
3. 桥接本地网卡:
[root]# brctl addif bridge0 ens33
ens33 //本地网卡
4. 查看是否已经创建bridge0
[root]# ifconfig bridge0
这里,我们就准备好了网桥设置
下面我们来修改Docker的配置
5、创建dameon.json
vim /etc/docker/dameon.json
{
"bridge": "bridge0", //指定容器连接的网桥名字
“fixed-cidr”:“192.168.28.65/26” // 用来限定为容器分配的IP地址范围
}
6. 重启docker服务
[root]# systemctl restart docker
7. 分别在两个host上启动一个容器
[root]# docker run -it --name host1-centtos centos
[root@7383647908] ip addr show
容器IP
eth17 192.168.28.66
退出容器host1-centtos
网桥IP
[root]# ip addr show
bridge0 ip: 192.168.28.5/26
这证明该容器的IP是由网桥分配的并在分配的IP地址范围内
[root]# ping ----------
然后在容器中互相运行ping命令查看连接情况