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

【Docker】docker中容器之间通信方式

文章目录

  • 1. Docker容器之间通信的主要方式
    • 1.1 通过容器ip访问
    • 1.2. 通过宿主机的ip:port访问
    • 1.3. 通过link建立连接(官方不推荐使用)
    • 1.4. 通过 User-defined networks(推荐)
  • 2. 参考资料

1. Docker容器之间通信的主要方式

1.1 通过容器ip访问

容器重启后,ip会发生变化。通过容器ip访问不是一个好的方案。

1.2. 通过宿主机的ip:port访问

通过宿主机的ip:port访问,只能依靠监听在暴露出的端口的进程来进行有限的通信。

容器之间通信不能用 localhost127.0.0.1,只能用宿主机的 ip:port 通信,但是主机的ip地址会随着宿主机的重启而变化

以 MySQL 容器为例如下:

  1. 创建容器

    docker run -it -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7
    
  2. 主机直接访问暴露的端口

    如下图,暴露端口的方式很方便主机与容器之间的通信,跟连接主机本地一样

1.3. 通过link建立连接(官方不推荐使用)

运行容器时,指定参数link,使得源容器与被链接的容器可以进行相互通信,并且接受的容器可以获得源容器的一些数据,比如:环境变量。

# 源容器:mysql
docker run -itd --name mysql_test -e MYSQL_ROOT_PASSWORD=root mysql:5.7
#被链接容器 centos
docker run -itd --name centos_test --link test-mysql:mysql  centos /bin/bash
#进入test-centos
docker exec -it centos_test /bin/bash

1.4. 通过 User-defined networks(推荐)

先给出结论:

  • 配置 -p 选项让宿主机和容器之间通过 暴露端口 来通信

  • 配置 --network 选项让容器加入同一个网络,也配置 --network-alias 选项让容器间相互连接

centosmysql容器之间通信为例,使用方法步骤如下:

  1. 创建网络

    docker network来创建一个桥接网络,在docker run的时候将容器指定到新创建的桥接网络中,这样同一桥接网络中的容器就可以通过互相访问。

    docker network create dockerbetweennetwork
    
  2. 启动mysql容器时,加入创建的网络

    创建mysql容器加入到dockerbetweennetwork网络,也暴露了3306端口给主机使用

    # 创建mysql容器
    docker run -it -p 3306:3306 --name mysql_test \
    --network dockerbetweennetwork --network-alias mysql_network \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7
    
  3. 启动centos容器时,加入创建的网络

    # 创建centos容器
    docker run -it --name centos_test \--network dockerbetweennetwork --network-alias centos_network \
    -d centos
    
  4. 验证结果

    • 查看mysql容器的ip地址

      # 查看mysql容器ip地址
      docker inspect mysql_test
      

      我的mysql_test的ip地址是 172.21.0.2(mysql)

    • 进入centos容器中查看是否跟mysql容器在同一个网络

      # 进入centos容器中
      docker exec -it centos_test /bin/bash
      # ping 上面得到的mysql容器的地址
      ping mysql_test
      

2. 参考资料

我的文章:《如何查看一个Docker镜像有哪些版本.md》

我的文章:《Docker设置国内镜像源.md》

我的文章:《Docker快速入门实用教程.md》

我的文章:《Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务.md》

我的文章:《Docker安装Nacos服务.md》

我的文章:《如何修改Docker中的文件.md》

我的文章:《Docker容器间的连接或通信方式.md》

我的文章:《Docker安装的MySQL如何持久化数据库数据.md》

我的文章:《制作Docker私有仓库.md》

我的文章:《使用docker-maven-plugin插件构建发布推镜像到私有仓库.md》

我的文章:《解决Docker安装Elasticsearch后访问9200端口失败.md》


传送门:保姆式Spring5源码解析

欢迎与作者一起交流技术和工作生活

联系作者

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

相关文章:

  • 算法-归并排序-JAVA
  • Flask 进阶
  • home-assistant整合sso
  • Ip-Limit: 轻量级注解式IP限流组件(二)
  • 【C++】开源:Redis数据库配置与使用
  • TCP/IP网络编程 第二十四章:制作HTTP服务器端
  • React 前端应用中快速实践 OpenTelemetry 云原生可观测性(SigNoz/K8S)
  • Linux 多线程并发Socket服务端的实现( 11 ) -【Linux通信架构系列 】
  • 2.7. Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
  • 单例模式与构造器模式
  • SQL力扣练习(七)
  • C语言假期作业 DAY 05
  • php-golang-rpc使用roadrunner-server/goridge/v3/pkg/rpc和php的spiral/goridge3.2实践
  • API常用签名验证方法(PHP实现)
  • kotlin高阶函数
  • kotlin list集合树
  • 基于Autoencoder自编码的64QAM星座图整形调制解调通信系统性能matlab仿真
  • 【Spring】Spring 总览
  • 微软、OpenAI用上“数据永动机” 合成数据是晨曦还是暮光?
  • 简单认识Redis 数据库的高可用
  • 超级实用!,掌握这9个鲜为人知的CSS属性
  • 深圳国际新能源及智能网联汽车全产业博览会今年10月举办
  • 【具有非线性反馈的LTI系统识别】针对反馈非线性的LTI系统,提供非线性辨识方案(SimulinkMatlab代码实现)
  • Stable diffusion 和 Midjourney 怎么选?
  • c++网络编程
  • 【沁恒蓝牙mesh】数据收发接口与应用层模型传递
  • Java类关系之代理(代理模式)
  • java: 无法访问redis.clients.jedis.JedisPoolConfig
  • 基于java中学教务管理系统设计与实现
  • vscode设置java -Xmx最大堆内存