目录
- 1.网络管理命令
- 1.docker network creatre
- 2.docker network inspect
- 3.docker network connect
- 4.docker network disconnect
- 5.docker network prune
- 6.docker network rm
- 7.docker network ls
- 2.docker bridge 详解
- 0.基本概念
- 1.默认 bridge
- 2.自定义 bridge
- 3.DNS解析
- 4.端口暴露和转发
- 3.docker host 详解
- 4.docker container 详解
- 5.docker none 详解
1.网络管理命令
1.docker network creatre
- 功能:创建自定义网络
- 语法:`docker network creatre [OPTIONS] NETWORK
- 关键参数:
-d, --driver
:网络驱动--gateway
:网关地址--subnet
:表示网段的CIDR格式的子网--ipv6
:启动ipv5
- 示例:
docker network creatre --driver=bridge --subnet=192.168.0.0/16 br0
2.docker network inspect
- 功能:查看网络详情
- 语法:
docker network inspect [OPTIONS] NETWORK [NETWORK...]
- 关键参数:
-f, --format
:指定格式
3.docker network connect
- 功能:
- 将容器连接到网络,可以按名称或ID连接容器
- 一旦连接,容器可以与同一网络中的其他容器通信
- 语法:
docker network connect [OPTIONS] NETWORK CONTAINER
- 关键参数:
--ip
:指定IP地址--ip6
:指定IPV6地址
- 示例:
# 将正在运行的容器连接到网络 docker network connect multi-host-network my_container1 # 启动时将容器连接到网络 # 还可以使用docker run --network=<network-name>选项启动容器并立即将其连接到网络 docker run -itd --network=multi-host-network SnowK_Container # 指定容器的IP,可以指定要分配给容器网络接口的IP地址 docker network connect --ip 172.21.26.211 multi-host-network my_container2
4.docker network disconnect
- 功能:断开网络
- 语法:
docker network disconnect [OPTIONS] NERWORK CONTAINER
- 关键参数:
-f
:强制退出 - 示例:
docker network disconnect multi-host-network my_container
5.docker network prune
- 功能:删除不使用的网络
- 语法:
docker network prune [OPTIONS]
- 关键参数:
-f, --force
:强制删除
6.docker network rm
- 功能:删除1个或多个网络
- 语法:`docker network rm NETWORK [NETWORN…]
- 关键参数:
-f
:强制删除
7.docker network ls
- 功能:列出网络
- 语法:
docker network ls [OPTIONS]
- 关键参数:
-f, --filter
:指定过滤条件--format
:指定格式--no-trunc
:不截断-q, --quiet
:仅仅显示 id
2.docker bridge 详解
0.基本概念
- Docker Bridge网络采用内置的bridge驱动,bridge驱动底层采用的是 Linux内核中Linux bridge技术
- 就网络而言,bridge网络是在网络段之间转发流量的链路层设备, 而网桥可以是在主机内核中运行的硬件设备或软件设备
- 就Docker而言,桥接网络使用软件网桥
docker0
,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离
- Docker Container的bridge桥接模式
1.默认 bridge
-
默认情况下,创建的容器在没有使用
--network
参数指定要加入的 docker 网络时, 默认都是加入 Docker 默认的单机桥接网络 -
默认的bridge网络会被映射到内核中名为
docker0
的网桥上- Docker默认的bridge网络和Linux内核中的
docker0
网桥是对应关系 - bridge是Docker对网络的命名,而docker0是内核中网桥的名字
- Docker默认的bridge网络和Linux内核中的
-
容器间的网络通信
- 安装Docker的时候会默认docker0这个网桥软件设备,这个docker0设备可以类比成交换机/路由器设备
- 当创建好容器之后, 如果不手动指定网络模式,默认会使用bridge网络, 容器会自动连接到
docker0
这个网桥设备, 然后通过这个网桥来进行容器间的通信
2.自定义 bridge
- 除了默认的
docker0
,也可以创建一些自定义的bridge,让运行的容器通过自定义bridge进行通信 - 创建:
docker network create -d bridge new-bridge
- 连接:
docker run -itd --name c3 --network new-bridge SnowK
- 通过
--network
选项指定要连接的网络, - 如果不指定, 默认是连接的
bridge
- 通过
3.DNS解析
- Docker自定义桥接网络是支持通过Docker DNS服务进行域名解析的
- 可以直接使用容器名进行通信
- 因为DNS服务可以解析容器名到IP地址的映射, 但是默认的bridge网络是不支持DNS的
4.端口暴露和转发
- 暴露方式:端口暴露有2种方式,在启动容器的时候添加端口参数
-P
:暴露所有端口- 将指定的容器端口映射至主机所有地址的一个动态端口
- 动态端口 即 随机端口
- 具体的映射结果可使用
docker port
命令查看
- 将指定的容器端口映射至主机所有地址的一个动态端口
-p
:暴露指定端口- 语法:
-p <hostPort>:<containerPort>
- 功能:将容器端口
<containerPort>
映射至指定的主机端口<hostPort>
- 语法:
- 端口转发:连接
bridge
网络的容器只能与连接在当前网络中的容器进行通信。如果一个容器想要对外提供一些网络服务的话,需要进行端口转发才可以实现- 端口转发将Docker容器的端口映射到宿主机的端口上
- 任何发送到宿主机该端口的流量,都会被转发到容器的端口中
- 如下图所示,两个容器内部均开放80端口,它们分别映射到宿主机的8088和8089端口
- 任何发送到 8088 端口的流量都会转发到Container 1容器的80端口
- 任何发送到8089端口的流程都会转发到Container 2 容器的80端口
- 端口转发将Docker容器的端口映射到宿主机的端口上
3.docker host 详解
-
Docker容器运行默认都会分配独立的Network Namespace隔离子系统
-
但是如果基于host网络模式,容器将不会获得一个独立的Network Namespace,而是和宿主机共用同一个Network Namespace
- 容器将不会虚拟出自己的网卡,IP等,而是直接使用宿主机的IP和端口
- 连接到host网络的容器共享宿主机的网络栈,容器的网络配置与宿主机完全一样
-
适用场景:
bridge
网络在通信的时候需要进行端口转发以及NAT地址转换, 这势必会消耗掉一些资源以及性能- 直接使用host网络最大的好处就是性能好
- 如果容器对网络传输效率有较高的要求,建议选择host网络
- 当然也会牺牲一些东西,比如要考虑端口冲突问题,其他服务已经被占用的端口就不能再使用了
4.docker container 详解
-
Docker Container的other container网络模式是Docker中一种较为特别的网络的模式
- 之所以称为“other container模式“,是因为这个模式下的Docker Container,会使用其他容器的网络环境
- 之所以称为“特别”,是因为这个模式下容器的网络隔离性会处于bridge桥接模式与host模式之间
- Docker Container共享其他容器的网络环境,则至少这两个容器之间不存在网络隔离
- 而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离
-
Docker Container的other container网络模式
-
Docker Container的other container网络模式实现逻辑如下:
- 查找other container(即需要被共享网络环境的容器)的网络namespace
- 将新创建的Docker Container(也是需要共享其他网络的容器)的namespace,使用other container的namespace
-
操作实例
# 创建一个容器 docker run -itd --name netcontainer1 SnowK # 使用netcontainer1的网络创建另外一个容器 docker run -itd --name netcontainer2 --network container:netcontainer1 SnowK
-
适用场景
- 在这种模式下的Docker Container可以通过localhost来访问namespace下的其他容器,传输效率较高
- 但是两个容器之间存在依赖,如果依赖容器重启了,会导致另外一个服务的网络不可用
5.docker none 详解
- none网络就是指没有网络,挂在这个网络下的容器除了lo(本地回环),没有其他任何网卡
- 适用场景
- 针对一些对安全性要求比较高并且不需要联网的应用, 可以使用none网络
- 比如生成随机密码, 避免生成密码被第三方获取
- 一些第三方的应用可能需要docker帮忙创建一个没有网络的容器, 网络由第三方自己来配置
- 针对一些对安全性要求比较高并且不需要联网的应用, 可以使用none网络