Docker Linux运维 ·

docker 网络

一、docker 网络

1. 容器有自己的内部网络和ip地址

#### 1.1. 查看某容器端口映射情况

shell
#显示所有容器,包括运行中(Up)的和退出的(Exited),记住container id
# docker ps -a
#查看容器端口映射
# docker port container_name/container_id

#### 1.2.列出所有容器对应的名称,ip,及端口

shell
# docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)

二、端口映射

-p 解释:

大写的P时,docker会随机映射一个49000~49900的端口到内部容器开发的网络端口
小写的p时,指定要映射的端口号,映射到容器的端口,改宿主的端口一旦绑定给一个容器后,不能再绑定给其他容器。
docker 默认的网段是 172.17.0.X

三、容器的桥接模式

Docker 网络从覆盖范围可分为

3.0.1. 单个节点 host(指宿主机)上的容器网络
3.0.2. 跨多个节点 host 的网络

Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看

[root@fooher ~]# docker network lsNETWORK ID NAME DRIVER SCOPE7ff24c562ae6 bridge bridge local9a435b1b6b5c host host local58c645ae3e0f none null local

3.1、none 网络

none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 –net=none 指定使用 none 网络。

应用场景:适用于一些对安全性要求高并且不需要联网的应用可以使用 none 网络,比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。

3.2、host 网络

连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置(网卡信息、路由表、iptables规则等)与 host 主机完全一样。可以通过 –net=host 指定使用 host 网络。
应用场景

  • 直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。
  • Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如配置 iptables

3.3、container:NAME_OR_ID

新创建的容器共享指定的已存在容器的网络命名空间,两个容器内的网络配置共享

3.4、 bridge

Docker 安装时会创建一个 命名为 docker0 的 linux bridge(虚拟网桥)。如果不指定–net,创建的容器默认都会挂到 docker0 上。

查询网桥信息
# 查询网桥信息# brctl show# brctl show docker0bridge name bridge id STP enabled interfacesdocker0 8000.0242a1544365 no veth8111048

veth511048就是已建容器的虚拟网卡,挂到了 docker0 上。

# 看一下容器的网络配置# docker ps -a# docker exec -it container_name/container_id /bin/bash# ip -a# 进入一个容器后,使用ifconfig、ip addr等命令时,出现如下“command not found”:先apt-get update# apt-get update# apt install iputils-ping# apt install net-tools

四、单宿主机容器互联

同一台宿主机内的容器互联

需要交互的容器建立连接关系(相当于互联的容器之间创建了一个虚拟通道,而且不用映射他们的端口到宿主主机上),接收容器可以通过容器名快速访问源容器,而不用指定具体的ip;从而做到最小化暴露服务端口。
例如:多个web容器连接到同一个db容器

五、跨宿主机容器网络

多台宿主机间的容器互联

不同宿主的容器进行内部互联通信,是非常复杂的,通常直接使用宿主的网络进行组网

  • 解决不同物理机间的docker容器互联问题
  • docker默认的桥接网络里只能用Ip而不能用别名进行互通
    null

上图,这个默认情况下的网络设置不支持跨主机的容器互联,原因有两方面。

1)跨主机访问容器,没有有效路由

比如,容器A要访问容器D,请求的地址为 192.168.1.4 ,但是主机甲并不知道该将这个IP发送到那个网络设备上,主机甲也不知道主机乙内部有个容器D。

2)多个节点上的容器网段冲突

默认情况下,docker启动后初始化 docker0 网桥时,会随机分配一个IP段,那么,如果不加以协调,多个节点内的容器网络有可能会冲突,比如上图中两个网络都采用了 192.168.1.1/24 网段,在这种情况下,就会导致容器IP冲突,比如 B 和 C。

那么,只需要解决这两个问题,我们就可以实现跨主机的容器互联。

null

评论已关闭