我们都知道docker容器之间是互相隔离的,不能互相访问,但如果有些依赖关系的服务要怎么办呢。下面介绍三种方法解决容器互访问题。

方式一、虚拟ip访问

安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问。

  1. [root@33fcf82ab4dd /]# [root@CentOS ~]# ifconfig
  2. ......
  3. docker0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
  4. inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
  5. inet6 fe80:::35ff:feac:66d8 prefixlen scopeid 0x20<link>
  6. ether :::ac::d8 txqueuelen (Ethernet)
  7. RX packets bytes (260.2 KiB)
  8. RX errors dropped overruns frame
  9. TX packets bytes (32.3 MiB)
  10. TX errors dropped overruns carrier collisions
  11. ......

运行一个centos镜像, 查看ip地址得到:172.17.0.7

  1. [root@CentOS ~]# docker run -it --name centos- docker.io/centos:latest
  2. [root@6d214ff8d70a /]# ifconfig
  3. eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
  4. inet 172.17.0.7 netmask 255.255.0.0 broadcast 0.0.0.0
  5. inet6 fe80:::acff:fe11: prefixlen scopeid 0x20<link>
  6. ether ::ac::: txqueuelen (Ethernet)
  7. RX packets bytes (1.2 KiB)
  8. RX errors dropped overruns frame
  9. TX packets bytes (648.0 B)
  10. TX errors dropped overruns carrier collisions

以同样的命令再起一个容器,查看ip地址得到:172.17.0.8

  1. [root@CentOS ~]# docker run -it --name centos- docker.io/centos:latest
  2. [root@33fcf82ab4dd /]# ifconfig
  3. eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
  4. inet 172.17.0.8 netmask 255.255.0.0 broadcast 0.0.0.0
  5. inet6 fe80:::acff:fe11: prefixlen scopeid 0x20<link>
  6. ether ::ac::: txqueuelen (Ethernet)
  7. RX packets bytes (648.0 B)
  8. RX errors dropped overruns frame
  9. TX packets bytes (648.0 B)
  10. TX errors dropped overruns carrier collisions

容器内部ping测试结果如下:

  1. [root@33fcf82ab4dd /]# ping 172.17.0.7
  2. PING 172.17.0.7 (172.17.0.7) () bytes of data.
  3. bytes from 172.17.0.7: icmp_seq= ttl= time=0.205 ms
  4. bytes from 172.17.0.7: icmp_seq= ttl= time=0.119 ms
  5. bytes from 172.17.0.7: icmp_seq= ttl= time=0.118 ms
  6. bytes from 172.17.0.7: icmp_seq= ttl= time=0.101 ms

这种方式必须知道每个容器的ip,在实际使用中并不实用。

方式二、link

运行容器的时候加上参数link

运行第一个容器

  1. docker run -it --name centos- docker.io/centos:latest

运行第二个容器

  1. [root@CentOS ~]# docker run -it --name centos- --link centos-1:centos-1 docker.io/centos:latest

--link:参数中第一个centos-1是容器名,第二个centos-1是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。

测试结果如下:

  1. [root@e0841aa13c5b /]# ping centos-
  2. PING centos- (172.17.0.7) () bytes of data.
  3. bytes from centos- (172.17.0.7): icmp_seq= ttl= time=0.210 ms
  4. bytes from centos- (172.17.0.7): icmp_seq= ttl= time=0.116 ms
  5. bytes from centos- (172.17.0.7): icmp_seq= ttl= time=0.112 ms
  6. bytes from centos- (172.17.0.7): icmp_seq= ttl= time=0.114 ms

此方法对容器创建的顺序有要求,如果集群内部多个容器要互访,使用就不太方便。

方式三、创建bridge网络

1.安装好docker后,运行如下命令创建bridge网络:docker network create testnet

查询到新创建的bridge testnet。

2.运行容器连接到testnet网络。

使用方法:docker run -it --name <容器名> ---network <bridge> --network-alias <网络别名> <镜像名>

  1. [root@CentOS ~]# docker run -it --name centos-1 --network testnet --network-alias centos-1 docker.io/centos:latest
  2. [root@CentOS ~]# docker run -it --name centos-2 --network testnet --network-alias centos-2 docker.io/centos:latest

