Docker 多宿主互联

在之前的docker简介中介绍了一些docker基础的操作,在涉及到多台不同的宿主机上运行docker时应该如何使他们之间进行通信呢,这是这篇文章的主要内容。

docker 可以使用多种集群的解决方案,如k8s,mesos等,这个将在后面的内容中一一介绍,这里我们将使用docker原生的组件进行连接。

环境准备

两台宿主机,都安装docker. 并下载官方的centos镜像。

网络配置

在宿主机node1和node2上分别查看默认的docker0网络:

node1:
docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:c2:a4:d3:e0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft foreve
node2:
docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:2e:be:83:69 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

两个内部的网段相同,如果创建容器,两个网络肯定无法互联,所以我们修改默认docker0网络,并且使这两个网络不会和外部的网络冲突。

在node2上的 /usr/lib/systemd/system/docker.service 文件中ExecStart=区域添加参数:

--bip=10.10.0.1/16 \

重启docker服务。

分别在node1和node2上创建容器:

node1:
docker run -it --name test1 centos  bash
node2:
docker run -it --name test2 centos  bash

这时test1的ip地址为172.17.0.2, test2的地址为10.10.0.2, 两个虚拟机都是走的宿主机的内部nat,所以依然无法通信。
而容器到node1和node2宿主机都是可以正常通信的,由于我们都是设置的不同网段,所以可以在每个宿主机上单独添加一条静态路由,指定数据包的流向:

node1:

route add -net 10.10.0.0/16 gw 192.168.56.12

node2:

route add -net 172.17.0.0/16 gw 192.168.56.11

这样不同宿主机上的容器就可以互联了。

这种方式虽然简单高效,但是如果是大规模的docker集群,会难以维护,同时由于docker容器都在不同宿主机的不同网段,需要使用网络组播和广播交互的服务就无法跨主机通信了

时间: 2024-10-13 07:51:21

Docker 多宿主互联的相关文章

Docker 与 宿主机之间的文件cp

Docker 与 宿主机之间的文件cp 第一种方法是官方比较推荐的,其实和第二种方法实现是一样的. 第一种方法例: 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下. docker cp /www/runoob 96f7f14e99ab:/www/ 将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www. docker cp /www/runoob 96f7f14e99ab:/www 将容器96f7f14e99ab的/www目录

如何在docker和宿主机之间复制文件

如何在docker和宿主机之间复制文件 最近在用Docker布署hadoop,要将文件上传到HDFS首先文件得在Docker容器中吧,网上提供的方法差不多有三种 1.用-v挂载主机数据卷到容器内 2.直接在主机上拷贝到容器物理存储系统 3.用输入输出符 具体方法这篇文章写的很详细:http://blog.csdn.net/yangzhenping/article/details/43667785 但是对这三种方法我都不太喜欢,无意间看到另位一种方法供大家参考: 从主机复制到容器sudo dock

Docker容器如何互联

容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式. 该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息. 自定义容器命名 连接系统依据容器的名称来执行.因此,首先需要自定义一个好记的容器命名. 虽然当创建容器的时候,系统默认会分配一个名字.自定义命名容器有2个好处: 自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叫web 当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器 使用 --name 标记可以为

docker挂载宿主机文件夹到容器里面

docker run -d -p 8090:8080 -v /[宿主机文件绝对路径]:/[容器路径] --name [新名字] [容器名字] 例子 docker run -d -p 8090:8080 -v /usr/webapps/app1:/usr/local/tomcat/webapps --name tomcat1 docker.io/tomcat 进入容器指令 docker exec -it [容器名字] /bin/basha 注意:项目部署在tomcat下 记得放在ROOT文件夹下面

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 ub

Docker拷贝宿主机与容器中的文件

如果我们需要将宿主机文件拷贝到容器内可以使用 docker cp 命令,也可以将文件从容器内拷贝到宿主机 将宿主机文件拷贝到容器内 docker cp 要拷贝的宿主机文件或目录 容器名称:容器文件或目录 1. 在宿主机上创建一个mengxuegu文件并写入内容 2. 将mengxuegu文件拷贝进 mycentos2 容器中的 /opt 目录下(mycentos2要是UP启动状态) 3. 登录 mycentos2 容器,查看/opt目录下是否有 mengxuegu 文件 从容器内文件拷贝到宿主机

docker 访问宿主机网络

使用宿主机IP 在安装Docker的时候,会在宿主机安装一个虚拟网关docker0,我们可以使用宿主机在docker0上的IP地址来代替localhost. 首先,使用如下命令查询宿主机IP地址: ifconfig 可以发现宿主机的IP是172.17.0.1,那么将proxy_pass http://localhost:1234改为proxy_pass http://172.17.0.1:1234就可以解决502 Bad Gateway错误. 但是,不同系统下宿主机的IP是不同的,例如Linux

[Docker] Windows 宿主环境下,共享或上传文件到容器的方法

需求如题. 解决方案1 - 挂载目录(适用于创建新的容器) 格式-v 容器目录 或 -v 本地目录:容器目录 范例Linux宿主环境下:使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data. docker run -p 80:80 -v /data:/data -d nginx:latest Windows宿主环境下: docker run -it -v /d/WindowsFolder:/de

docker拷贝宿主与容器中的文件

从容器里面拷文件到宿主机 语法:docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 例子:容器名为ubuntu,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js, 现在要将test.js从容器里面拷到宿主机的 /opt 路径下面 在宿主机上面执行命令 docker cp ubuntu:/usr/local/tomcat/webapps/test/js/test.js /opt 从宿主机拷文件到容器里面