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

方式一、虚拟ip访问

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

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

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

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

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

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

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

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

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

方式二、link

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

运行第一个容器

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
PING centos-1 (172.17.0.7) 56(84) bytes of data.
64 bytes from centos-1 (172.17.0.7): icmp_seq=1 ttl=64 time=0.210 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=2 ttl=64 time=0.116 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=4 ttl=64 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的常用管理命令Docker将数据挂载到容器的三种方式

    文章目录 镜像管理命令 容器管理常用命令 docker run常用参数 Docker run的其他参数 docker 创建容器命令 容器资源限制 docker管理容器常用命令 docker将数据挂载到 ...

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

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

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

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

  4. Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题

    文章目录 前言 一.Spring 容器警告的产生 1.1.项目场景 二.Spring 容器未关闭后果分析 2.1.肉眼可见的警告 2.2.导致的内存泄漏 2.2.1.什么是内存泄漏? 2.2.2.如何 ...

  5. 进入正在运行的Docker容器的4种方式

    进入Docker容器比较常见的几种做法如下: 使用docker attach 使用SSH 使用nsenter 使用exec 一.使用docker attach进入Docker容器 Docker提供了a ...

  6. 进入docker容器的四种方式,推荐第四种方式

    https://www.cnblogs.com/xhyan/p/6593075.html

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

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

  8. docker(5、网络2) 1、容器间通信的三种方式 2、 容器如何访问外部 3、 外部如何访问容器

    1.容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信 自定义网络 根据业务需要可通过 bridge 驱动创建类似前面默认的 bridge 网络 1.自定义网 ...

  9. Spring中把一个bean对象交给Spring容器管理的三种方式

    一.使用@Component,把bean对象依赖交给Spring容器 注意,该注解不能使用,则说明未添加依赖,需要去该项目pom.xml文件内引入依赖,若该项目只是作为一个存放工具类的子模块项目,没有 ...

最新文章

  1. oracle date怎么用,Oracle to_date的使用方法
  2. Python入门100题 | 第067题
  3. python:实现简单购物车增加商品、删除商品的功能
  4. openlayers3 根据经纬度 自动画框_用这软件,让你的电脑自动搞黄色
  5. spring学习总结——介绍
  6. 《Oracle高性能自动化运维》一一2.3 Library Cache
  7. BZOJ1354: [Baltic2005]Bus Trip
  8. OpenStack(1)
  9. 【Leetcode 795】Number of Subarrays with Bounded Maximum
  10. 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
  11. 《创业维艰》详细的思维导图
  12. 嵌入式和单片机的区别在哪?
  13. 销售书籍_我们的5合1图书销售又来了!
  14. 二维数组传参||传值
  15. css:使用div绘制一条竖线
  16. 小程序博客(云开发)
  17. Jquery事件大全
  18. qq连接代码生成总结
  19. RDBMS相关概念和注意事项(一)
  20. 类型“XXX”违反了继承安全性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安全可访问性低。...

热门文章

  1. 互联网协议 — LISP 位置/身份分离协议
  2. Redis Python 客户端
  3. 用 Flask 来写个轻博客 (25) — 使用 Flask-Principal 实现角色权限功能
  4. 拒绝从入门到放弃_《Openstack 设计与实现》必读目录
  5. 数据库服务器 之 在Linux下使用perl通过unixODBC连接SQLServer2000
  6. 搜索引擎(Elasticsearch聚合分析)
  7. html2canvas在Vue项目踩坑-生成图片偏移不完整
  8. 史上第二走心的 iOS11 Drag Drop 教程
  9. 直流UPS供电系统在数据中心机房中的应用分析
  10. Runtime初学习