- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章利用OpenVSwitch在多台主机上部署Docker的教程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
【编者的话】当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛。在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂。嗯,是的,本文用到了 OpenVSwitch.
运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器。这台主机可以是Linux服务器,也可以是Mac(借助类似boot2docker的项目).
在多台主机上运行却是另外一回事…… 。
可选方案:
分别在每台主机上运行Docker,在公网或内网网卡上暴露端口以便容器间相互通讯。这可能比较麻烦,而且会引发安全问题。 运行类似Weave的中间层方案来完全地抽象网络。这个项目前景不错,不过还太年轻,尚未与compose(之前的fig)或maestro-ng这类编排工具整合。 运行类似Deis或Flynn的Docker多主机一站式方案。这可能不在你的考虑范围内。 在主机间的网状网络中创建一个共享网桥,让Docker服务在那运行容器。这听起来有点复杂,不过……本文中我们将看到这可以非常容易地完成! 。
概述 。
基本上,我们将执行以下步骤:
就是这样。重启服务或重启服务器后,你将获得一个具备连接冗余(link redundancy)的全网状网络,Docker服务可以在专用的IP范围(不会重叠)上运行容器,并且不需要在公网或内网网卡上暴露所有端口就能互联。很棒,对么? 技术 。
简单列一下我们用到的技术:
我们将假定服务器运行的是Ubuntu Server 14.04.02 LTS x64,对于其它系统,你可能需要修改下面提供的各项配置。 安装 Docker 。
无需多言,遵循官网提供的指南就行。稍后我们将深入其配置,以便运行于服务器上的不同Docker服务可相互协作。 OpenVSwitch 。
糟糕的是,默认仓库里OpenVSwitch安装包不可用(或过期了),我们需要自己构建.deb文件(一次),然后分发给不同主机。为了保持生产机的整洁,可另外找台小主机来安装开发包,并构建安装包.
OpenVSwitch GitHub上有详细的构建手册.
执行下列命令来构建安装包(新版请按要求修改):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#获取最新存档
wget http:
//openvswitch
.org
/releases/openvswitch-2
.3.1.
tar
.gz
tar
xzvf openvswitch-2.3.1.
tar
.gz
cd
openvswitch-2.3.1
#安装依赖
sudo
apt-get
install
-y build-essential fakeroot debhelper \
autoconf automake
bzip2
libssl-dev \
openssl graphviz python-all procps \
python-qt4 python-zopeinterface \
python-twisted-conch libtool
# 构建(不使用并行检查)
DEB_BUILD_OPTIONS=
'parallel=8 nocheck'
fakeroot debian
/rules
binary
# 得到最新deb文件并复制到某处
cd
..
ls
-al *deb
|
现在你有了新的.deb安装包,接下来将其推送并安装到所有主机上.
1
2
3
4
5
6
7
8
|
# 复制包到各主机并ssh登录
scp
-r *deb user@remote_host:~/.
ssh
user@remote_host
# 安装一些依赖(后面需要)并安装包
sudo
apt-get
install
-y bridge-utils
sudo
dpkg -i openvswitch-common_2.3.1-1_amd64.deb \
openvswitch-switch_2.3.1-1_amd64.deb
|
配置 网络 。
你可以使用OpenVSwitch提供的不同命令行工具来构建网状网络(比如ovs-vsctl),不过Ubuntu提供了一个辅助工具让你可以通过/etc/network/interfaces文件定义网络.
假定三台主机:1.1.1.1、2.2.2.2和3.3.3.3,可以通过上述IP相互ping通,它们是在公网或内网上并不重要。host1的/etc/network/interfaces大概如下.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
...
# eth0、eth1和lo配置
...
# auto:为了有效地在主机启动时启动它
# br0=br0:防止在`ifquery --list`时被找到
auto br0=br0
allow-ovs br0
iface br0 inet manual
ovs_type OVSBridge
ovs_ports gre1 gre2
ovs_extra
set
bridge ${IFACE} stp_enable=
true
mtu 1462
# 没有auto,这是ovs的一个额外配置
# 两台主机的gre名字必须相符
allow-br0 gre1
iface gre1 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra
set
interface ${IFACE}
type
=gre options:remote_ip=2.2.2.2
allow-br0 gre2
iface gre2 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra
set
interface ${IFACE}
type
=gre options:remote_ip=3.3.3.3
# auto:启动时创建
# 定义docker要使用的docker0,并(在可用时)连接到到OpenVSwitch创建的br0网桥上
# 每台主机需要使用不同的IP地址(不要相互冲突!)
auto docker0=docker0
iface docker0 inet static
address 172.17.42.1
network 172.17.0.0
netmask 255.255.0.0
bridge_ports br0
mtu 1462
|
在其它主机上要对这个配置上做些调整:remote_ip的IP地址要相互配对.
几点说明:
如果现在重启服务器,你将拥有一个具备冗余的网状网络,你可以运行以下命令来测试:
。
Docker 。
我们现在有了一个完善的网络,每个Docker服务都可以将它们的容器挂接到docker0网桥上。让Docker自动完成这步不是很棒么?答案在于Docker有能力分配一个最小的IP地址池! 。
对于该示例,我们假定:
如果你的主机多于3台,你需要细分一个每个范围,或根据组织需要对整个网络拓扑结构进行重新考虑.
。
host1的配置文件(/etc/default/docker)是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
BRIDGE=docker0
CIDR=172.17.64.0
/18
wait_ip() {
address=$(ip add show $BRIDGE |
grep
'inet '
|
awk
'{print $2}'
)
[ -z
"$address"
] &&
sleep
$1 || :
}
wait_ip 5
wait_ip 15
DOCKER_OPTS="
-H unix:
///var/run/docker
.sock
-H tcp:
//0
.0.0.0:2375
--fixed-cidr=$CIDR
--bridge $BRIDGE
--mtu 1462
"
|
你可以根据需要修改DOCKER_OPTS配置,添加镜像、不安全的registry、DNS等等.
说明:
结语 。
重启一下(至少保证启动时所有东西都会自动上线).
你可以试试以下命令看看一切是否正常.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 访问host1
ssh
user@host1
# 运行一个新容器
docker run -ti ubuntu
bash
# 检查IP(在容器内运行)
ip add |
grep
eth0
#
# 在其他窗口中
#
# 访问另一台主机(host2或3)
ssh
user@host2
# 运行一个新容器
docker run -ti ubuntu
bash
# Ping其他的容器!
ping
$IP
|
这不是一份指导如何在多主机上设置Docker的权威指南,欢迎大家提出批评(译者注:译稿也一样,请大家多多指正)。很多想法是在整体安装时产生的,本文尽可能详细地说明了为何选择这个或那个选项.
如果将分级网桥、VLAN等包括进来,事情将更复杂,不过那超出了本文的范围。;) 。
显然,更完整的网络是有需求的,而且看起来这个已经在开发中.
最后此篇关于利用OpenVSwitch在多台主机上部署Docker的教程的文章就讲到这里了,如果你想了解更多关于利用OpenVSwitch在多台主机上部署Docker的教程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 *.sql 文件中得到了我的数据库转储(表、函数、触发器等)。此时我正在通过 jenkins 部署它们,通过传递执行 shell 命令: sudo -u postgres psql -d my_
我正在使用网络部署 API 来部署网络包(.zip 文件,由 MSDeploy.exe 创建)以编程方式将包发布到服务器(在发布包之前我们需要做一些其他事情这就是为什么我们不使用 MSDeploy.e
我们正在使用 Web Deploy 3 的(几乎完全未记录的)“公共(public) API”来创建我们网站的 .zip 包,然后将其同步到服务器: DeploymentBaseOptions des
将 clojure 应用程序制作成可执行文件的最简单方法是什么,例如 http://rawr.rubyforge.org/ ruby 吗? (exe 和 app 文件也是) 最佳答案 使用 leini
是否可以下载 Android 源代码并针对任何设备进行编译? 我想做的是尝试 GSM 代码部分并编译操作系统并将其部署到我的摩托罗拉手机上。 谢谢! 最佳答案 是的,但这很难,因为大多数手机不共享驱动
我正在考虑用 c/c++ 编写需要在大多数个人计算机上运行的 nbody 样式模拟。本质上是一个 O(n^2) 粒子模拟器。 因为这需要相当用户友好,所以我希望有 1 个不需要用户安装任何东西的 Wi
需要了解 kubernetes 部署中 kube_deployment_status_replicas 和 kube_deployment_spec_replicas 指标的区别 最佳答案 简而言之,
我正在尝试使用分类器部署 Maven Artifact 。由于我需要源代码和 JAR(我从 GWT 使用它),我想获得 artifact-version-classifier.jar 和 artifa
我设置部署以将我的项目代码与存储我的网站的 FTP 服务器上的项目同步。 但是,每次尝试同步时,我总是必须登录。 我什至检查了记住,但它不起作用! 我正在使用最新的 PhpStorm 2017.1.4
我在 Visual Studio 2008 中开发了一个 ASP.NET 网站。现在我想在其他机器上部署它。我怎样才能做到这一点??就像我们为 Windows 应用程序制作安装包一样,我们可以为 AS
将 QT 框架添加到我的 .app 包中 我正在关注 Qt 站点上关于部署的文档。 我创建了一个名为 HTTPClient.app 的应用程序 我在 Contents 下创建了 Framework 文
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
我正在研究改变我目前创建营销网站的策略。目前,我完全用 PHP 从头开始构建网站,使用一个简单的包含系统。所有代码(以及内容)都存储在文件(而不是数据库)中,允许我使用 Subversion 进行
我有一个长期运行的服务(在 while 1 循环中)并通过 GCloud pub/sub 处理有效负载,之后它将结果写入数据库。 该服务不需要监听任何端口。 Kind=Deployment 的声明性
似乎部署已停滞不前。我该如何进一步诊断? kubectl rollout status deployment/wordpress Waiting for rollout to finish: 2 ou
我正在Dart中使用前端的Angular和后端的Shelf构建一个客户端/服务器应用程序。当我执行pub build时,它会按预期生成Dart文件的javascript,但不会替换HTML文件中的Da
我在 Azure 部署中心的下拉列表中看不到我的所有 Github 组织存储库。 Azure 很久以前就已经被授权了,下拉列表正确地显示了所有的存储库,直到上周我在 DevOps 中玩游戏时,不得不再
我认为标题几乎说明了一切...对于 Deployd 来说是全新的,所以任何关于如何最好地实现这一点的指示都值得赞赏。 最佳答案 要获取用户创建的集合中的对象(我假设您使用的是 javascript 库
我有一个试图用于CD服务器的部署脚本,但是在编写bash脚本以完成一些所需的步骤(例如运行npm和迁移命令)时遇到了问题。 我将如何从该脚本进入容器bash,运行下面的命令,然后退出以完成对更改的提取
我想在使用 kubectl 时将参数传递给 Kubernetes 部署命令应用部署文件。 示例:在我的部署 .yaml 中,我有如下参数,我想在使用 kubectl apply - f .yaml 运
我是一名优秀的程序员,十分优秀!