Docker中的网络模式

2023-01-12 docker

Docker的默认网络模式可以分为:Host 模式、Bridge 模式或者 None 模式。其中Bridge模式是创建容器默认的网络模式,Host模式和主机共享一个网络,None模式则代表无网络。其中最常用的操作是创建自定义的Bridge网络,然后和容器连接。

使用命令docker inspect 容器id/name能看到容器的ip地址,使用主机和其他容器ping这个地址发现都是可以ping通的,但是使用本地局域网内的其他机器是无法ping通的。

查看容器的id

Docker的默认网络模式可以分为:Host 模式、Bridge 模式或者 None 模式。然后来看下当前docker的网络信息,目前创建的容器都是属于docker0这个网段中,docker0负责这些容器之间的通信。

image-20230111215322834

# 创建和使用自定义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
上次更新: 5 个月前