跳到主要内容

自动化运维:Docker部署详细攻略

· 阅读需 19 分钟
木日夏复

目标

  • Docker基础知识与应用
  • 向您展示如何在整个开发过程中使用Docker
  • 使用Buddy与Docker阐释应用程序自动化部署过程
提醒

本指南内容需要基本的Git知识。如果您没有版本控制系统的经验,您可以在此处上手Git

为什么要使用Docker?

作为开发人员,您应该知道,在计算机上运行应用程序之前,您需要先配置其环境。执行此操作所需的任务列表可能很长,包括如下:

  • 安装数据库 版本 xx.xxx
  • 安装文件 服务器版本 yy.yyy
  • 安装软件包 版本 xy.zzz

诸如此类...

环境管理繁琐且成本高昂

环境中的每个更改(例如数据库版本更改)、新添软件包或任何其他依赖项都意味着:

  • 每个开发人员都必须将这一特定更改引入他的机器
  • 发布后,必须将所有更改引入生产服务器

如果没有适当的工具,很难跟踪依赖项。而且,无论是否使用,与配置相关的问题往往会意外出现,并且难以调试和修复。这就是为什么多年来我们测试了各种排除方法。

当前工具可能缓慢且复杂

我们使用虚拟机和配置管理工具,如Vagrant、Ansible或Puppet。然而,虚拟机非常耗费资源,并且启动和停止所需的时间非常长,以至于减慢了工作进度。处理配置管理工具也非常耗时,并且需要专业知识。

Docker解决方案

Docker logo

Docker如何帮助您处理上述问题? 让我们从Docker本身的定义开始并从实践中证明。

信息

Docker容器将一个软件包装在一个完整的文件系统中,其中包含运行所需的一切:代码、运行时、系统工具、系统库 —— 任何可以安装在服务器上的东西。无论其环境如何都能保证软件将始终以相同的方式运行。

明确思路:

  • Docker是一个等同于虚拟机但更快消耗更少资源
  • 只需几分钟时间,您就可以使用任何操作系统在任何服务器上运行Docker。

听起来,Docker是不是很不错,要不要试试? 接下来我们来看看使用它有多么容易。

开发进程中的Docker

假设我们刚刚聘请您作为负责我们网站的开发人员。要开始工作,您需要访问至:

  • 项目应用源码 – 应该已经存在于存储仓中,如果没有,您首先要做的应该是把源码放置于版本控制系统中。
  • 文档 – 它将告诉您应该在计算机上安装哪些组件以及如何配置以便在本地运行应用程序。在实践中应该这样做,但十有八九根本就没有什么文档供您现用。

在使用Docker时,我们消除了处理配置时最棘手的问题:

  • 确定需要安装哪些组件
  • 为每个组件选择正确的版本
  • 正确配置组件以便在本地运行应用程序

让我们来看一个简单的例子,证明Docker是如何处理。

Docker配置

安装Docker

首先,您需要根据供应商网站上的指南安装Docker:

下载示例文件

为了向您展示Docker的工作原理,我们将使用一个具有已Docker化应用程序的存储仓,下载此压缩文件并将内容解压到任何目录中。

促使Docker运行

运行终端,转到解压缩文件的目录,然后执行docker compose up命令:

cd 解压文件目录
docker compose up

结果完美

搞定!您的开发环境正在运行,您可以浏览网站于http://localhost:8080:

网站预览

注: 您所做的只是安装Docker,没有安装HTTP服务器、无需处理依赖项,一个组件都不需要配置。然而一切就绪,是不是很赞?那让我们继续深入其中!

更改代码: 蓝色就是经典

现在,用您喜欢的编辑器打开 index.html 文件并随意更改,例如,更改:

<body class="bg-black">

<body class="bg-blue">

享受您的新背景

保存更改并刷新网站。目前网站背景已变为蓝色,您的更改立即可见!给您什么样的工作结论呢? 快速地向您介绍我们的团队,您的工作做得很棒!

其他示例文件如何?

您可能已注意到目录里不仅仅只有 index.html 文件,让我们来看看项目里的内容:

  • index.html:网站源码文件
  • nginx.conf, NGINX服务器配置文件
  • docker-compose.yml 环境配置的所有信息

由于我们已经对index.html进行了一些更改,让我们看看其他两个文件。

nginx.conf

