本教程包括
- Dockerizing一个Laravel应用样本
- 创建一个持续部署配置来构建和部署容器镜像
- 将Laravel应用部署到Azure容器注册中心
随着网络应用变得越来越复杂, 软件工程团队必须依靠许多不同的产品和服务来创造最好的开发者体验。应用程序的开发生态系统已经超越了版本控制和托管部署。手动管理所有服务的新功能的部署会在软件开发生命周期中造成严重的瓶颈。它还引入了人为错误的风险。
在这篇文章中,我将描述如何通过CircleCI使用GitHub进行版本控制,将一个Docker化的Laravel应用程序部署到Microsoft Azure。你将采取一个先前建立的Laravel API项目,建立一个容器镜像,然后将镜像推送到Azure容器注册处。然后, 你将学习如何创建一个Azure网络服务作为一个应用程序并将容器镜像连接到它。
微软Azure Web Apps是一个平台即服务(PaaS),可以让你发布运行在多个框架上、用不同编程语言编写的Web应用。然后,你可以使用CI/CD工具来构建、测试和部署Web应用,以加快发布周期,提高开发效率,并提高代码质量。
前提条件
除了对Laravel和PHP有基本的了解之外, 你还需要以下物品来从本教程中获得最大的收获:
克隆演示项目
通过运行这个命令来克隆Laravel的样本项目。
git clone https://github.com/yemiwebby/laravel-azure-api.git
接下来,进入你刚刚创建的新文件夹的根目录。通过运行这些命令来设置该项目:
cd laravel-azure-api
composer install
cp .env.example .env
php artisan key:generate
php artisan serve
这些命令将从终端改变目录进入laravel-azure-api 项目和:
- 安装该项目所有的依赖项
- 创建一个
.env文件,并将.env.example文件的内容复制到其中。 - 生成一个应用程序密钥
- 运行应用程序
默认情况下,你的应用程序将被提供给http://127.0.0.1:8000/ 。 去这个端点查看json响应。

你可以使用这个命令来运行单元测试。
php vendor/bin/phpunit
审查部署策略
现在你已经在本地运行了应用程序,现在是审查你的部署策略的好时机。除了包括为CircleCI设置部署的配置文件外,不需要改变任何项目代码。
按照时间顺序,你将需要。
- 创建一个注册表,在Azure容器注册表(ACR)上托管你的容器镜像,并获得访问密钥。ACR是微软拥有的一个私有注册表,用于托管Docker镜像。
- 为项目创建一个容器镜像,构建,然后在本地运行该容器。
- 将Docker镜像发布到Azure容器注册处。
- 创建一个Azure网络应用,并将其与已发布的容器镜像链接。
- 启用持续部署,并创建一个配置文件,在CircleCI上构建和部署容器镜像。
- 将项目推送到GitHub并与CircleCI连接。
- 将容器镜像部署到Azure容器注册表。
创建一个Azure容器注册中心
如果你还没有,在Azure上创建一个账户。进入Azure门户仪表板,点击创建一个资源。

选择容器 > 容器注册表来创建一个新的注册表。

在注册表创建页面上,输入所需的详细信息。

注意。 你可以为这个项目创建一个新的资源组,或者使用一个现有的资源组。
点击审查+创建。你将被转到一个页面,在那里你可以审查注册表的信息。点击创建来设置一个新的注册表实例。
从注册表获取访问密钥
在本节中,你将在Azure容器注册表中启用Docker访问。这一步对部署过程至关重要。启用Docker访问权可以让你通过CLI远程登录Azure容器注册表,并向其推送镜像。
打开注册表,找到设置部分下的访问密钥链接。
这将显示注册表名称和登录服务器。使用切换按钮来启用管理员用户。然后,复制用户名和任何一个密码,最好是第一个。把这个放在方便的地方;在本教程的后面你会需要它。

容器化应用程序的本地
你的下一步是编写一个自定义的Docker文件,允许你建立一个容器镜像。在应用程序的根目录下,创建一个名为Dockerfile 的新文件。打开该文件并将这些内容粘贴到其中。
FROM php:8.0.20
RUN curl -sS https://getcomposer.org/installer | php -- \
--install-dir=/usr/local/bin --filename=composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN apt-get update && apt-get install -y zlib1g-dev \
libzip-dev \
unzip
RUN docker-php-ext-install pdo pdo_mysql sockets zip
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN composer install
CMD php artisan serve --host=0.0.0.0 --port=8000
EXPOSE 8000
使用PHP版本8作为基础镜像。随后的命令安装 composer, Laravel应用程序的扩展,并启用PHP PDO和MySQL扩展。
安装完成后,将工作目录设置为app ,并将文件从你的本地机器复制到容器的工作目录中。然后运行composer install ,包括运行应用程序的命令。
构建Docker镜像
运行下面的命令,为项目建立一个Docker镜像。
docker build -t laravelapidemo.azurecr.io/laravelapidemo:latest .
该命令将在项目中寻找Docker文件,并根据所包含的说明构建容器镜像。注意到上面的命令使用了先前创建的注册表的名称和登录服务器吗?这种方法的好处是可以轻松地将容器镜像与Azure容器注册表进行映射。

