Docker 在使用过程中可以配置网络工作模式,来控制容器之间、容器与主机之间的通信方式。本文详细介绍了Docker中的网络功能,包括网络模式(桥接、主机、容器、none和自定义网络)的应用,容器间的通信解决方案,以及如何创建和管理网络以实现服务名直接通信。
概述 {#概述}
需要解决的问题
(1)容器间、容器与主机间的互联和通信以及端口映射
(2)容器IP变动时候,可以通过服务名直接网络通信而不受到影响
基本用法 {#基本用法}
五种网络模式 {#五种网络模式}
| 网络模式 | 命令指定方式 | 描述 | 理解 | |-----------|-------------------|-----------------------------------------------------|-----------| | bridge | --network bridge | 为每一个容器分配、设置 ip ,并将容器连接到 docker0 虚拟网桥上,虚拟网桥,默认为该网络模式 | 一人一个 | | host | --network host | 容器不会创建自己的网卡,配置 ip 等,而是使用宿主机的 ip 和端口 | 多人一个 | | container | --network 容器名称或id | 新创建的容器不会创建自己的网卡和配置自己的ip,而是和一个指定的容器共享ip、端口范围等 | 自己没有,用别人的 | | none | --network none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如网桥,ip等 | 有,但是空的 |
桥接模式------ bridge {#桥接模式——-bridge}
为每一个容器分配、设置IP等,并将容器连接到docker0的虚拟网桥。若没有特别申明,则为默认自带一个IP以及网络设置。
-
Docker使用Linux桥接的方式,在宿主机虚拟一个Docker容器网桥(docker0)。
Docker每启动一个容器时会根据Docker网桥的网段分配给容器一个ip地址。
同时Docker网桥是每个容器的默认网关。
同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。 -
docker run创建容器的时,未指定network的容器默认的网络模式就是bridge,使用的就是docker0。
在宿主机ifconfig,就可以看到docker0和自己创建的network:- eth0,eth1......代表网卡一,网卡二......
- lo代表127.0.0.1(localhost)
- inet addr表示网卡的ip地址
-
网桥docker0会创建一对对等虚拟设备接口:一个叫veth,另一个叫eth0,成对匹配。
整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,
在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
每个容器实例内部也有一块网卡,每个接口叫eth0;
docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对。
主机模式------ host {#主机模式——-host}
容器不会虚拟出自己的网卡、IP等,而是使用宿主机的IP和端口。
注意:在创建的时候,将再在指定
-p 8083:8080
, 无意义,运行时候会警告,但是不报错。因为该容器和主机ip和端口同步。
容器模式------ container {#容器模式——-container}
新创建的容器不会创建自己的网卡,没有自己的IP,也不会进行相应的配置。而是和一个指定的容器共享IP端口范围等。
注意:当192.168.20.2容器停掉后,192.168.20.3的网络也会同时停掉!
none模式------ none {#none模式——-none}
容器有自己独立的Network namespace,但是没有进行任何的相关配置。即禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
- 在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo。
需要我们自己为Docker容器添加网卡、配置IP等。
自定义网络 {#自定义网络}
为使得众多的容器,进行分门别类,方便管理的情况下,而且通过服务名来ping通,所以采用自定义网络进行管理!
总结,自定义网络本身就维护好了主机名和ip的对应关系( ip和域名都能通)
IPC 配置 {#IPC-配置}
Docker的IPC(Inter-Process Communication,进程间通信)配置主要用于控制容器间是否可以进行进程间通信。在Docker中,可以通过设置--ipc
参数来配置IPC命名空间。
以下是一些常用的IPC设置:
none
:容器拥有自己的IPC命名空间,不与其他容器共享。private
:容器拥有自己的IPC命名空间,但是可以与其他容器共享进程、消息队列和信号量。host
:容器使用宿主机的IPC命名空间。container:<name|id>
:容器与指定的容器共享IPC命名空间。
例如,如果你想要两个容器使用相同的IPC命名空间,可以这样设置:
或者,如果你想要让container2
与container1
共享IPC命名空间:
在Docker Compose中,可以在docker-compose.yml
文件中设置IPC模式:
请注意,在使用IPC设置时,你需要考虑到安全问题,因为容器间的IPC会提供一种进程间通信的方式,可能被恶意利用。
参考资料 {#参考资料}
文章链接:
https://www.zywvvd.com/notes/tools/docker/docker-network/