帮酷LOGO
0 0 评论

正文
文章标签:翻转  DOCK  Proxy  Docker  容器  DOC  Contain  Ubuntu  

介绍

Docker是在生产环境中运行Web应用程序的有效方法,但是你可能希望在同一Docker主机上运行多个应用程序。

Traefik是一个docker的反向代理,包括它自己的监视仪表板,在本教程中,你将使用Traefik将请求路由到两个不同的Web应用程序容器: 一个wordpress容器和一个adminer容器,每个都和一个MySQL数据库对话,你将配置Traefik以便使用HTTPS服务于Let's Encrypt

前提条件

要跟随本教程,你需要执行以下操作:

Ubuntu 16.04初始服务器设置指南配置的一台Ubuntu 16.04服务器,包括sudo非root用户和防火墙。

按照 在Ubuntu 16.04上,如何安装和使用Docker配置安装的Docker。

按照在Ubuntu 16.04上,如何安装Docker Compose 安装了Docker Compose。

一个域名和三个解析记录,db-adminblogmonitor,每个指向你服务器的IP地址,在本教程中,请用你的域名替换example.com

第1步配置和运行Traefik

使用htpasswd实用程序创建加密密码,首先,安装该实用程序,该实用程序包含在apache2-utils软件包中:


sudo apt-get install apache2-utils

然后用htpasswd生成密码,替换 secure_password 使用你要用于Traefik管理员用户的密码:


htpasswd -nb admin secure_password

程序的输出将如下所示:


Outputadmin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/

你将在Traefic配置文件中使用此输出来为Traefik运行状况检查和监视仪表板设置HTTP基本身份验证。复制整个输出行,以便以后粘贴。

为了配置Traefik服务器,使用TOML格式创建一个叫traefik.toml的新配置文件,TOML是类似于INI文件的配置语言,但是它是标准化的,此文件使我们可以配置Traefik服务器以及我们要使用的各种集成或提供程序,在本教程中,使用Traefik的三个可用提供程序: webdockeracme,用于使用let's Encrypt支持TLS 。


nano traefik.toml

首先,添加两个命名入口点httphttps,所有后端都可以在缺省情况下访问它们:

traefik.toml

defaultEntryPoints = ["http","https"]

接下来,配置web提供程序,它使你能够访问仪表板接口,在这里,你将从htpasswd命令粘贴输出:

traefik.toml

...
[web]
address =":8080"
 [web.auth.basic]
 users = ["admin:your_encrypted_password"]

仪表板是一个单独的Web应用程序,它将在Traefik容器中运行。我们的仪表板设置为在端口8080上运行。

web.auth.basic部分为仪表板配置HTTP基本身份验证,使用刚才运行的htpasswd命令的输出值作为users项的值,通过将附加登录名与逗号分隔来指定其他登录名。

接下来,定义入口点,entryPoints部分配置Traefik和代理容器可以监听的地址,将这些行添加到文件中:

traefik.toml

...
[entryPoints]
 [entryPoints.http]
 address =":80"
 [entryPoints.http.redirect]
 entryPoint ="https"
 [entryPoints.https]
 address =":443"
 [entryPoints.https.tls]

http入口点处理端口80,而https入口点使用端口443为tls/ssl ,我们自动将端口80上的所有通信重定向到https入口点,以强制所有请求的安全连接。

最后,添加此部分以为Traefik配置"加密证书"支持:

traefik.toml

...
[acme]
email ="your_email@example.com"
storage ="acme.json"
entryPoint ="https"
onHostRule = true
onDemand = false

此部分称为acme,因为ACME是用于与let's Encrypt通信以管理证书的协议的名称,为了让Traefik为主机生成证书,我们email键设置为你的电子邮件地址,然后指定将从let's Encrypt中接收到的信息存储在名为acme.json的JSON文件中,entryPoint键需要指向入口点处理端口443,在例子中,它是https入口点。

onHostRuleonDemand决定了Traefik应该如何生成证书,我们希望在创建带有指定主机名的容器时立即获取证书,这就是onHostRule设置所做的,onDemand设置将在首次发出请求时尝试生成证书,这会减慢第一个请求的速度,并使访问者非常注意,因此我们将避免这种情况。

保存文件并退出编辑器,有了所有这些配置,就可以启动Traefik 。

