Docker 在使用过程中可以配置网络工作模式,来控制容器之间、容器与主机之间的通信方式。本文详细介绍了Docker中的网络功能,包括网络模式(桥接、主机、容器、none和自定义网络)的应用,容器间的通信解决方案,以及如何创建和管理网络以实现服务名直接通信。
概述
需要解决的问题
(1)容器间、容器与主机间的互联和通信以及端口映射
(2)容器IP变动时候,可以通过服务名直接网络通信而不受到影响
基本用法
123456789101112131415161718192021 | 连接容器到网络docker network connect 网络名 # 创建网络(使用统一网络的容器,肯定可以ping通)docker network create 网络名 # 断开网络docker network disconnect 网络名# 查看网络具体信息docker network inspect # 查看所有网络列表docker network ls # 删除无用网络docker network prune # 删除指定的网络docker network rm |
---|
五种网络模式
网络模式 | 命令指定方式 | 描述 | 理解 |
---|---|---|---|
bridge | –network bridge | 为每一个容器分配、设置 ip ,并将容器连接到 docker0 虚拟网桥上,虚拟网桥,默认为该网络模式 | 一人一个 |
host | –network host | 容器不会创建自己的网卡,配置 ip 等,而是使用宿主机的 ip 和端口 | 多人一个 |
container | –network 容器名称或id | 新创建的容器不会创建自己的网卡和配置自己的ip,而是和一个指定的容器共享ip、端口范围等 | 自己没有,用别人的 |
none | –network none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如网桥,ip等 | 有,但是空的 |
桥接模式—— 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
容器不会虚拟出自己的网卡、IP等,而是使用宿主机的IP和端口。
注意:在创建的时候,将再在指定
-p 8083:8080
, 无意义,运行时候会警告,但是不报错。因为该容器和主机ip和端口同步。
容器模式—— container
新创建的容器不会创建自己的网卡,没有自己的IP,也不会进行相应的配置。而是和一个指定的容器共享IP端口范围等。
注意:当192.168.20.2容器停掉后,192.168.20.3的网络也会同时停掉!
1 | --network container:共享的容器名/ID |
---|
none模式—— none
容器有自己独立的Network namespace,但是没有进行任何的相关配置。即禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
- 在none模式下,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo。 需要我们自己为Docker容器添加网卡、配置IP等。
自定义网络
为使得众多的容器,进行分门别类,方便管理的情况下,而且通过服务名来ping通,所以采用自定义网络进行管理!
123456 | #创建新的网络,默认为bridge模式docker network create new_net# 新创建两个容器tomcat81和tomcat82,并调用新建的自定义网络docker run -d -p 8081:8080 --network new_net --name tomcat81 billygoo/tomcat8-jdk8docker run -d -p 8082:8080 --network new_net --name tomcat82 billygoo/tomcat8-jdk8 |
---|
总结,自定义网络本身就维护好了主机名和ip的对应关系( ip和域名都能通)
IPC 配置
Docker的IPC(Inter-Process Communication,进程间通信)配置主要用于控制容器间是否可以进行进程间通信。在Docker中,可以通过设置--ipc
参数来配置IPC命名空间。
以下是一些常用的IPC设置:
none
:容器拥有自己的IPC命名空间,不与其他容器共享。private
:容器拥有自己的IPC命名空间,但是可以与其他容器共享进程、消息队列和信号量。host
:容器使用宿主机的IPC命名空间。container:<name|id>
:容器与指定的容器共享IPC命名空间。
例如,如果你想要两个容器使用相同的IPC命名空间,可以这样设置:
12 | docker run --name container1 --ipc=host myimage1docker run --name container2 --ipc=host myimage2 |
---|
或者,如果你想要让container2
与container1
共享IPC命名空间:
12 | docker run --name container1 --ipc=private myimage1docker run --name container2 --ipc=container:container1 myimage2 |
---|
在Docker Compose中,可以在docker-compose.yml
文件中设置IPC模式:
12345678 | version: '3'services: service1: image: myimage1 ipc: host service2: image: myimage2 ipc: "container:service1" |
---|
请注意,在使用IPC设置时,你需要考虑到安全问题,因为容器间的IPC会提供一种进程间通信的方式,可能被恶意利用。
参考资料
- https://blog.csdn.net/meidongyan/article/details/135905080
文章链接: https://cloud.tencent.com/developer/article/2441246