使用命令docker inspect 容器id/name
能看到容器的ip地址,使用主机和其他容器ping这个地址发现都是可以ping通的,但是使用本地局域网内的其他机器是无法ping通的。
Docker的默认网络模式可以分为:Host 模式、Bridge 模式或者 None 模式。然后来看下当前docker的网络信息,目前创建的容器都是属于docker0
这个网段中,docker0
负责这些容器之间的通信。
创建和使用自定义bridge
Bridge模式是Docker的默认网络模式,也是最常用的模式,这种模式下的容器会被分配一个172.17.0.0/16网段的IP。并且容器和主机/其他Bridge模式容器可以互相访问,容器也能访问外网,但是外网不能直接访问容器。
创建的容器默认都会连接到doker0
上,我们可以创建自己的bridge,创建bridge命令如下,其中创建的bridge名字是mybridge:
docker network create -d bridge mybridge
# 指定网关为172.200.0.1,子网为172.200.0.0/16,分配在此网段下的ip是172.200.0.1、172.200.0.2、……
docker network create -d bridge --gateway 172.200.0.1 --subnet 172.200.0.0/16 mybridge
创建容器时可以指定docker网络,创建完成后也可以添加或删除连接:
docker run -d --name 容器名称 --network mybridge -ip 172.200.0.1 # 创建容器时指定连接到mybridge网络并指定ip地址
docker network connect bridge名称 容器名称 # 容器创建后添加bridge,一个容器可以连多个bridge
docker network disconnect bridge名称 容器名称 cccc # 取消连接到某个bridge网络
如果连接到自己创建的bridge网络,在容器中ping别的容器名称发现是可以ping通的,前提是连接在同一bridge网络下,如果是连接在默认的bridge下是无法ping通的。
应用场景分析
为什么需要自定义bridge?举一个MySQL部署的例子,现有一个比较大型的项目,需要5个MySQL实例,同时还有一个ShardingSphereProxy中间件需要连接到这5个MySQL实例。
我们可以在创建MySQL实例的时候,指定bridge并设定ip,ShardingSphereProxy通过设置的ip地址可以很方便的连接到各个数据库,这种操作方法无论在哪台机器上都可以这么部署,不需要设置机器的ip即可连接到MySQL,可维护性大大提升。
host网络模式
如果是基于host模式,容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
用的是宿主机的IP,也就是和宿主机共用一个IP地址,host模式不需要加-p进行端口映射,因为和宿主机共享网络IP和端口。通过 --network=host
指定使用 host 网络。
docker run -itd --network host centos7-ssh-v1:latest