第2步运行Traefik容器

接下来,为代理创建一个Docker网络,以便与容器共享,Docker网络是必需的,因此我们可以使用它来使用Docker Compose运行的应用程序,我们把这个叫做网络proxy


docker network create proxy

当Traefik容器启动时,我们会将它添加到该网络中,然后我们可以在此网络中添加其他容器,以供Traefik代理到。

接下来,创建一个空文件,该文件将保存let's Encrypt信息,我们它共享到容器中,以便Traefik可以使用它:


touch acme.json

仅当容器内部的root用户对该文件有唯一的读取和写入访问权限时,Traefik才能使用此文件,为此,请锁定acme.json的权限,以便只有该文件的所有者有读写权限。


chmod 600 acme.json

文件传递到Docker后,所有者将自动更改为容器内的root用户。

最后,使用以下命令创建Traefik容器:


docker run -d 
 -v /var/run/docker.sock:/var/run/docker.sock 
 -v $PWD/traefik.toml:/traefik.toml 
 -v $PWD/acme.json:/acme.json 
 -p 80:80 
 -p 443:443 
 -l traefik.frontend.rule=Host:monitor.example.com 
 -l traefik.port=8080 
 --network proxy 
 --name traefik 
 traefik:1.3.6-alpine --docker

命令太长了,让我们把它分解一下。

使用-d标志在后台作为守护进程运行容器,然后我们docker.sock文件共享到容器中,以便Traefik进程可以监听容器的更改,我们还共享traefik.toml配置文件和我们创建到容器中的acme.json文件。

接下来,Docker主机的:80:443映射到Traefik容器中的相同端口,以便Traefik接收到服务器的所有HTTP和HTTPS通信。

然后我们设置两个Docker标签,告诉Traefik将流量定向到主机名,monitor.example.com 在Traefik容器中移植:8080,公开监视仪表板。

我们容器的网络设置为proxy,并将容器命名为traefik

最后,使用这个容器的traefik:1.3.6-alpine图像,因为它很小。

在例子中,我们参数--docker传递给entryPoint,确保docker提供程序在默认设置中注册,docker提供程序使Traefik可以作为Docker容器前面的代理,Docker提供程序的默认配置对我们很好,因此我们不需要在traefik.toml中配置它。

启动容器后,你现在有了一个可以访问容器的仪表板,可以查看容器的健康状况,你还可以使用此仪表板来可视化Traefik已注册的前端和后端,通过将你的浏览器指向 https://monitor.example.com 将提示你输入用户名和密码,这是admin和你在步骤1中配置的密码。

第3步向Traefik注册容器

运行Traefik容器后,你就可以在它后面运行应用程序了,让我们在Traefik后面启动以下容器:

博客使用官方的WordPress镜像 ,数据库管理服务器使用官方Adminer镜像

使用docker-compose.yml文件,使用Docker Compose管理这两个应用程序:


nano docker-compose.yml

将以下行添加到文件,以指定要使用的版本和网络:

docker-compose.yml

version:"3"

networks:
 proxy:
 external: true
 internal:
 external: false

使用Docker Compose版本3,因为它是Compose文件格式的最新版本。

为了让Traefik识别应用程序,它们必须是同一个网络的一部分,并且由于我们手动创建了网络,所以我们通过指定proxy的网络名并将external设置为true来,然后定义另一个网络,以便我们可以将暴露的容器连接到我们不会通过Traefik暴露的数据库容器。我们把这个叫做internal

接下来,我们定义每个services,一次一个,从blog容器开始,我们基于官方WordPress镜像,将此配置添加到文件中:

docker-compose.yml

version:"3"
...

services:
 blog:
 image: wordpress:4.7.5-apache
 environment:
 WORDPRESS_DB_PASSWORD:
 labels:
 - traefik.backend=blog
 - traefik.frontend.rule=Host:blog.example.com
 - traefik.docker.network=proxy
 - traefik.port=80
 networks:
 - internal
 - proxy
 depends_on:
 - mysql

environment键允许你指定将在容器内设置的环境变量,我们不为WORDPRESS_DB_PASSWORD设置值,而是告诉Docker Compose从shell获取值,并在创建容器时传递它,在启动容器之前,我们在shell中定义这个环境变量,这样我们就不会把密码硬编码到配置文件中。

