Docker实现与主机同网段其他设备互通过程
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">Docker与主机同网段其他设备互通</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1、docker网络</a></li><li><a href="#_lab2_0_1">2、自定义网络使用</a></li></ul><li><a href="#_label1">实践操作</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">1、Overlay网络模式详解</a></li><li><a href="#_lab2_1_3">2、Consul服务发现</a></li><li><a href="#_lab2_1_4">3、修改docker配置</a></li><li><a href="#_lab2_1_5">4、实践机器规划</a></li><li><a href="#_lab2_1_6">5、创建overlay网络</a></li><li><a href="#_lab2_1_7">6. 跨主机创建容器验证</a></li></ul><li><a href="#_label2">常见问题</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_8">1、如遇错误常用命令</a></li><li><a href="#_lab2_2_9">2、将容器以指定IP链接到自定义网络中</a></li><li><a href="#_lab2_2_10">3、将容器从自定义网络中删除</a></li></ul><li><a href="#_label3">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>Docker与主机同网段其他设备互通</h2><p>对开发者而言,随着容器的普遍使用,开发者可以很方便的搭建项目的简易测试环境。</p>
<p>有时候为了项目可以在任意机器一键运行,不用配置连接IP等信息。所以希望可以提前固定容器的IP地址,而且一个项目有时候涉及多个容器,可能还会部署在多台机器上。所以如果容器间可以固定IP跨机器通信的话,会有很大方便。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1、docker网络</h3>
<p>docker容器默认是一个有自己独立网络空间的虚拟系统。</p>
<p>docker安装后自动创建3中网络:bridge、host、none。</p>
<ul><li><code>bridge</code>:网桥模式,默认创建docker0网桥,172.17.0.0/16,宿主机可访问,外部机器不可见。</li><li><code>host</code>:共享宿主机网络模式,外部主机与容器直接通信,容器缺少了隔离性。</li><li><code>none</code>:禁用网络模式。</li></ul>
<p><strong>docker自定义网络</strong></p>
<p>docker提供了三种自定义网络驱动:bridge、overlay、macvlan。</p>
<ul><li>bridge驱动类似默认的bridge网络模式。</li><li>overlay和macvlan是用于创建跨主机网络。</li></ul>
<p>支持自定义网段、网关,docker network create --subnet 172.77.0.0/24 --gateway 172.77.0.1 my_net。</p>
<p>docker创建容器使用默认docker0网络不支持自定义固定IP,都是动态的。</p>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2、自定义网络使用</h3>
<p>自定义创建网段。docker network create --subnet=172.18.0.0/16 spark-net。</p>
<p>指定网络驱动docker network create -d overlay --subnet 10.22.1.0/24 --gateway 10.22.1.1 spark-net-0。</p>
<p>创建容器固定IP。</p>
<div class="jb51code"><pre class="brush:bash;">docker run --name cloud1 \
--net spark-net --ip 172.18.0.2 \
-h cloud1 \
-it ubuntu
docker run --name cloud1_0 \
--network spark-net-0 --ip 10.22.1.26 \
-h cloud1 \
-it ubuntu</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>实践操作</h2>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1、Overlay网络模式详解</h3>
<p>Overlay网络是目前比较主流的跨节点容器间数据传输和路由方案。</p>
<p>Overlay网络模式在主机网络之上,在多个Docker主机之间实现分布式网络,允许跨容器之间的交互。</p>
<p>Overlay网络指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。</p>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2、Consul服务发现</h3>
<p>Consul是一个分布式、高可用性和多数据中心感知工具,用于服务发现、配置和编排。Consul 支持大规模快速部署、配置和维护面向服务的架构。</p>
<p>部署单节点的consul服务(可选择公网服务器,或者能与其他部署容器通信的主机)。</p>
<div class="jb51code"><pre class="brush:bash;"># 拉取镜像
docker pull progrium/consul
# 运行consul容器
docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap
# -h:表示consul的主机名
# --name consul:表示为该容器名
# --restart=always表示可以随着docker服务的启动而启动;
# 运行consul容器,该服务的默认端口是8500;-p:表示将容器的8500端口映射到宿主机的8500端口
# -serve -bootstarp:表示当在群集中,加上这两个选项可以使其以master的身份出现</pre></div>
<p>管理访问地址</p>
<div class="jb51code"><pre class="brush:bash;">http://IP:8500/ui/#/dc1/kv/docker/nodes/</pre></div>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>3、修改docker配置</h3>
<div class="jb51code"><pre class="brush:bash;"># 所有需要通信的机器都需要修改
vim /etc/docker/daemon.json
# 增加 cluster-store、cluster-advertise两个参数
{
"registry-mirrors": ["https://xxxx.xxxx.aliyuncs.com","https://registry.docker-cn.com"],
"cluster-store": "consul://IP:8500",
"cluster-advertise": "ens33:2376"
}
# cluster-store,是配置sonsul集群的访问地址
# cluster-advertise,是广播通信地址和端口
# 重启docker
systemctl daemon-reload
systemctl restart docker
#如果有端口拒绝访问问题,可直接关掉防火墙
#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service
#查看开放端口列表
firewall-cmd --list-ports</pre></div>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>4、实践机器规划</h3>
<p>本文实践创建了3台虚机:</p>
<blockquote><p>192.168.17.150 192.168.17.151 192.168.17.152</p></blockquote>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>5、创建overlay网络</h3>
<p>选其中一台机器执行,例如在192.168.17.150执行</p>
<div class="jb51code"><pre class="brush:bash;"># 创建overlay网络,并自定义制定网段以及网关
# 可以通过制定不同的网段,以隔离不同的服务
docker network create -d overlay --subnet 10.22.1.0/24--gateway 10.22.1.1 spark-net
# 每台机器查看创建的网络
docker network ls
# 查看具体信息
docker network inspect spark-net</pre></div>
<p>删除网络命令</p>
<div class="jb51code"><pre class="brush:bash;"># 删除自定义网络
docker network rm spark-net
# 如果有已连接的,先断开连接
docker network disconnect -f net-spark con1</pre></div>
<p>注意:</p>
<p>例如:在cloud1机器上,可以执行docker network disconnect -f spark-net cloud2但是执行docker network disconnect -f spark-net cloud1就无效,必须跨机器执行断连。</p>
<p class="maodian"><a name="_lab2_1_7"></a></p><h3>6. 跨主机创建容器验证</h3>
<p>192.168.17.150机器上执行。</p>
<div class="jb51code"><pre class="brush:bash;">docker run --name cloud1 \
-p 50070:50070 \
-p 8088:8088 \
-p 8080:8080 \
-p 7077:7077 \
-p 9000:9000 \
-p 16010:16010 \
--network net-spark --ip 10.22.1.26 \
-h cloud1 \
--add-host cloud1:10.22.1.26 \
--add-host cloud2:10.22.1.27 \
--add-host cloud3:10.22.1.28 \
-it spark:v4</pre></div>
<p>192.168.17.151机器上执行。</p>
<div class="jb51code"><pre class="brush:bash;">docker run --name cloud2\
--network net-spark --ip 10.22.1.27 \
-h cloud2 \
--add-host cloud1:10.22.1.26 \
--add-host cloud2:10.22.1.27 \
--add-host cloud3:10.22.1.28 \
-it spark:v4</pre></div>
<p>192.168.17.152机器上执行。</p>
<div class="jb51code"><pre class="brush:bash;">docker run --name cloud3 \
--network net-spark --ip 10.22.1.28 \
-h cloud3 \
--add-host cloud1:10.22.1.26 \
--add-host cloud2:10.22.1.27 \
--add-host cloud3:10.22.1.28 \
-it spark:v4</pre></div>
<p>可分别在三个容器内互相ping IP10.22.1.26、10.22.1.27、10.22.1.28验证。</p>
<p class="maodian"><a name="_label2"></a></p><h2>常见问题</h2>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>1、如遇错误常用命令</h3>
<p>如果网络改动,需要重启docker</p>
<div class="jb51code"><pre class="brush:bash;">systemctl daemon-reload
systemctl restart docker</pre></div>
<p>关掉防火墙</p>
<div class="jb51code"><pre class="brush:bash;"># 停止firewall
systemctl stop firewalld.service
# 禁止firewall开机启动
systemctl disable firewalld.service
# 查看开放端口列表
firewall-cmd --list-ports
# 开放端口
firewall-cmd--zone=public --add-port=2379/tcp --permanent
# 重新载入
firewall-cmd --reload</pre></div>
<p class="maodian"><a name="_lab2_2_9"></a></p><h3>2、将容器以指定IP链接到自定义网络中</h3>
<div class="jb51code"><pre class="brush:bash;">#容器cloud3以IP10.22.1.28链接到overlay网络spark-net
docker network connect --ip 10.22.1.28 spark-net cloud3</pre></div>
<p class="maodian"><a name="_lab2_2_10"></a></p><h3>3、将容器从自定义网络中删除</h3>
<div class="jb51code"><pre class="brush:bash;"># 注意不可在当前容器里执行断连
# 例如 需要断连容器cloud2,则需要在容器cloud1中执行如下命令
docker network disconnect -f spark-net cloud2</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。 </p>
頁:
[1]