摘要:Docker容器间通讯是通过网络实现的,容器之间可以互相访问,实现数据传输和共享。Docker提供了多种网络模式,如桥接模式、主机模式等,以满足不同场景下的需求。通过正确配置网络模式和端口映射,可以实现容器间的通信和数据交互,提高应用程序的灵活性和可扩展性。
虚拟IP与访问同一网络
在安装Docker时,Docker默认创建一个内部桥接网络称为docker0,每当创建一个容器时,它都会分配一个虚拟网卡,容器之间(包括宿主机)可以通过分配的IP互相访问,其他主机(包括其上的容器)无法直接ping通Docker容器的IP,这是因为docker0的IP是172.0.0.1(localhost),其分配的容器IP也仅在172.0.0.x网段内,只有本机能够访问这些IP,若要让其他主机访问容器,需要通过暴露宿主机端口或使用网络通讯插件如weave、fannel等,安装weave后,通过weave分配容器IP,这样跨主机容器间才能通过IP互相通讯。
Docker容器的虚拟IP查看方法:在容器内部查看/etc/hosts
文件。
测试方法:[root@e0841aa13c5b /]# ping 容器虚拟ip。
2、使用link访问容器(别名方式,官方文档中已经不推荐使用)
运行第一个容器:docker run -it --name centos-1 docker.io/centos:latest
。
运行第二个容器并链接第一个容器:docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest
。--link
参数中的第一个参数是已存在的容器名,第二个参数是定义的容器别名,方便使用别名访问容器。
测试方法:[root@e0841aa13c5b /]# ping centos-1,在centos-2容器内查看hosts文件,可以看到另一个容器的配置信息。
同一自定义网络下通过容器名访问
默认的docker0网络只能通过IP访问,用户自定义的网卡可以提供自动的DNS解析,在自定义的网卡上,容器可以直接通过名称或别名相互解析,Docker容器名访问原理是通过Docker内置的DNS服务将容器名解析为容器的IP地址,容器名访问只在Docker网络内部有效,不能直接从宿主机外部访问,若需要从宿主机外部访问容器,可通过端口映射(Port Mapping)将容器的端口暴露给宿主机,创建自定义网络后,在该网络上运行的容器可以通过容器名直接ping通。
4、通过docker compose部署服务名访问(单机)
Docker Compose是用于在单个服务器上创建多个容器的工具,主要用于构建多个有关联的服务,在同一Docker网络下的容器可以使用服务名进行直接访问,无需担心因重启导致的VIP变化,使用docker-compose编排的容器默认会加入到一个网络中,在不同配置文件的容器默认使用不同的network,在同一yml文件下,使用docker-compose up -d启动即可,容器会在后台运行,并通过服务名互相访问,在不同yml文件的情况下,需将所有容器的网络配置为同一外部网络。
5、通过Docker Swarm的服务名访问(多主机集群 跨主机通讯)
服务名访问是通过服务发现与负载均衡机制实现的,Docker Swarm管理着集群中所有服务的状态和配置信息,创建服务时,Swarm会收集服务的相关信息并将其存储在内置的服务发现机制中,通过服务名访问时,Swarm会在运行服务的节点之间进行负载均衡,Docker Swarm使用内置的DNS解析服务实现服务名的解析,并在Docker网络内部使用服务名访问服务的网络服务,Swarm的DNS服务将服务名解析为任务的IP地址,并将请求转发到相应的任务上,serviceName服务名访问只在Docker Swarm集群内部有效,不能直接从集群外部访问,若需要从集群外部访问服务,需配置集群的统一入口,创建service时,可以使用--publish
参数映射宿主机IP并自带负载均衡功能,在docker swarm容器内可以直接访问serviceName,但在宿主机上需将serviceName和serviceIP映射到/etc/hosts文件中才行,集群外部可通过访问宿主机的IP和端口来访问服务。
还没有评论,来说两句吧...