一.系统环境

服务器版本 docker软件版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64

二.docker容器互联概述

2.1 docker容器互联的三种方式

同一个宿主机上的多个docker容器之间如果想进行通信有三种方式:

  1. 通过使用容器的ip地址来通信【这样会导致ip地址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip】
  2. 通过宿主机的ip加上容器暴露出的端口号来通信【这样的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信】
  3. 通过docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。

2.2 docker --link使用注意事项

使用docker --link需要注意以下几点:

  1. 使用link选项建立的容器所链接的主机需要在运行状态
  2. 使用link选项建立的容器运行时需要所链接的容器也必须是运行状态
  3. 使用link选项链接的主机ip不需要固定,因为每次新建容器都会检查所链接容器的ip,在/etc/hosts里生成新的alias 名称对应的ip

2.3 docker --link原理

docker --link 使用了link机制后,可以通过指定的名字来和目标容器通信,这其实是通过给/etc/hosts中加入名称和IP的解析关系来实现的。

三.docker容器互联

3.1 通过容器IP地址进行通信

创建一个MySQL容器

[root@k8smaster ~]# docker run -dit --restart=always --name=mysql5 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 hub.c.163.com/library/mysql:latest
03982d14608971f6af6783ad0eb6611516c8b19e449dc05e899a802cabfe99f0

查看MySQL容器IP

[root@k8smaster ~]# docker inspect mysql5 | grep -i ipaddr
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAddress": "172.17.0.4",

创建一个centos容器,并测试容器的连通性

#ping MySQL容器IP,可以看到成功ping通
[root@k8smaster ~]# docker run -it --restart=always --name=centos7 hub.c.163.com/library/centos:latest ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.168 ms
64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.064 ms
64 bytes from 172.17.0.4: icmp_seq=3 ttl=64 time=0.063 ms
64 bytes from 172.17.0.4: icmp_seq=4 ttl=64 time=0.185 ms
^C
--- 172.17.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.063/0.120/0.185/0.056 ms

3.2 通过--link 参数进行通信

注意:docker 默认是允许容器互联互通的,可以通过-icc=false 关闭互通。一旦关闭了互通,只能通过-link name:alias 命令连接指定容器

创建centos容器,使用--link mysql5:mysql 链接mysql5容器,并给mysql5容器起别名为mysql,直接ping mysql,可以看到成功ping通

[root@k8smaster ~]# docker run -it --restart=always --name=c7 --link mysql5:mysql hub.c.163.com/library/centos:latest ping mysql
PING mysql (172.17.0.4) 56(84) bytes of data.
64 bytes from mysql (172.17.0.4): icmp_seq=1 ttl=64 time=0.099 ms
64 bytes from mysql (172.17.0.4): icmp_seq=2 ttl=64 time=0.086 ms
64 bytes from mysql (172.17.0.4): icmp_seq=3 ttl=64 time=0.126 ms
^C
--- mysql ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.086/0.103/0.126/0.020 ms

进入容器ping mysql

[root@k8smaster ~]# docker exec -it c7 /bin/bash

[root@0eea8b40d874 /]# ping mysql
PING mysql (172.17.0.4) 56(84) bytes of data.
64 bytes from mysql (172.17.0.4): icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from mysql (172.17.0.4): icmp_seq=2 ttl=64 time=0.107 ms
64 bytes from mysql (172.17.0.4): icmp_seq=3 ttl=64 time=0.064 ms
64 bytes from mysql (172.17.0.4): icmp_seq=4 ttl=64 time=0.080 ms
^C
--- mysql ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.064/0.089/0.108/0.021 ms #没有MySQL客户端
[root@0eea8b40d874 /]# mysql -uroot -p123456 -h 172.17.0.4
bash: mysql: command not found #安装MySQL客户端,mariadb客户端和MySQL客户端通用
[root@0eea8b40d874 /]# yum -y install mariadb
Loaded plugins: fastestmirror, ovl
.....
Installed:
mariadb.x86_64 1:5.5.68-1.el7
......
Complete!

在centos7容器里连接mysql

[root@0eea8b40d874 /]# mysql -uroot -p123456 -h 172.17.0.4
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.18 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec) MySQL [(none)]> exit
Bye
[root@0eea8b40d874 /]#
[root@0eea8b40d874 /]# exit
exit
[root@k8smaster ~]#