运行Docker镜像
现在我们已经成功构建了本地版本的容器镜像,用这个命令运行它,以确保它能正常工作。
docker run -d -p 8000:8000 laravelapidemo.azurecr.io/laravelapidemo
这将在800端口上运行该应用程序。通过访问http://localhost:8000 来验证它。
将Docker镜像推送到Azure注册中心
接下来,登录之前创建的Azure容器注册表,并将容器镜像推送给它。从终端发出这个命令。
docker login -u DOCKER_USER -p DOCKER_PASS laravelapidemo.azurecr.io
用你的值替换这些占位符。
DOCKER_USER:为容器注册中心获得的用户名。DOCKER_PASS:容器注册处的密码。
登录后,使用此命令将镜像推送到Azure注册表。
docker push laravelapidemo.azurecr.io/laravelapidemo:latest

为容器创建一个Azure Web应用
接下来,你需要创建一个Azure Web App,并将其与容器镜像连接。转到Azure门户主页,点击创建资源。
选择容器>容器的Web应用,创建一个新的Web应用服务实例。

你将会被转到创建Web App页面。选择一个Azure订阅和一个资源组。如果需要的话,可以创建一个新的资源组。默认情况下,Docker container ,如果没有的话,点击选择它。

从Docker选项卡中,选择镜像源和其各自的Docker镜像。

当你点击审查+创建时,你将被转到一个页面,在那里你可以审查网络应用的细节。点击 "创建"来设置一个新的Azure网络应用。
当这个过程完成后,你可以访问这个URL,以审查部署到Azure的应用。

启用持续部署
每次更新Docker镜像时,你都希望应用能收到更新。要做到这一点,你需要为网络应用程序服务启用持续部署。
点击网络应用程序名称,然后点击部署中心。在 "设置 "选项卡上,滚动到 "持续部署"按钮并点击选择它。单击 "保存"以坚持这些更改。

选择了持续部署后,每次在Azure Container Registry上重建Docker镜像时,Web应用都会触发Laravel应用的新部署。
自动部署
在这一步,你将添加CircleCI的管道配置。这个管道可以自动测试和运行构建和推送容器镜像到Azure容器注册处的命令。
在你项目的根部,打开.circleci/config.yml 文件。更新其内容,如图所示。
version: 2.1
orbs:
docker: circleci/docker@2.1.2
jobs:
build-and-test:
description: Setup laravel application and run tests
docker:
# Specify the version you desire here
- image: cimg/php:8.0-browsers
steps:
- checkout
- run:
name: "Prepare environment"
command: |
sudo apt update
# Download and cache dependencies
- restore_cache:
keys:
# "composer.lock" can be used if it is committed to the repo
- v1-dependencies-{{ checksum "composer.json" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run:
name: "Install dependencies"
command: composer install -n --prefer-dist
- save_cache:
key: v1-dependencies-{{ checksum "composer.json" }}
paths:
- ./vendor
- run:
name: "Create .env file and generate app key"
command: |
mv .env.example .env
php artisan key:generate
- run:
name: "Run tests"
command: php vendor/bin/phpunit
build-docker-image:
executor:
name: docker/docker
tag: "3.6"
steps:
- checkout
- docker/install-docker-tools
- setup_remote_docker:
version: 20.10.14
docker_layer_caching: true
- run:
name: "Build and push Docker image"
command: |
docker build -t laravelapidemo.azurecr.io/laravelapidemo:latest .
docker login -u $DOCKER_USER -p $DOCKER_PASS laravelapidemo.azurecr.io
docker push laravelapidemo.azurecr.io/laravelapidemo:latest
workflows:
test-and-deploy:
jobs:
- build-and-test
- build-docker-image:
requires:
- build-and-test
下面是配置的细分。
CircleCI的配置总是以版本开始。在本教程中,我们使用的是版本2.1 。
配置的下一部分指定了两个不同的工作。
build-and-testbuild-docker-image
build-and-test 工作使用CircleCI的PHP 8 Docker镜像,从GitHub中检查出我们的项目,安装项目的依赖,设置环境变量,并运行应用程序的测试。
build-docker-image 工作为从Github仓库中提取的代码创建了一个Docker镜像,并以容器的最新版本更新Azure容器注册表。requires 键指定在build 工作完成之前,build-docker-image 不运行。
将应用程序连接到CircleCI
现在你需要在GitHub上建立一个仓库,并将项目链接到CircleCI。
登录到您的CircleCI账户。如果你用你的GitHub账户注册,你所有的仓库将在你的项目仪表板上可用。
点击你的laravel-azure-api 项目旁边的Set Up Project。

你会被提示写一个新的配置文件或使用你项目中的现有配置文件。选择现有的,并输入你的代码在GitHub上存放的分支的名称。点击Let's Go。

你的第一个工作流将开始运行。
build-docker-image 工作将会失败,因为你还没有提供你的Azure容器注册表凭证。
要解决这个问题,你需要添加用户名和密码环境变量。点击项目设置。
点击环境变量。创建这些变量。
DOCKER_USERNAME变量是为容器注册表获得的用户名。DOCKER_PASS变量是来自容器注册表的密码。
回到仪表板。单击 "从开始重新运行工作流"。
这一次,你的工作流将成功运行。现在你可以在本地对代码库进行修改,并使用持续部署将其推送到GitHub。
总结
这就是你的成果。使用Docker,CircleCI和Microsoft Azure,你能够自动部署Laravel应用程序的过程。你进行了设置过程,以确保每次你更新项目并推送变化到GitHub,CircleCI将使用配置细节来构建一个新的容器镜像,并更新相关的Azure容器注册表。而在Azure网络应用程序上启用持续部署后,将启动一个webhook资源,向网络应用程序推送新版本的容器镜像。