介绍
Docker链接功能可以动态地配置容器,被称为大使图案之间的网络连接的方法。 大使模式推广提供者和使用者之间的容器服务的可移植性。 在CoreOS, etcd
可以利用来实现跨集群中的多台机器分布大使格局。
在本教程中,我们将演示部署是与注册的的Apache HTTP容器etcd
。 Apache容器将代表我们的提供程序容器,我们将使用HAProxy作为我们的消费者容器。 我们将使用Docker图片来自此CoreOS大使演示我们的大使容器,我们将从头开始创建我们自己的Apache和HAProxy的Docker图像。
先决条件
您必须在DigitalOcean上拥有一个由至少三台计算机组成的CoreOS集群。 下面是关于如何设置了一个教程: 如何创建并在CoreOS群集上运行服务
您必须具有使用CoreOS,etcdctl,fleetctl,设置服务和运行Docker容器的基本知识。 这些主题涵盖了入门CoreOS系列教程 。
您必须有一个Docker Hub帐户或一个私人Docker注册表。 这是盖在创建Docker容器的部分如何创建并运行一个集群CoreOS教程服务 。
有关大使模式是如何工作的全部细节,检查出的通过容器大使链接从Docker的文章。 此外,检查出这篇文章发布在博客CoreOS: 动态Docker与搭载ETCD大使链接 。
我们的目标
在本教程结束时,我们将在两台机器上运行六个容器。 本节将简要描述每一个,以及如何将它们组合在一起。 这个确切的设置对大多数人没有用,但它可以适应于允许为您自己的服务发现动态服务。
机器A
机器A将运行提供程序容器,即Apache Web服务器,以及一些其他支持它的容器。
- Apache网络服务器 :Apache的基本容器,我们将从头开始创建,类似于中描述的一个如何创建并运行一个集群CoreOS服务教程。 这是我们的制片人
- polvi /Docker寄存器 :一个注册的容器 ,将通过APIDocker读的Apache的IP地址和端口号并将它写入
etcd
- polvi /简单-AMB:一个简单的形象大使的容器,将流量转发到指定的位置。 在这种情况下,我们将流量转发到
etcd
并将其链接到docker-register
容器提供到该容器的访问etcd
。 在CoreOS,由于位置etcd
是静态的,这可能是,如果除去docker-register
被修改,以访问etcd
直接
机器B.
机器B是将运行消费者容器(即HAProxy)和主大使容器的CoreOS机器。
- HAProxy的反向代理 :基本HAProxy的容器中,我们将从头开始创建,这将代表我们的消费 。 这将用于表明大使设置工作
- polvi /动态ETCD-AMB:主要大使容器。 动态代理的手表指定
etcd
对供应商的容器,并将所有流量提供者容器的IP地址和端口号键。 可以更新密钥的值,代理将自行更新 - polvi /简单AMB:在另一台机器上使用的相同的容器,而是用于连接
dynamic-etcd-amb
到etcd
创建Apache Docker镜像
SSH到您的一台CoreOS计算机,并传递您的SSH代理(在公共IP地址中替换):
ssh -A core@coreos-1_public_IP
然后登录Docker:
docker login
提示时输入你的USER_NAME,密码和电子邮件地址。
接下来,创建一个新目录以将Apache Dockerfile写入:
mkdir -p ambassador/apache
现在切换到该目录,并打开Dockerfile
编辑:
cd ambassador/apache
vi Dockerfile
基于来自Apache的容器设置如何创建并运行一个集群CoreOS服务 ,我们可以创建以下Dockerfile(替代user_name
用自己的Docker的用户名):
FROM ubuntu:14.04
MAINTAINER user_name
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get -y install apache2 && \
echo "<h1>Running from Docker on CoreOS</h1>" > /var/www/html/index.html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]
保存并退出。
现在我们有一个Dockerfile安装Apache并用一个基本消息替换index.html,使用以下命令(替换自己的用户名)创建你的Docker镜像并命名为“apache”:
docker build --tag="user_name/apache" .
现在,为了使图像提供给您的其他CoreOS机, push
它与下面的命令的Docker注册表:
docker push user_name/apache
现在您的Apache镜像已经可以使用了。 让我们继续创建HAProxy图像。
创建HAProxy Docker镜像
我们将创建一个HAProxy的Docker形象的基础上, HAProxy的Dockerfile可信自动化Docker建立 。 我们将稍微修改提供haproxy.cfg
和start.bash
文件。
在ambassador
目录,使用git
克隆HAProxy的存储库:
cd ~/ambassador
git clone https://github.com/dockerfile/haproxy.git
这将创建一个haproxy
目录,与Dockerfile
, haproxy.cfg
和start.bash
文件。
Dockerfile基本上安装HAProxy并公开端口80和443,所以我们可以保持原样。
我们将修改haproxy.cfg
文件,添加一个frontend
和backend
。 打开haproxy.cfg
编辑:
cd haproxy
vi haproxy.cfg
现在找到并删除以下行:
listen stats :80
stats enable
stats uri /
然后在文件末尾添加以下行:
frontend www-http
bind :80
default_backend www-backend
backend www-backend
server apache private_ipv4:80 check
这将配置HAProxy的监听端口80和传入流量转发到www-backend
,它由一台服务器。 我们将使用start.bash
脚本来替代private_ipv4
与CoreOS机的私有IP地址,这个容器将运行时,HAProxy的容器启动时。 我们的动态大使容器,HAProxy将流量转发到Apache容器,将在同一台机器上运行。
打开start.bash
文件进行编辑:
vi start.bash
在文件的底部,您将找到一条将在此容器中启动HAProxy进程的行。 它看起来像这样:
haproxy -f /etc/haproxy/haproxy.cfg -p "$PIDFILE"
在此行的正上方,插入以下行:
# Set backend IP address to machine's private IP address
PRIVATE_IPV4=$(curl -sw "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
sed -i -e "s/server apache private_ipv4:80 check/server apache ${PRIVATE_IPV4}:80 check/g" $HAPROXY/$CONFIG
保存并退出。 该curl
命令将检索该容器将通过DigitalOcean元数据服务上运行的计算机的私有IP地址。 该sed
命令替换了private_ipv4
字符串haproxy.cfg
与从元数据检索的实际IP地址。 此脚本从HAProxy容器内部运行,因此将在运行时配置专用IP地址。
现在我们准备好构建HAProxy docker镜像。 构建您的Docker镜像,并使用以下命令将其命名为“haproxy”(用您自己的用户名替换):
docker build --tag="user_name/haproxy" .
现在,为了使图像提供给您的其他CoreOS机, push
它与下面的命令的Docker注册表:
docker push user_name/haproxy
您的HAProxy图像可以使用。 我们准备写我们的车队服务单位文件!
Fleet服务单位文件
现在所有需要的Docker镜像都可用于我们的CoreOS集群,让我们开始处理部署我们的容器所需的文件。 因为我们使用的是CoreOS集群,所以我们可以从单个CoreOS机器创建和调度所有的队列服务单元文件。
我们将创造一切在服务文件~/ambassador
我们之前创建目录,所以改为现在的目录:
cd ~/ambassador
apache.service
该apache.service
单位将在主机A上运行。
我们将创建的第一个服务文件是Apache web服务器容器, user_name/apache
。 打开一个名为apache.service
现在编辑:
vi apache.service
添加以下行(在两个地方替换您的Docker用户名):
[Unit]
Description=Apache web server service
[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull user_name/apache
ExecStart=/usr/bin/docker run --rm --name %n -p ${COREOS_PRIVATE_IPV4}::80 user_name/apache
ExecStop=/usr/bin/docker stop -t 3 %n
保存并退出。 这是一个相当简单的服务文件,在前台模式下启动Apache。 特别值得注意的是,我们的专用网络接口(在绑定端口80中的容器内,以动态端口-p ${COREOS_PRIVATE_IPV4}::80
)。
etcd-amb-apache.service
该etcd-amb-apache.service
单位将在主机A上运行。
接下来我们将要创建我们的简单大使容器(服务文件simple-amb
),将允许Apache的注册容器访问etcd
。 打开一个名为etcd-amb-apache.service
现在:
vi etcd-amb-apache.service
添加以下行:
[Unit]
Description=Simple Apache ambassador
After=apache.service
BindsTo=apache.service
[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001
ExecStop=/usr/bin/docker stop -t 3 %n
[X-Fleet]
X-ConditionMachineOf=apache.service
保存并退出。
在simple-amb
容器将其转发接收端口10000在启动时提供的说法,即所有交通172.17.42.1:4001
,这是etcd
在CoreOS的标准位置。
X-ConditionMachineOf=apache.service
告诉车队安排此在同一台机器作为Apache容器,因为它使用的是关键的docker-register
容器注册Apache是否使用的IP地址和端口etcd
。
apache-docker-reg.service
在apache-docker-reg.service
单位将在主机A上运行。
让我们为我们的容器将在注册Apache的IP地址和端口的服务文件etcd
, docker-register
。 打开文件名为apache-docker-reg.service
现在:
vi apache-docker-reg.service
插入以下行:
[Unit]
Description=Register Apache
After=etcd-amb-apache.service
BindsTo=etcd-amb-apache.service
[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --link etcd-amb-apache.service:etcd -v /var/run/docker.sock:/var/run/docker.sock --rm polvi/docker-register apache.service 80 apache-A
[X-Fleet]
X-ConditionMachineOf=etcd-amb-apache.service
保存并退出。 这里是的显着部分的击穿docker run
命令:
-
--link etcd-amb-apache.service:etcd
链接这个容器简单的形象大使,这将被用来传递Apache的连接信息,etcd
-
-v /var/run/docker.sock:/var/run/docker.sock
允许这种容器来确定Apache是经由它将运行在机器的DockerAPI结合到动态端口。 -
apache.service 80 apache-A
通过这些参数传递给容器。 前两个参数指定名称和Docker容器的口来查找,第三个参数指定的名称etcd
键写入。 此容器启动后,它会写的动态端口和IP地址apache.service
到/services/apache-A/apache.service
键。
X-ConditionMachineOf=etcd-amb-apache.service
告诉车队安排此在同一台计算机的简单形象大使的容器,因为它们与Docker链接链接是至关重要的,提供登记容器办法找到etcd
。
etcd-amb-apache2.service
该etcd-amb-apache2.service
单位将主机B上运行。
为我们的第二个简单大使容器(服务文件simple-amb
),将允许动态大使容器访问etcd
。 打开一个名为etcd-amb-apache2.service
现在:
vi etcd-amb-apache2.service
添加以下行:
[Unit]
Description=Simple Apache ambassador 2
[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001
ExecStop=/usr/bin/docker stop -t 3 %n
[X-Fleet]
X-Conflicts=apache.service
保存并退出。
这是几乎相同的服务文件etcd-amb-apache.service
除X-Conflicts=apache.service
告诉车队安排它在不同的机器比Apache的容器上,它会被用来链接动态驻etcd
。
apache-dyn-amb.service
在apache-dyn-amb.service
单位将主机B上运行。
创建我们的动态大使容器(服务文件dynamic-etd-amb
),将允许动态大使容器访问etcd
。 打开文件名为apache-dyn-amb.service
现在:
vi apache-dyn-amb.service
添加以下行:
[Unit]
Description=Dynamic ambassador for Apache
After=etcd-amb-apache2.service
BindsTo=etcd-amb-apache2.service
[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull polvi/dynamic-etcd-amb
ExecStart=/usr/bin/docker run --link etcd-amb-apache2.service:etcd --rm --name %n -p ${COREOS_PRIVATE_IPV4}:80:80 polvi/dynamic-etcd-amb apache-A 80
ExecStop=/usr/bin/docker stop -t 3 %n
[X-Fleet]
X-ConditionMachineOf=etcd-amb-apache2.service
保存并退出。 这里是的显着部分的击穿docker run
命令:
-
--link etcd-amb-apache2.service:etcd
链接此容器第二个简单的形象大使,这将被用来检索从Apache的连接信息etcd
-
-p ${COREOS_PRIVATE_IPV4}:80:80
暴露在容器和机器的专用网络接口端口80上 -
apache-A 80
是指定端口80的流量两个参数(即专用网络接口上的端口80)应该被代理到注册为服务apache-A
在etcd
X-ConditionMachineOf=etcd-amb-apache2.service
告诉车队安排此在同一台计算机的第二个简单大使容器,因为它们与Docker链接链接是至关重要的,以提供动态大使容器办法找到etcd
。
haproxy.service
该haproxy.service
单位将主机B上运行。
为我们HAProxy的容器(一个服务文件haproxy
将用于连接到Apache容器,通过动态大使容器)。 打开文件名为haproxy.service
现在:
vi haproxy.service
添加以下行(在两个地方替换您的Docker用户名):
[Unit]
Description=HAProxy consumer
[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull user_name/haproxy
ExecStart=/usr/bin/docker run --name %n -p ${COREOS_PUBLIC_IPV4}:80:80 user_name/haproxy
ExecStop=/usr/bin/docker stop -t 3 %n
[X-Fleet]
X-ConditionMachineOf=apache-dyn-amb.service
保存并退出。 这是一个简单的服务文件,启动HAProxy并公开其主机的公共IP地址上的端口80。 请记住,后端服务器将配置为主机在80端口的私有IP地址,恰好在动态大使正在侦听代理到Apache服务的流量的位置。
X-ConditionMachineOf=apache-dyn-amb.service
告诉车队在同一台机器上安排此为动态大使容器,它是重要的,因为动态大使提供了一个路线HAProxy的容器去Apache的容器。
部署与Fleet
现在我们有了所有必要的fleet服务文件,我们可以最终部署我们的大使设置。 在包含所有服务文件的目录中,运行以下命令:
fleetctl start apache.service
fleetctl start etcd-amb-apache.service
fleetctl start apache-docker-reg.service
fleetctl start etcd-amb-apache2.service
fleetctl start apache-dyn-amb.service
fleetctl start haproxy.service
您应该看到消息说,每个服务加载。 要检查您的机队单位的状态,请运行以下命令:
fleetctl list-units
您应该看到类似于以下内容的输出:
UNIT MACHINE ACTIVE SUB
apache-docker-reg.service ceb3ead2.../10.132.233.107 active running
apache-dyn-amb.service 3ce87ca7.../10.132.233.106 active running
apache.service ceb3ead2.../10.132.233.107 active running
etcd-amb-apache.service ceb3ead2.../10.132.233.107 active running
etcd-amb-apache2.service 3ce87ca7.../10.132.233.106 active running
haproxy.service 3ce87ca7.../10.132.233.106 active running
所有的状态应该是active
和running
。 另一个要注意的是,“机器A”单元应该在同一台机器上,“机器B”单元应该在不同的机器上 - 只需查看每个单元的IP地址来确认这一点。
测试您的设置
确保HAProxy可以达到Apache
因为我们没有指定HAProxy容器应该在特定的机器上运行,我们需要找到它在哪里运行。 一个简单的方法来做到这一点是使用fleetctl ssh
命令:
fleetctl ssh haproxy.service
这将您连接到正在运行的机器haproxy.service
容器。 现在,您可以源/etc/environment
文件,以获取运行HAProxy的的CoreOS机器的公网IP地址:
. /etc/environment
echo $COREOS_PUBLIC_IPV4
获取生成的IP地址,并使用Web浏览器转到它。 您将看到以下图像:
请注意,您正在访问HAProxy,并且HAProxy正通过动态ambassador代理访问Apache。
现在,您可以退出当前的SSH会话以返回到原始的SSH会话:
exit
测试故障转移
现在你已经证实了大使的设置工作,让我们看看当提供服务(会发生什么apache.service
)更改其IP地址和端口。
使用fleetctl
连接到正在运行的机器apache.service
:
fleetctl ssh apache.service
现在重新启动Apache正在运行的机器:
sudo reboot
注意:如果apache.service
是您最初通过SSH连接到机器上运行,你将被断开。 如果是这种情况,只需SSH到同一CoreOS集群中的另一台计算机。
现在等待一分钟,检查哪些设备正在运行:
fleetctl list-units
根据你等了多久,你可能会看到三个单位与“主机A”( apache.service
, etcd-amb-apache.service
和apache-docker-reg.service
)的重新启动或活动。 最终,他们都应该回到工作状态。 一旦他们这样做,请注意,他们现在在不同的机器上运行比以前。
现在回到您连接到HAProxy的Web浏览器,然后点击刷新。 您应该看到与之前相同的测试页,表明HAProxy仍然能够通过动态大使连接到Apache!
结论
现在您已经设置了自己的大使模式,您应该能够将本教程中介绍的概念适应您自己的服务。 它是在运行时配置您的消费者服务的一种独特方式,它允许您轻松地在机器之间移动您的后端提供程序服务。 在更现实的设置中,您可能会用一个或多个应用程序容器替换Apache服务,您可以使用多个后端服务器(或使用完全不同的使用者服务)配置HAProxy。