这是NGINX服务器的基本配置文件, 它所说的是服务器应该对/www目录提供服务:

server {
index index.html;
root /www;
}

docker-compose.yml

此文件包含应用程序环境的定义。乍一看,该文件的代码可能有点吓人,但不要担心,我们将一一说明。

version: “2”

services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- .:/www
- ./nginx.conf:/etc/nginx/conf.d/default.conf
  • version: “2“ – 决定整个文件中使用的语法。docker-compose文件格式有两个版本: 版本1(老版本,不支持文件集或网络)和版本2(最新版本)
  • services: – 此区域定义容器。目前,此文件只定义一个名为web的容器。
  • image: nginx – 这意味着容器将基于NGINX镜像创建。镜像存储于Docker注册中心。您可以选取一个从Docker Hub上现成可用的镜像或者您自己创建一个镜像。
  • ports: – 这部分将端口从本地主机(8080)重定向到NGINX服务器正在侦听的容器(80)。因此,我们能够在http://localhost:8080查看该网站。
  • volumes: – 这部分是将磁盘挂载至容器。此示例中,它确保项目文件伴随着docker-compose.yml 被置于/www 目录并且我们的NGINX配置文件将覆盖容器中的文件。
信息

万一您的Dockerfile配置出问题,您随时可以联系我们support@buddy.red。当然,阅读完整个指南后,您应该能理解它如何工作并可自己写一个。

如何扩展Docker镜像更多服务

到目前为止,作为我们的新员工,您不必担心环境配置。 为了确保不让您觉得太轻松,再给您分配一个新任务。很简单:您必须在我们网站上的“hello world”语句下面添加当前日期和时间。

为此,您需要PHP。默认情况下,NGINX服务器不处理PHP文件,但我们可以通过完成两个任务来处理:

  • 配置NGINX服务器文件以处理PHP文件
  • 安装PHP服务器

配置NGINX服务器以处理PHP文件

配置NGINX服务器只需更新nginx.conf文件:

server {
index index.php;
root /www;
location ~ \.php$ {
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

上述更改表明,所有PHP文件都应该由端口号为9000的PHP服务解析。

安装PHP服务器

接下来我们需要的是PHP服务器。我们将添加另一个容器,负责解析PHP文件。为此,将php服务添加到docker-compose.yml文件中并定义NGINX服务的镜像版本和链接命令顺序。第二件事是将web服务容器链接到PHP容器,以便两者可以互通:

version: "2"

services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- .:/www
- ./nginx.conf:/etc/nginx/conf.d/default.conf
links:
- php
php:
image: php:7-fpm
volumes:
- .:/www

我们已经准备好了配置,这意味着是时候继续进行实际开发和处理index.html文件了。我们想在网站上显示日期和时间,我们需要做两件事:

  • 更改文件名为 index.php
  • 添加显示当前日期和时间的代码:
    <?php
    echo "<p>".date("Y-m-d H:i:s")."</p>";
    ?>

重启Docker容器

现在我们可以尝试新的配置,并检查日期和时间是否真的显示在我们的网站上。为此,从终端运行以下命令:

docker compose down
docker compose up

刷新网站,即可看到想要的结果:

更新网址

按照以上说明,您可以将其他服务,如MySQL、MongoDB、PostgreSQL等添加到docker-compose.yml文件中。而且,最重要的是,每次向Git存储仓推送时,您所做的更改都可供其他团队成员使用。谁都不需要配置任何东西,无论本地操作系统或PHP服务器安装,只要运行docker compose up命令即可启动环境。

Buddy与Docker自动化部署

Buddy logo

到目前为止,我们一直在使用本地开发环境在本地开发网站。但我们如何使用Docker实际部署?答案很明显:在生产服务器上安装docker-compose,在那里上传新的源文件,然后在服务器上执行docker compose downdocker compose up

听起来很简单,但当您每天要手动做几次时,都需要烦人的重复同样的工作。您要交付存储仓中的每一项更改都需要连接服务器、将文件上传到服务器、登录并来回运行命令,这不仅耗时,还很容易出错。而且您可能每天要处理不止一个项目和一个交付。

换句话说,将流程自动化将会非常好。这就是Buddy介入的地方,Buddy的交付流水线让Docker自动化变得轻而易举。

您所需要做的是:

  • 一个Buddy帐户。如果您还未注册, 您可以使用GitHub、Bitbucket或电子邮件通过点击此处免费注册 >>>
  • 一个安装Docker的服务器

Buddy托管的存储仓中设置项目

在此例中,我们将使用之前的网站,并在Buddy中对其进行版本控制:

  • 新添项目并选择Buddy作为您的Git托管提供商:

选择Git托管

  • 从此链接下载并解压文件: https://assets.buddy.works/guides/buddy-docker-nginx.zip

  • 在已解压的文件目录中运行以下命令:

git init
git add *
git commit -m "init repo"
git push --all BUDDY_REPO_URL
信息

BUDDY_REPO_URL 是添加项目时显示的URL:

Buddy repo URL

创建您的第一个Buddy流水线:自动执行日常开发工作流程

我们将使用流水线--自动化部署工具

添加流水线

首先,添加一个流水线,该流水线自动将引入存储仓的更改部署到生产服务器。

流水线配置

让Buddy为您上传网站的每次开发更改

添加将应用程序源文件上传到服务器的操作。在Buddy,您可以从众多上传选项中进行选择,从裸机服务器到AWS、DigitalOcean和Microsoft Azure等云服务。在本例中,我们将使用SFTP:

SFTP上传

在操作详细信息栏目上,输入授权数据和上传路径:

SFTP配置

让Buddy代劳重启Docker容器

添加SSH操作以运行docker compose downdocker compose up -d。此操作需要在工作目录中执行授权数据和定义方法。工作目录必须与上传操作的目录相同,以便在放置源文件的目录中运行命令。

SSH配置

您的流水线已就绪

当操作添加于流水线完成之后,应该显示有如下图:

SFTP configuration

您可以看到上传操作之后是SSH操作,脚本触发Docker命令。通过这种设置,存储仓中的每次更改都将自动推送到服务器,并在生产环境中可见。配置与源码紧密结合。

您可以手动检查流水线的工作方式,只需单击流水线名称右侧的运行按钮即可。现在打开页面(服务器 IP:8080)并在实时服务器上查看您的网站。

设置流水线以确保开发-测试效性如此简单

现在我们还有一个诀窍给您。在开发过程中,我们建议使用暂存服务器。这是变更在发布之前进行测试的地方。使用Docker和Buddy配置很容易,只需按照下面列出的步骤操作即可。

创建一个暂存分支

将新分支添加到存储仓(暂存分支)。Git分支让您可以同时处理多个完全不同的功能而无需处理项目依赖关系或同步更改:

分支

为暂存服务器添加交付流水线

为暂存服务器新添流水线。此流水线将执行与生产服务器流水线完全相同的任务,但用于另一个分支。您可以复制现有流水线。之后,您需要稍微修改一下:

  • 将分支名称从生产更改为暂存

  • 编辑文件上传操作:更改路径,使其指向您的暂存服务器(暂存应用程序文件必须放置在与实时应用程序文件不同的目录中)

  • 编辑SSH操作:

    • 将执行路径更改为刚刚为上传操作设置的路径
    • 更改 docker compose up 命令为compose run -d -p 8081:80 web (我们这样做是为了在不同于生产应用程序运行的端口上运行临时应用程序)
  • 最后,确保将分支重新分配到暂存分支staging

复制流水线

把玩把玩

现在,您的生产和暂存应用程序正在同一服务器上运行:

  • 生产应用程序运行于服务器 IP:8080
  • 暂存应用程序运行于服务器 IP:8081

它们可能使用不同的配置,并且暂存应用程序中的任何更改都不会影响您的生产环境,因为这两个应用程序都在单独的容器中运行并且彼此隔离。

总结

  1. 我们刚刚学习了如何处理Docker并使用docker-compose.yml文件在很短的时间内设置应用程序环境。
  2. 我们成功地在应用程序代码中引入了两个简单的更改,并对其进行了审阅。
  3. 我们使用Buddy和Docker将应用程序自动化部署到服务器。

感谢Docker、感谢Buddy,让我们快速地部署自动化运维!您所要做的就是安装Docker,从存储仓中提取文件,然后就可以在短时间内提交代码,为我们的公司提供巨大价值。您还知道如何在服务器上执行相同的操作,以及如何使用Buddy及其流水线来自动化您的工作。

让我们骑着这头大蓝鲸在海上快乐地航行吧!