docker network - yaokun123/php-wiki GitHub Wiki

Dockerfile网络模型

我们只要安装了docker,就会有一个网卡docker0(默认网卡),相当于一个路由器。所有的容器启动时不指定网络时,默认都是使用docker0。

我们每启动一个docker容器,docker就会给docker容器分配一个ip,宿主机的网卡也会多一个,成对出现。

使用的是桥接模式,使用的技术是veth-pair技术。veth-pai就是一对虚拟设备接口,他们都是成对出现的。一端连着协议,一端彼此相连。正因为有这个特性veth-pair充当一个桥梁。连接各种虚拟网络设备的。

宿主机和容器之间是可以ping通的。
容器和容器之间也是可以ping通的。

思考一个场景:每次docker容器启动的时候ip都会变化,我们编写一个微服务,database url=ip,项目不重启,数据库IP换掉了,我们希望可以处理这个问题。可以使用名字来进行访问容器。启动时候加上 --link

docker run xxx --name tomcat03 --link tomcat02

此时tomcat03容器就能ping通tomcat02了
但是tomcat02却不能ping通tomcat03

其实是修改了hosts文件,不建议使用。真实情况都是自定义网络,不使用官方的docker0(不支持使用容器名连接访问)

自定义网络

1、查看支持网络类型

docker network ls

[root@izuf61z952szxgixgccuagz yaok]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
252de78eda8f        bridge              bridge              local
06862bdd614e        host                host                local
51ca07926a04        none                null                local



bridge(常用):默认模式docker0,自定义网络也使用的是这种模式
host:公用宿主机Network NameSapce(网络层不隔离)
none:无网络模式,不配置网络
container(k8s中):与其他容器公用Network NameSapce,用的少,局限很大

2、创建自定义网络

docker nerwork create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 mynet

3、使用--net指定网络类型

docker run xxx --net=mynet

自定义网络连通

打通docker0和mynet

docker network connect mynet tomcat01(docker0的)

此时tomcat01这个容器就拥有了两个ip

二、Docker跨主机网络类型

1、macvlan实现

缺点是只能在虚拟网络里互相访问。容器不能访问外网,同时外网也不能访问到容器。

docker network create --driver macvlan --subnet=10.0.0.0/24 --geteway=10.0.0.254 -0 parent=eth0 macvlan1

ip link set eth0 promsic on (ubuntu或其他版本需要)

docker run -it --network macvlan1 --ip=10.0.0.1 center:6.9 /bin/bash

2、overlay实现

每个容器有两块网卡 容器内eth0与docker0关联,访问外网/提供的服务(端口映射) 容器内eth1跨主机容器通信使用

1、启动consul服务,实现网络的统一配置管理

统一配置关联服务容器
docker run -d -p 8500:8500 -h consul progrium/consul -server -bootstrap

//consul:kv类型的存储数据库(key:value)

docker01、docker02上:
vim /etc/docker/daemon.json
{
    "host":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
    "cluster-store":"consul://10.0.0.100:8500",
    "cluster-advertise":"10.0.0.100:2376"
}

systemctl daemon-reload
systemctl restart docker

2、创建overlay网络

docker network create -d overlay --subnet 172.16.0.0/24 --geteway 172.16.0.254 ol1

3、启动容器测试

docker run -it --network ol1 --name testoverlay centos /bin/bash

//每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网