docker --link容器互联的更多相关文章

  1. docker compose容器互联

    使用docker-compose编排容器时,如容器之间需要互相通信,使用本地连接,需要使用容器名来代替localhost "connection": "postgresq ...

  2. docker link 过时不再用了?那容器互联、服务发现怎么办?

    在 1-2 年前,Docker 所有容器都连接于默认的桥接网络上,也就是很多老文章鼓捣的 docker0 桥接网卡.因此实际上默认情况下所有容器都是可以互联的,没有隔离,当然这样安全性不好.而服务发现 ...

  3. docker容器互联

    link方式 http://blog.csdn.net/halcyonbaby/article/details/42112325 通过link方式创建容器,然后我们可以使用被link容器的别名进行访问 ...

  4. Docker - 容器互联

    容器互联 通过docker run命令的--link参数可以让容器之间通过连接(linking)系统进行交互. 参数格式:--link name:alias ,name是要链接的容器名称, alias ...

  5. Docker入门之六端口映射与容器互联

    一.端口映射 在之前的博客搭建私有仓库时用到这样一句:docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry来r ...

  6. 8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

    这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook 总要和一些数据库打交道吧,比如说 ...

  7. Docker基础-端口映射与容器互联

    1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时, ...

  8. Docker实战(五)之端口映射与容器互联

    除了网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问. 1.端口映射实现访 ...

  9. docker——端口映射与容器互联

    在生产环境中,单个服务往往是独立的,但是服务与服务之间往往是相互依赖的,这样对于容器来说,容器之间就需要相互访问.除了网络访问之外,docker还提供了另外两种方式来满足服务的访问. 一:允许映射容器 ...

  10. Docker 容器的网络连接 & 容器互联

    1. Docker 容器网络基础架构 Docker0 ifconfig查看到的 docker0 是linux的虚拟网桥(OSI数据链路层) docker0 地址划分: 172.17.42.1 255. ...

随机推荐

  1. Java 继承与多态:代码重用与灵活性的巧妙结合

    Java 继承(子类和超类) 在 Java 中,可以从一个类继承属性和方法到另一个类.我们将"继承概念"分为两类: 子类(child): 从另一个类继承的类 超类(parent): ...

  2. 打造美团外卖新体验,HarmonyOS SDK 持续赋能开发者共赢鸿蒙生态

    从今年 8 月起,所有升级到 HarmonyOS 4 的手机用户在美团外卖下单后,可通过屏幕上的一个"小窗口",随时追踪到"出餐.取餐.送达"等订单状态.这个能 ...

  3. UML 哲学之道——类图[三]

    前言 简单整理一些uml中的类图. 正文 类的基本表示法: 名称.属性(类型.可见性).方法(参数.返回值.可见性) 想上面这样,第一行是名称,第二行是属性,第三行是方法 可见性: 表示public ...

  4. c# 深克隆与浅克隆

    前言 我们都知道memberwiseclone 会将浅克隆. 什么是浅克隆?如何深克隆呢? 正文 public class good{ private good(){ oneclass=new cla ...

  5. Mysql安装和远程登录--Centos7

    在Centos7中使用的包管理工具是yum,当然使用包管理工具安装也是最方便的. 本文操作内容需要在root用户下,否则有些步骤无法成功执行. 系统环境信息展示 安装 MySQL 提供的 RPM wg ...

  6. Python - PEP572: 海象运算符

    海象运算符 PEP572 的标题是「Assignment Expressions」,也就是「赋值表达式」,也叫做「命名表达式」 不过它现在被广泛的别名是「海象运算符」(The Walrus Opera ...

  7. @SpringBootConfiguration注解

    @SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到sprin ...

  8. bs4、selenium的使用

    爬取新闻 # 1 爬取网页---requests # 2 解析 ---xml格式,用了re匹配的 ---html,bs4,lxml... ---json: -python :内置的 -java : f ...

  9. 【.net】Error while trying to retrieve text for error ORA-06413

    [.net]Error while trying to retrieve text for error ORA-06413 系统需要,有一个外挂系统使用的是.net,出了问题,所以部署环境查询代码 但 ...

  10. 力扣8(java)-字符串转整数(atoi)(中等)

    题目: 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数). 函数 myAtoi(string s) 的算法 ...