背景:在跨host中,如果docker任何一个重启或者销毁,docker暴露的端口以及ip将可能重新配置,这个时候需要重新记录ip跟端口。在生产环境中往往需要一个固定的ip以及端口去跟容器通信。例如mysql跟php配置,如果在php配置里面写了mysql配置如10.0.0.1:3306如果mysql在不同host里面不能使用link,这个时候mysql需要重启,造成ip以及端口改变,现在只能修改用户php里面配置。

解决方案:通过docker network可以解决这个问题

架构设计:network需要一个key-value的存储系统来存储network里面各个节点信息以及状态,并且需要安装swarm来管理docker的各个容器。在慕课网生产中我们需要一个稳定的高可用的架构设计来满足这个需要

一些说明:

  1. 使用zookeeper集群作为key-value记录中心避免单点
  2. 在docker里面使用多个swarm-manger一般是三个,监控整个docker容器状况。
  3. 容器通过network进行通信。

Network的安装

一.ubuntu安装步骤

1.在ubuntu上安装docker(最新版本 1.9.1)

执行curl -Ssl https://get.docker.com/ | sh

2.安装完成后
vi /etc/default/docker   (更新2375接收端口,修改docker_root目录,加入可信私有registry)
DOCKER_OPTS="-D -H 0.0.0.0:2375 -H unix:///var/run/docker.sock --graph /data/docker --insecure-registry imgstore.imooc.com"

3.保存并service docker restart

4.安装设置程序开机自动启动的工具(ubuntu下没有chkconfig命令)
apt-get install sysv-rc-conf -y
sysv-rc-conf docker on    (使得docker随机器启动)

5.ubuntu14.04升级到3.16内核 (原为3.13)
apt-get install linux-generic-lts-utopic -y
然后直接重启即可

二.Docker的network安装

1.安装consul

命令如下

sudo apt-get install -y unzip curl
cd /tmp/
wget https://dl.bintray.com/mitchellh/consul/0.5.2_linux_amd64.zip -O consul.zip
unzip consul.zip
mv consul /usr/local/bin
chmod +x /usr/local/bin/consul
wget https://dl.bintray.com/mitchellh/consul/0.5.2_web_ui.zip -O dist.zip
unzip dist.zip
mkdir –p /home/consul
mv dist /home/consul/
mkdir –p /data/consul
2.启动consul
consul agent -server -bootstrap-expect 1 -data-dir /data/consul -ui-dir /home/consul/dist -client 0.0.0.0
UI默认地址是http://localhost:8500/ui
如果UI没有启动,需要添加额外的-client 0.0.0.0参数重启Consult代理。
 
3.设置docker使用consul作为network的配置
首先需要编辑docker配置文件
Service docker stop
Cd /etc/default/
Vi docker

DOCKER_OPTS="-D -H 0.0.0.0:2375 -H unix:///var/run/docker.sock --graph /data/docker --insecure-registry imgstore.imooc.com

-cluster-store=consul://$(CONUSL-IP):8500  //network存储地址 --cluster-advertise=$(HOSTIP):2376" //swarm通知地址

Service docker start
 
4.启动swarm程序
a.首先启动master
在host1上启动master
docker run -ti -d --restart=always --name consul-swarm-manager  \
swarm:latest m --replication –addr $(HOSTIP):($SWARM-PORT) --host tcp://0.0.0.0:($SWARM-PORT) consul://(CONSUL-IP):8500 \
注意:SWARM-PORT可以是任何一个没有使用的端口
CONSUL-IP是你最初安装consul的地址
 
b.在host2上启动swarm-agent
docker run -ti -d --restart=always --name consul-swarm-agent \
swarm:latest j  --addr (HOSTIP):2376  consul:// (CONSUL-IP):8500 \
注意这里—addr需要监控端口是2376
 
5.创建overlay网络
docker network create --driver overlay my-net
 
6.创建容器
通过使用刚才创建的my-net网络可以做到跨主机通信于网络隔离
a.在host1上面创建ubuntu-1
docker run -itd --name=ubuntu-1 --net=my-net  ubuntu
b.在host2 上面创建ubuntu-2
docker run -itd --name=ubuntu-2 --net=my-net  ubuntu
 
7.测试case
a.在host1里面运行
docker attach ubuntu-1进入ubuntu-1
使用ping ubuntu-2能ping通
 
b.在host2里面运行
docker attach ubuntu-2 进入ubuntu-2
使用 netcat –l 1234监控1234端口
在host1里面的ubuntu-1里面运行
echo ”hello,ubuntu-2” | netcat ubuntu-2 1234
host2 里面能收到 hello,ubuntu-2
c.销毁ubuntu-2 
docker rm –f ubuntu-2
在ubuntu-1里面使用ping ubuntu-2 ping不通
重新创建ubuntu-2
docker run -itd --name=ubuntu-2 --net=my-net  ubuntu
在ubuntu-1里面能ping通
 
 

安装中出现的错误情况:

1. 这个在1.9里面已经进入bug,,下个版本可能会修复