你可以在labels部分为Traefik指定配置值,以下是每个标签的用途:

traefik.backend在Traefik (它指向实际的blog容器)中指定后端服务的名称,traefik.frontend.rule=Host:blog.example.com 告诉Traefik检查请求的主机以及它是否与 blog.example.com 它应该将流量路由到blog容器,traefik.docker.network=proxy指定查找Traefik下的网络以查找此容器的内部IP ,由于Traefik容器可以访问所有的Docker信息,如果我们没有指定这个信息,它为internal网络获取IP ,traefik.port指定Traefik应用来将流量路由到此容器的暴露端口,

使用此配置,发送到主机80的Docker端口的所有通信都将路由到blog容器。

我们这个容器分配给两个不同的网络,这样Traefik可以通过proxy网络找到它,并且,它可以通过internal网络与数据库容器通信。

最后,depends_on键告诉Docker Compose这个容器在它的依赖项运行之后需要启动,由于WordPress需要运行数据库,所以在启动blog容器之前我们必须运行mysql容器。

接下来,通过将此配置添加到你的文件来配置MySQL服务:

docker-compose.yml

services:
...
 mysql:
 image: mysql:5.7
 environment:
 MYSQL_ROOT_PASSWORD:
 networks:
 - internal
 labels:
 - traefik.enable=false

我们使用的这个容器是官方MySQL 5.7镜像,你会注意到,我们再次使用了一个没有值的environment项,为了确保WordPress容器能够与MySQL通信,需要将MYSQL_ROOT_PASSWORDWORDPRESS_DB_PASSWORD变量设置为相同的值,我们不希望将mysql容器公开给Traefik或外部世界,所以我们只将这个容器分配给internal网络,由于Traefik可以访问Docker套接字,因此过程仍然会公开mysql容器的前端,因此我们添加Traefik traefik.enable=false

最后,添加此配置以定义Adminer容器:

docker-compose.yml

services:
...

 adminer:
 image: adminer:4.3.1-standalone
 labels:
 - traefik.backend=adminer
 - traefik.frontend.rule=Host:db-admin.example.com
 - traefik.docker.network=proxy
 - traefik.port=8080
 networks:
 - internal
 - proxy
 depends_on:
 - mysql

容器基于官方Adminer镜像,这个容器的networkdepends_on配置与我们在blog容器中所使用的完全匹配。

但是,由于我们所有的流量直接指向Docker主机上的端口80,因此需要将此容器配置为,traefik.frontend.rule=Host:db-admin.example.com 告诉Traefik检查请求的主机,如果它与 db-admin.example.com Traefik将把流量路由到adminer容器。

保存文件并退出文本编辑器。

然后,在启动容器之前,为WORDPRESS_DB_PASSWORDMYSQL_ROOT_PASSWORD变量设置shell中的值:


export WORDPRESS_DB_PASSWORD=secure_database_password
export MYSQL_ROOT_PASSWORD=secure_database_password

替换 secure_database_password 使用所需的数据库密码。

设置这些变量后,使用docker-compose运行容器:


docker-compose up -d

现在再看看Traefik管理控制台,你将看到现在有一个backend和一个frontend用于两个公开的服务器:

定位到 blog.example.com 用你的域替换example.com ,你将被重定向到一个TLS连接,现在可以完成Wordpress设置:

现在通过访问来访问管理员 db-admin.example.com 在浏览器中,再次用你的域名替换example.commysql容器没有公开到外部,但是adminer容器通过使用mysql容器名称共享的internal Docker网络访问它。

在Adminer登录屏幕上,使用用户名root,为服务器使用mysql,并使用为MYSQL_ROOT_PASSWORD设置的值,登录后,你将看到Adminer用户界面:

现在这两个站点正在运行,你可以使用,monitor.example.com 关注你的应用程序。

结束语

在本教程中,你配置了Traefik,以便将请求代理到Docker容器中的其他应用程序。

在应用程序容器级别上,Traefik配置可以很容易地配置更多服务,并且不需要重启traefik容器。

要了解更多关于Traefik可以做什么的信息,请前往官方网站Traefik文档



文章标签:DOC  Docker  DOCK  Ubuntu  Contain  Proxy  翻转  容器  

正文

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语