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

方式一、虚拟ip访问

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

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

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

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

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

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

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

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

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

方式二、link

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

运行第一个容器

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

运行第二个容器

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

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

测试结果如下:

[root@e0841aa13c5b /]# ping centos-
PING centos- (172.17.0.7) () bytes of data.
bytes from centos- (172.17.0.7): icmp_seq= ttl= time=0.210 ms
bytes from centos- (172.17.0.7): icmp_seq= ttl= time=0.116 ms
bytes from centos- (172.17.0.7): icmp_seq= ttl= time=0.112 ms
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 <网络别名> <镜像名>

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

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

[root@fafe2622f2af /]# ping centos-1
PING centos-1 (172.20.0.2) 56(84) bytes of data.
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=1 ttl=64 time=0.158 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=2 ttl=64 time=0.108 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=3 ttl=64 time=0.112 ms
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. 2019.03.29 bzoj3323: [Scoi2013]多项式的运算(非旋treap)

    传送门 题意:定义一个无穷项的多项式f(x)f(x)f(x),初始各项系数都为0,现在有几种操作 将xLx^LxL到xRx^RxR这些项的系数乘上某个定值v 将xLx^LxL到xRx^RxR这些项的系 ...

  2. ScrollView无法滚动

    ScrollView视图无法滚动 箭头所指地方应该用dp单位的数值

  3. 通过HttpClient发起Get请求,获取Json数据,然后转为java数据,然后批量保存数据库;

    Json转java所需Jar包: commons-beanutils-1.8.0.jar,commons-collections-3.2.1.jar,commons-lang-2.5.jar,comm ...

  4. post文件下载

    this.$http({ method: 'post', url: '/file/download', responseType: 'blob', data: JSON.stringify(this. ...

  5. 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题

    Centons下 其大概意思是fastestmirror不能使用,fastestmirror是yum的一个加速插件,具体我也没有仔细了解过,可能是系统不支持或者缺少组建导致的.处理办法就是禁用这个插件 ...

  6. jwt vs session 以rails 为例 (翻译部分)

    原文地址:https://pragmaticstudio.com/tutorials/rails-session-cookies-for-api-authentication 普通方式: 令牌为基础的 ...

  7. 大数据解实例决topn问题

    做大数据开发经常遇上在众多数据中统计前几的问题,比如王者荣耀每个区的富豪排行榜(腾讯可以做个刺激消费,

  8. 导入Dynamic Web Project后程序有红叉但是可以运行

    解决方法: 进入工程下的.setting文件夹,用记事本编辑org.eclipse.wst.common.project.facet.core.xml, 把<runtime name=" ...

  9. Spark机器学习解析下集

    上次我们讲过<Spark机器学习(上)>,本文是Spark机器学习的下部分,请点击回顾上部分,再更好地理解本文. 1.机器学习的常见算法 常见的机器学习算法有:l   构造条件概率:回归分 ...

  10. Javascript对象Oject的强制类型转换

    众所周知Javascript作为一种动态类型,弱类型的脚本语言其数据类型在很多时候都会发生类型转换.而这些类型转换往往都是隐式的,这让我们在使用Js的时候会产生许多麻烦.而Js的基础数据类型的转换在此 ...