当前位置: 首页 > news >正文

Docker 容器间通讯

1、虚拟ip/访问 同一网络

安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间(包括宿主机)可以根据分配的ip互相访问(ps:其他主机(包括其他主机的容器)无法ping通docker容器ip无法访问,因为docker0是172.0.0.1(localhost),其分配的容器ip也是172.0.0.2等,仅与本机属于同一网段。需要暴露到宿主机端口才可以被其他主机访问到。需要安装weave、fannel等跨主机网络通讯插件,用weave分配容器ip,这样跨主机容器间才可用ip互相通讯了,否则跨主机容器无法通讯)

Docker容器的虚拟ip查看:在容器内部 cat /etc/hosts

测试:[root@e0841aa13c5b /]# ping 容器虚拟ip

2、link 容器别名访问ps: 官方文档中已经不推荐使用

运行第一个容器
[root@CentOS ~]docker run -it --name centos-1 docker.io/centos:latest
运行第二个容器
[root@CentOS ~]# docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest
--link:参数中第一个centos-1是容器名,第二个centos-1是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。

测试:[root@e0841aa13c5b /]# ping centos-1

事实上,在centos-2 容器内,如果查看 hosts 文件,可以发现 docker 已经将另外1个容器配置在了 hosts 中:

/app # cat /etc/hosts

127.0.0.1    localhost

...

172.17.0.6    centos-1 7a6409598773 centos-1

3、同一自定义网络下可通过容器名访问

ps: 默认的docker0网络只能通过ip访问.

因为用户自定义的网卡可以在容器之间提供自动的 DNS 解析,缺省的桥接网络docker0上的容器只能通过 IP 地址互相访问,除非使用 --link 参数。在用户自定义的网卡上,容器直接可以通过名称或者别名相互解析。

Docker容器名访问原理是通过Docker内置的DNS服务将容器名解析为容器的IP地址。

容器名访问只在Docker网络内部起作用,不能直接从宿主机外部访问容器。如果需要从宿主机外部访问容器,可以通过端口映射(Port Mapping)将容器的端口暴露给宿主机

运行如下命令创建bridge网络:docker network create testnet

查询到新创建的bridge testnet。

运行容器连接到testnet网络
使用方法:docker run -itd --name test1 ---network testnet nginx

docker run -itd --name test2 ---network testnet nginx

测试从test2容器ping test1容器

docker exec -it test2 bash

[root@e0841aa13c5b /]# ping test1

4.docker compose部署 可通过service服务名访问(单机)

Docker Compose 是一个在单个服务器上创建多个容器的工具, 主要是用来构建多个服务(一个服务就相当于一个容器或一组相同配置的容器),一般是构建构建多个有关联的服务。

只要是处于同一个Docker 网络下的容器就可以使用服务名进行直接访问而无需担心重启导致的VIP变化

使用docker-compose编排一个配置文件的一组容器时会默认创建一个网络并且这组容器全部都会加入到网络当中。在不同配置文件的容器默认会用不同的network

4-1.同一个yml文件的情况下:

新建 docker-compose.yml 文件,编写如下

version: "3"

services:

  digger-api:

    image: "express:v1"

    ports:

      - "3000:3000"

  digger-mysql:

    image: "mysql:5.7.25"

    environment:

      - MYSQL_ROOT_PASSWORD=root

  digger-redis:

    image: "redis:5.0.3-alpine"

然后使用 docker-compose up -d 启动即可,容器会在后台运行。

digger-mysql的容器内: ping digger-api

4-2.不同yml文件的情况下,需配置成使用同一外部网络

docker network create test1 #创建一个单独的网络

这几个docker compose的  yml文件的所有容器的网络都指定到上面创建的网络,并标记为 external

version: "3"

services:

  digger-api:

    image: "express:v1"

    ports:

      - "3000:3000"

    networks:

      - test1

networks:

  frontend:

external: true #指定容器使用外部已有的网络

5.docker swarm 可通过service服务名访问(多主机集群 跨主机通讯)

服务名访问是通过服务发现与负载均衡机制实现的

服务发现:Docker Swarm管理着集群中所有服务的状态和配置信息。当你创建一个服务时,Swarm会收集服务的相关信息并将其存储在内置的服务发现机制中。

负载均衡:通过服务名访问时,Swarm会在运行服务的节点之间进行负载均衡,并将请求路由到可用的任务上。

DNS解析服务:Docker Swarm使用内置的DNS解析服务来实现服务名的解析。在Docker网络内部,可以使用服务名作为主机名来访问服务的网络服务。Swarm的DNS服务将服务名解析为可用的任务的IP地址,并将请求转发到相应的任务上

serviceName服务名访问只在Docker Swarm集群内部起作用,不能直接从集群外部访问。如果需要从集群外部访问服务,可以通过服务的暴露端口或使用Ingress等方式来配置集群的统一入口。

#创建service  --publish映射宿主机IP  自带负载均衡会随机在多主机上部署容器

docker service create --name node_v16 --publish <host_port>:<container_port> <service_image>

docker swarm容器内直接可直接访问serviceName,宿主机需映射serviceName+serviceIP到/etc/hosts才行docker swarm overlay网络分配的VIP 无法从service inspect信息中查看,只能在具体容器中查看docker exec -it 3f3 ip addr show)

集群外 可访问 http://宿主机IP:host_port

http://www.lryc.cn/news/351954.html

相关文章:

  • C语言章节学习归纳--数据类型、运算符与表达式
  • Centos 7.9 使用 iso 搭建本地 YUM 源
  • NFT Insider #131:Mocaverse NFT市值破3.5万ETH,The Sandbox 参加NFCsummit
  • BatBot智慧能源管理平台,更加有效地管理能源
  • 医院预约挂号系统微信小程序APP
  • 【代码随想录 二叉树】二叉树前序、中序、后序遍历的迭代遍历
  • Error:(6, 43) java: 程序包org.springframework.data.redis.core不存在
  • Qt 科目一考试系统(有源码)
  • 在 Visual Studio 2022 (VS2022) 中删除 Git 分支的步骤如下
  • 玩转OpenHarmony智能家居:如何实现开发版“碰一碰”设备控制
  • 订餐系统总结、
  • 【因果推断从入门到精通二】随机实验3
  • 真实案例分享,终端pc直接telnet不到出口路由器。
  • YOLOv8_seg的训练、验证、预测及导出[实例分割实践篇]
  • Linux基础(四):Linux系统文件类型与文件权限
  • 本是梦中人,常作花下客。心中自往来,知我有几个。
  • 创新指南|利用电商产品视频进行渠道营销的最佳策略,不断提升销售额
  • 深度学习之基于YoloV5入侵检测系统
  • 【01】全面理解JVM虚拟机
  • CentOS7离线安装Nginx
  • 面试字节大模型算法实习岗,感觉有点崩溃。。。
  • k8s 1.24.x之后如果rest 访问apiserver
  • 深度解析:用 Python 爬虫逆向破解 solscan 的请求头加密参数 Sol-Aut
  • Flutter 中的 InputDecorator 小部件:全面指南
  • useTransition:开启React并发模式
  • Android 12系统源码_多窗口模式(二)系统实现分屏的功能原理
  • 字符函数:分类函数与转换函数
  • SpringBoot 集成Mybatis
  • C语言-atoi()库函数的模拟实现
  • 定时监测服务器磁盘是否超过阈值,超过就删除docker 镜像