场景
CentOS7中Docker的安装与配置:
CentOS7中Docker的安装与配置_centos docker sock-CSDN博客
在上面安装好Docker之后。
关于对Docker中默认docker0以及自定义网络的使用进行学习。
注:
实现
理解docker0
docker 是如果处理容器网络访问的?
为了测试,运行一个tomcat
docker run -d --name tomcat01 tomcat
我们从宿主机ping容器的ip
此时网络是通的。
Docker如何获取某个容器的ip等信息
docker inspect 3aaf
后面跟的是容器id或容器名称
此时查看宿主机网络
ip addr
发现每启动一个docker容器,docker就会给docker容器分配一个ip,
我们只要安装了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术。
此时我们再启动一个容器测试
docker run -d --name tomcat02 tomcat
发现又多了一对网络
我们发现这个容器带来网卡,都是一对对的veth-pair 就是一对的虚拟设备接口,
他们都是成对出现的,一端连着协议,一端彼此相连。
正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的OpenStac,
Docker容器之间的连接,OVS的连接,都是使用evth-pair技术。
来测试下tomcat01和tomcat02容器内是否互通
发现这两个容器是可以互通的。
如果发现Docker容器内在Ping时提示找不到ping命令
Docker容器内ping时提示:
bash: ping: command not found
执行如下两条命令
apt update
apt install iputils-ping
那么在ping时如何知道某个Docker容器的ip?
docker inspect 3aaf
后面跟的是docker容器的id
结论:
tomcat01和tomcat02公用一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,
docker会给我们的容器分配一个默认的可用ip。
图示:
只要容器删除,对应的网桥一对就没了!
Docker中自定义网络,自定义网络添加容器
思考一个问题,某些场景下比如微服务环境下需要使用容器名称/服务名称进行访问,或者ip需要更换迁移的情况下。
那么上面默认的docker0网络可以使用容器名进行访问吗?
可以测试下
发现使用容器名是ping不通的。
查看所有的docker网络
docker network ls
docker的网络模式:
bridge :桥接 docker(默认,自己创建也是用bridge模式)
none :不配置网络,一般不用
host :和所主机共享网络
container :容器网络连通(用得少!局限很大)
其中
我们直接启动的命令 --net bridge,而这个就是我们得docker0
bridge就是docker0
docker run -d -P --name tomcat01 tomcat
等价于 =>
docker run -d -P --name tomcat01 --net bridge tomcat
docker0,特点:默认,域名不能访问。 --link可以打通连接,但是很麻烦!且不建议使用--link的方式。
所以我们自定义网络
Docker中自定义网络的语法
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
这个例子中,我们创建了一个名为mynet的自定义网络,使用了 bridge 驱动,并指定了一个子网和网关。
这样配置后,连接到这个网络的容器将会在这个指定的子网内,并且默认情况下可以通过指定的网关进行通信。
此时再查看网络列表
还可以查看该自定义网络的详情
docker network inspect mynet
后面跟的是自定义网络的名称
此时启动容器时就可以指定网络
启动如下两个容器
docker run -d -P --name tomcat-mynet-01 --net mynet tomcat
docker run -d -P --name tomcat-mynet-02 --net mynet tomcat
此时这两个容器通过ip和名称都可以互通
Docker自定义网络如何添加已经运行的容器
上面使用默认docker0的容器如果想使其与自定义网络的容器互通,可以通过如下将其加入进来
docker network connect mynet tomcat01
此时就可以网络互通了。