错误:

Error response from daemon: Cannot start container 20b1998041019a5dc1e709a7814fd411d946a548f2f0644b1813d2f3c345c90a: subnet sandbox join failed for "10.10.10.0/24": error creating vxlan interface: file exists

解决方案:

# service docker stop

docker stop/waiting

node2:~# umount /var/run/docker/netns/*

node2:~# rm /var/run/docker/netns/*

node2:~# service docker start

docker start/running, process 17138

node2:~# docker run -it --name container2 --rm --net RED busybox

docker1.9 network跨主机安装的更多相关文章

  1. centos7下安装docker(15.5容器跨主机网络--flanneld)

    flannel是由CoreOS研究的一种覆盖网络(overlay network)网络工具,目的是帮助每一个host主机有一个完整的子网: 功能是:让集群中不同节点的主机创建的容器都有一个唯一的虚拟I ...

  2. centos7下安装docker(15.4跨主机网络-flannel)

    flannel是CoreOS开发的容器网络解决方案,flannel为每一个host分配一个subnet,容器从这些subnet中分配IP,这些IP可以在host之间路由,容器无需NAT和port ma ...

  3. centos7下安装docker(15.3跨主机网络-macvlan)

    除了ovrlay,docker还开发了另一个支持跨主机容器的driver:macvlan macvlan本身是linu kernel模块,其功能是允许在同一物理网卡上配置多了MAC地址,即:多个int ...

  4. centos7下安装docker(15.2跨主机网络-overlay)

    为支持容器跨主机通信,Docker提供了overlay driver,使用户可以创建基于VxLAN的overlay网络.VxLAN可将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的以太网 ...

  5. 安装docker跨主机网络flannel

    一.实验环境 机器 操作系统 安装服务 172.16.4.36 centos7 docker etcd flannel 172.16.4.37 centos7 docker etcd flanne ( ...

  6. centos7下安装docker(16.docker跨主机存储)

    从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器. 无状态:是指容器在运行的过程中不需要保存数据,每次访问的结果不依赖上一次的访问,比如提供静态页 ...

  7. centos7下安装docker(15.6docker跨主机网络---Weave)

    Weave是weaveworks开发的容器网络解决方案.weave创建的虚拟网络可以将部署在多个主机上的容器连接起来.对于容器来说,weave就像一个巨大的网络交换机,容器可以直接通信,无需NAT和端 ...

  8. centos7下安装docker(15.1跨主机网络)

    之前学习了单个host上的网络,我们知道单个host上的网络有:none,host,bridge和joined,他们解决了单个host上面的容器通信的问题:接下来我们讨论跨主机间容器通信的方案 跨主机 ...

  9. Docker容器的跨主机连接

    Docker容器的跨主机连接 Docker容器的跨主机连接 使用网桥实现跨主机容器连接 网络拓扑 网络连接使用的是Bridge 操作 修改/etc/network/interfaces文件,分配静态I ...

随机推荐

  1. L206

    There are so many new books about dying that there are now special shelves set aside forthem in book ...

  2. timer Compliant Controller project (1)--Product introduction meeting

    Last week ,I lead the meeting for new project. i'm  very excited. The meeting is divided into the fo ...

  3. 回测框架pybacktest简介(一)

    pybacktest 教程 本教程让你快速了解 pybacktest's 的功能.为此,我们回测精典交易策略移动平均线MA交叉. MA快线上穿慢线时,买进做多 MA快线下穿慢线时,卖出做空 进场规则, ...

  4. Yii用AJAX注册验证

    <script type="text/javascript"> $(document).ready(function(){ $('#RegisterForm_usern ...

  5. test20181020 B君的第一题

    题意 分析 二次剩余问题. x,y相当于二次方程 \[ x^2-bx+c=0 \mod{p} \] 的两根. 摸意义下的二次方程仍然考虑判别式\(\Delta=b^2-4c\). 它能开根的条件是\( ...

  6. memsql 多节点部署

    以前部署使用的是docker,这个测试使用的是阿里云的机器 没有使用企业版,使用的是开发版,为一个master 多个Leaf 机器列表 172.31.128.165 172.31.128.166 17 ...

  7. C#调用OCR组件识别图片文字

    图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇总一下(C#实现),方便需要的朋友查阅,也给自己做个记号. 图片识别的用途:很多人用它去破解网站的验证码,用于达到自动刷票或者是批量 ...

  8. centos alias命令详解

    Alias命令 功能描述:我们在进行系统的管理工作一定会有一些我们经常固定使用,但又很长的命令.那我们可以给这些这一长串的命令起一个别名.之后还需要这一长串命令时就可以直接以别名来替代了.系统中已经有 ...

  9. POJ3070 矩阵快速幂模板

    题目:http://poj.org/problem?id=3070 矩阵快速幂模板.mod写到乘法的定义部分就行了. 别忘了 I ( ) 和 i n i t ( ) 要传引用! #include< ...

  10. TimeExit 界面无点击定时退出类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...