docker同宿主机容器和不同宿主机容器之间怎么通信?

第一部分 docker有四种网络模式
第一种:bridge 模式
当docker进程启动时,主机上会创建一个名为docker0的虚拟网桥,容器内部会创建一个只能容器内部看到的接口eth0,eth0 和docker0工作方式就像物理二层交换机一样,可以互相通信。

命令执行过程:
#docker run -tid --net=bridge --name docker_bri1 ubuntu-base:v3
#docker run -tid --net=bridge --name docker_bri2 ubuntu-base:v3

#brctl show
#docker exec -ti docker_bri1 /bin/bash
#docker exec -ti docker_bri1 /bin/bash

#ifconfig –a
#route –n

第二种:host模式
容器启动时候用host模式,那么容器不会像第一张那样有个独立Network NameSpace。而是和主机共享一个Network NameSpace。
使用宿主机的ip和端口,但是容器的系统,进程列表等还是和主机隔离。

命令执行:
#docker run -tid --net=host --name docker_host1 ubuntu-base:v3
#docker run -tid --net=host --name docker_host2 ubuntu-base:v3

#docker exec -ti docker_host1 /bin/bash
#docker exec -ti docker_host1 /bin/bash

#ifconfig –a
#route –n

第三种模式 Container
congtainer容器指定和已经存在的容器共享一个network namespace。
不配置ip,指一个已经存在容器共享ip,其他

第四种:none模式
none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。


#docker run -tid --net=none --name docker_non1 ubuntu-base:v3
#docker exec -ti docker_non1 /bin/bash

#ifconfig –a
#route -n

第二部分 跨主机通信
单台主机上面的docker容器通过docker0来通信。不同主机上面的容器只能在主机上做端口映射来完成。种端口映射方式对很多集群应用来说极不方便。

方法一:现在用docker主机上添加静态路由直接实现跨宿主机容器之间通信:

方法二:借助pipework容器网络配置工具。
通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。

使用新建的bri0网桥代替缺省的docker0网桥

第三种:Flannel(Flannel + UDP 或者 Flannel + VxLAN)

Flannel实现的容器的跨主机通信通过如下过程实现:

每个主机上安装并运行etcd和flannel;
在etcd中规划配置所有主机的docker0子网范围;
每个主机上的flanneld根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;
当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);
将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;
由于目的IP是宿主机IP,因此路由是可达的;
VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器

#/opt/bin/etcdctl get /coreos.com/network/config
#/opt/bin/etcdctl ls /coreos.com/network/subnets
#/opt/bin/etcdctl get /coreos.com/network/subnets/172.16.49.0-24

原文地址:http://blog.51cto.com/2367685/2349762

时间: 2024-10-18 09:17:43

docker同宿主机容器和不同宿主机容器之间怎么通信?的相关文章

金庸武功之“易筋经”--docker pipework 设置容器IP在宿主机网段

一.主机环境及环境准备 宿主机IP:192.168.1.107 宿主机网关:192.168.1.1 容器IP:目的是设置为192.168.1.108 关闭Selinux 设置为网卡桥接模式 关闭防火墙 yum install bridge-utils -y yum install git -y 二.安装docker 增加repo tee /etc/yum.repos.d/docker.repo <<-'EOF' [dockerrepo] name=Docker Repository baseu

Docker1.12让容器使用和宿主机同一个网段

步骤一:创建网络$ docker network create -d macvlan --subnet=172.16.0.0/24 --gateway=172.16.0.1 -o parent=eno16777736 mynet548d79fe04c613d3ca180e8689f2207f71534020bc39566d62d0b5aeb67fc8b5 参数解析:-d macvlan  加载kernel的模块名--subnet 宿主机所在网段--gateway 宿主机所在网段网关-o pare

Docker一台服务器部署多容器,容器A无法通过宿主机外网ip访问另外一个容器B分析

首先出现这个问题,都是iptables ---input chain 设置了默认Policy 为 Drop导致的(如果默认全都是 accept或者没有其他拒绝策略,肯定是没问题的.) 这是我服务器上的INPUT规则如下: 3306 ,6379那几个, 分别是mysql容器和 redis容器对应的端口号,第一行表示,input默认策略是 Drop. 这台服务器的结构很简单,就是一张外网网卡, 直接接外网,eth0 ,  ip=101.*.*.*,   然后docker0网桥,  172.17.0.

EXSI宿主机更换硬盘后虚机启动有问题

环境说明: 最近EXSI主机磁盘坏掉了,重新换掉磁盘以后启动虚机有问题. 虚机的报错信息如下: 找了下修复方法,操作过程为: 尝试修复 (以下是百度的方法) ls -l /dev/mapper mkdir /mnt mount /dev/mapper/cl_muban-root /mnt # 这里也可以操作 提示中的 dm-0 (即 /dev/dm-0,其实/dev/mapper/cl_muban-root是链接到 /dev/dm-0 ) umount /mnt xfs_repair /dev/

Docker —— 用于统一开发和部署的轻量级 Linux 容器【转】

转自:http://www.oschina.net/translate/docker-lightweight-linux-containers-consistent-development-and-deployment 英文原文:Docker: Lightweight Linux Containers for Consistent Development and Deployment 使用Docker容器——轻量灵活的VM同类,来接管“依赖地狱”.学习Docker是如何基于LXC技术,通过把应用

Docker 快速上手系列(4): 数据卷,数据卷容器的概念及相关操作

引子 有些时候,我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷 数据卷容器 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: - 数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 卷会一直存在,直到没有容器使用 #(类似linux下的挂载(mount)) 创建数据卷 在用Docker ru

Docker环境搭建Jenkins+gitlab+maven自动打包 部署容器

宿主机安装docker(省略) 宿主机安装maven 下载二进制包解压到/var/docker_data/jenkins/jenkins_home下面 https://maven.apache.org/download.cgi Jenkins镜像安装 下载Jenkins镜像(一般都是Ubuntu版) FROM jenkins USER root #清除了基础镜像设置的源,切换成腾讯云的jessie源 #使用非腾讯云环境的需要将 tencentyun 改为 aliyun RUN echo '' >

Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

1. 首先创建一个Dockerfile文件,文件内容如下 # 选择一个已有的os镜像作为基础 FROM centos:centos6 # 镜像的作者 MAINTAINER Fanbin Kong "[email protected]" # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no RUN yum install -y openssh-server sudo RUN sed -i 's/UsePAM yes/UsePAM no/g' /

Docker的对手来了:CoreOS发布新款容器引擎Rocket

Docker 刚问世就红透半边天,不仅拿了融资,还得到了Google等巨头的支持.CoreOS此前一直忙于为 Docker 提供技术支持服务,似乎准备好好沾沾 Docker 的光,现在看来它另有一番打算:据gigaom.com的消息,昨天 CoreOS在Github上发布了一款容器引擎竞争产品原型Rocket,意在和 Docker 抢抢风头. Rocket 是一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作.CoreOS 的 CEO Alex

LCOW —— 单一Docker引擎下可同时运行Linux和Windows容器啦!

https://blog.csdn.net/m2l0zgssvc7r69efdtj/article/details/79251059 就在上周,Docker官方的master分支上新增了LCOW(Linux Containers on Windows)[1]功能.启用这项功能,即可在单一的Docker引擎下,同时运行Linux和Windows容器.下面赶紧跟小编一起,看看Windows 10将会发生哪些变化? 可以用Docker命令docker ps,列出所有正在运行的Linux或Windows