docker 网络

一、docker 网络

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

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

显示所有容器,包括运行中(Up)的和退出的(Exited),记住container id

docker ps -a

查看容器的端口映射

docker port container_name/container_id

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

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 命令查看

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
7ff24c562ae6        bridge              bridge              local
9a435b1b6b5c        host                host                local
58c645ae3e0f        none                null                local

3.1、none 网络

none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 –net=none 指定使用 none 网络。
应用场景:适用于一些对安全性要求高并且不需要联网的应用可以使用 none 网络,比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。

3.2、host 网络

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

3.3、container:NAME_OR_ID

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

3.4、 bridge

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

查询网桥信息

# brctl show
# brctl show docker0
bridge name    bridge id        STP enabled    interfaces
docker0        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

yum -y update
yum -y install iputils-ping
yum -y install net-tools

四、单宿主机容器互联

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

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

五、跨宿主机容器网络

多台宿主机间的容器互联

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

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

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

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

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

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

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

null