3.从一个容器ping另外一个容器,测试结果如下:

  1. [root@fafe2622f2af /]# ping centos-1
  2. PING centos-1 (172.20.0.2) 56(84) bytes of data.
  3. 64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=1 ttl=64 time=0.158 ms
  4. 64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=2 ttl=64 time=0.108 ms
  5. 64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=3 ttl=64 time=0.112 ms
  6. 64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=4 ttl=64 time=0.113 ms 

4.若访问容器中服务,可以使用这用方式访问 <网络别名>:<服务端口号>

  推荐使用这种方法,自定义网络,因为使用的是网络别名,可以不用顾虑ip是否变动,只要连接到docker内部bright网络即可互访。bridge也可以建立多个,隔离在不同的网段。

Docker容器互访三种方式的更多相关文章

  1. 进入Docker容器的4种方式

    进入Docker容器的4种方式 在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进 ...

  2. CentOS安装docker ce的三种方式

    参考文章: CentOS安装docker ce的三种方式: 1.环境 CentOS Linux release 7.6.1810 (Core) 2.卸载旧版本 sudo yum remove dock ...

  3. 创建 Spring容器的三种方式

    一.src路径下打包完在war包的classes层级下 1.Spring容器创建的三种方式 创建Bean容器之后创建对象: 其中第三种使用的是BeanFactory对象 2.spring通过配置文件用 ...

  4. STL传递比较函数进容器的三种方式

    对于STL中的依靠比较排序的容器,均提供了一个模板参数来传递比较函数,默认的为std::less<>. 查阅Containers - C++ Reference可以看到典型的使用比较函数的 ...

  5. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...

  6. CentOS环境Docker安装教程(官方推荐的docker三种方式安装)

    CentOS环境Docker安装教程(官方推荐的docker三种方式安装) 一.使用yum方式安装 1.安装依赖包 $ sudo yum install -y yum-utils device-map ...

  7. 【Spring】Spring之向 IOC 容器注入对象的三种方式

    关于Spring的搭建可参见:浅析Spring框架的搭建.在测试之前还是应该先将环境配置好,将相关Jar包导进来.Spring创建的对象,默认情况下都是单例模式,除非通过scope指定. 向IOC容器 ...

  8. 三种方式创建bean对象在springIOC容器中初始化、销毁阶段要调用的自定义方法

    1. 使用@Bean注解定义initMethod和destroyMethod 所谓initMethod和destroyMethod,是指在springIOC容器中,对于bean对象执行到初始化阶段和销 ...

  9. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

随机推荐

  1. redis学习-集合set常用命令

    redis学习-集合set常用命令   1.sadd:添加一个元素到集合中(集合中的元素无序的并且唯一) 2.smembers:查看集合中所有的元素(上图事例) 3.srem:删除结合中指定的元素 4 ...

  2. 再探haproxy

    一 设置haproxy输出log 1.1 调整配置文件 默认haproxy是不会输出log到文件的,这样很大程度在查询问题时会很不方便,haproxy是可以输出日志到文件的,配置文档类似于如下: ]# ...

  3. 为什么要使用CMake?

    如果你曾经维护过软件包的构建和安装过程,你将对CMake感兴趣.CMake是软件项目的一个开源生成管理器,它允许开发人员以简单的可移植文本文件格式指定生成参数.然后,CMake 使用此文件为本机开发工 ...

  4. Ubuntu里Eclipse关联Jdk

    Ubuntu里Eclipse关联Jdk 1.在Eclipse安装目录创建jre 文件. 2.ln  -s  jdk目录/bin  bin 输入上述命令,之后eclipse即可打开.

  5. R_展示变量之间关系的图形

    #绘制普通矩阵散点图 plot(dataframe) #绘制带有拟合直线,最佳拟合曲线和直方图的矩阵散点图 library(car) attach(dataframe) scatterplotMatr ...

  6. 04、SQL 查询当天,本月,本周的记录

    SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111)   ORDE ...

  7. 【腾讯Bugly干货分享】Android 插件技术实战总结

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/1p5Y0f5XdVXN2EZYT0AM_A 前言 安 ...

  8. 包建强的培训课程(17):Java代码敏捷之道

    第1讲 千言万语聊注释 按图索骥 奇葩注释“赏析” Git提交的学问 第2讲 RxJava:函数式编程 从一只猫的故事说起 背压 第3讲 代码瘦身 抽象相同逻辑的代码 查找相似代码 AOP一瞥 第4讲 ...

  9. 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)

    注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...

  10. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...