跳到正文 →

PHP项目的Docker化指南

嘉宾介绍:王剑清,希云资深产品开发工程师,曾先后任职于新浪网,开心网和豆瓣网,精通前后端开发,对于产品和设计也略有涉猎。 很早就项目中开发中应用 Docker,对于 Docker 在开发、测试、和生产环境部署中的实践很有心得。


Docker被称为下一代云计算技术,是当下最火热的云计算技术,将为企业IT带来深刻变革。本期讲师讲介绍如何利用Docker实现DevOps自动化、做好应用持续集成、持续交付。通过docker领域一线的实践经历,详细讲述从开发、测试到运维,实现持续集成和交付,自动化。

快速上手

PHP官方在hub.docker.com 上维护了官方的PHP Docker镜像,包含了从PHP 5.5到7.0的多种不同版本的镜像。

PHP项目的Docker化指南
我们将以PHP官方的Docker镜像为基础,先介绍如何将一个简单的PHP应用Docker化。首先创建一个新目录 php-quickstart,作为我们的项目目录。

在项目目录下创建文件 app.php。


<?php

echo “Hello Docker!”

?>


在项目目录下创建文件 Dockerfile。


FROM php:5.6-cli

COPY . /project

WORKIR /project

CMD [“php”, “./app.php”]


上述 Dockerfile 中,通过FROM 指令,我们将官方的 php-5.6-cli 作为我们的基础镜像。

通过 COPY 指令,我们把当前目录下的文件,复制到镜像的 /project 目录。CMD 指令设置了镜像默认执行的命令,WORKDIR 则是设置了镜像执行命令时的目录。

构建镜像, 执行:docker build -t php-app

这将会生成一个名为 php-app 的镜像

运行容器: docker run php-app

这时候,容器将会执行我们之前创建的 app.php, 并输出:Hello Docker!

 

上面是一个简单的例子,接下来,我们通过一个 PHP + MySQL 的例子,介绍 PHP 应用 Docker 化之后,如何连接数据库。

 

创建一个新的目录 php-mysql 作为我们的项目目录

在项目目录下,创建文件 index.php


<?php

$mysql = new mysqli(‘db’, ‘root’, $_ENV[‘MYSQL_ROOT_PASSWORD’]);

echo ‘Connected to mysql: ‘.$mysql->host_info;

?>


在 index.php 中,我们的PHP 应用将会通过主机名称 db 连接到 mysql 数据库,同时使用用户名 root, 以及环境变量中的 MYSQL_ROOT_PASSWORD 对数据库进行连接。这里简单地通过echo连接信息来确认 MySQL 连接是否正常。

接下来,在项目目录下创建 Dockerfile


FROM php:5.6-apache

RUN docker-php-ext-install mysqli

COPY . /var/www/html


我们在这里使用官方的 mysql:5.6 镜像创建了一个 MySQL 的容器

—name 参数将容器命名为 db

-e MYSQL_ROOT_PASSWORD=secret 通过环境变量,我们将 MySQL 的 root 用户密码设置为 secret

-d 参数将这个容器设置为后台运行

接下来,启动 PHP 容器,并将其连接到 MySQL 容器


docker run –link db -e MYSQL_ROOT_PASSWORD=secret -p 8080:80 php-mysql-app


我们运行了之前构建的 php-mysql-app 镜像,并将上一步创建的 db 这个MySQL容器和它连接。同时我们把MySQL的root密码通过环境变量MYSQL_ROOT_PASSWORD传到容器内部。

通过 -p 8080:80 将容器的80 端口映射到了主机的 8080 端口

这时候从浏览器访问 http://127.0.0.1:8080,将会看到 index.php 的输出内容


Connected to mysql: db via TCP/IP


在一个Docker化的项目中,项目的Docker镜像成为了项目交付的最终元件。因此在项目的持续集成和持续交付环节中,镜像的自动构建是必不可少的一个环节。

接下来介绍如何利用cSphere的私有镜像仓库配置镜像自动构建,实现在代码Push到仓库之后,自动构建Docker镜像。

创建私有Docker Registry:在cSphere的镜像仓库页面,点击新建镜像仓库按钮,根据提示即可成功创建一个私有的镜像仓库

PHP项目的Docker化指南

配置项目

进入上一步创建的镜像仓库页面,点击添加自动构建按钮,填写项目的 Git 仓库地址和Dockerfile路径:

PHP项目的Docker化指南

然后根据提示,设置镜像构建后,在镜像仓库的存放位置,和需要进行自动构建的分支

PHP项目的Docker化指南

保存之后,界面会提示设置项目的Web Hook和 Deploy key

这样当项目有新的代码push到上一步中设置的分支之后,私有Docker Registry就会进行镜像的自动构建, 在构建成功之后,自动将镜像Push到镜像仓库的指定位置。

PHP项目的Docker化指南

在实现了自动构建项目的镜像之后,接下来我们来看如何通过cSphere快速将会项目部署到各种环境中。

PHP项目的Docker化指南

 

创建应用模板

PHP项目的Docker化指南

 

添加MySQL服务

在之前的PHP + MySQL 项目Docker化示例中,我们通过以下的命令启动了MySQL容器:

这里 我们把上述命令配置成应用模板中的一个服务:db


docker run –name db -e MYSQL_ROOT_PASSWORD=secret -d mysql:5.6


设置环境变量

PHP项目的Docker化指南

 

添加PHP服务

之前我们通过以下的命令启动了PHP容器:

PHP项目的Docker化指南

同时,在刚才的自动构建镜像设置时,我们设置了自动构建镜像为192.168.1.130/tsing/php-mysql-app:latest

 

这里我们把上述信息配置成应用模板的另一服务:php


docker run –link db -e MYSQL_ROOT_PASSWORD=secret -p 8080:80 php_mysql-app


PHP项目的Docker化指南设置PHP代码中使用的环境变量值

PHP项目的Docker化指南

—link db 这个参数无需在应用模板中设置,因为cSphere应用管理会自动根据服务的名称,自动处理不同容器的连接关系。

-p 端口映射参数也不需要设置,因为cSphere应用管理创建的容器都有可以直接访问的独立IP,不再需要把容器的端口映射到主机上

部署应用:点击上一步刚刚创建成功的模板版本,最右边的部署按钮,便可以开始进行部署。

PHP项目的Docker化指南
PHP项目的Docker化指南

在这个界面中,你可以选择将应用部署到哪一个主机分组中, 可以根据需要,把应用部署到开发、测试、生产不同环境的主机上。当然,也可以在一个环境部署多个实例,  即使在一个环境中部署,不同实例之间是互相隔离的。

应用模板管理:在应用模板页面,你可以对应用模板进行修改, 每次模板的修改都会产生一个新的版本,方便进行升级和回滚。

PHP项目的Docker化指南

点击“升级 · 回滚”按钮,可以快速将应用更新至指定版本的模板

PHP项目的Docker化指南

 

应用部署自动化

当镜像重新构建之后,可以在 cSphere 面板上点击服务的重新部署按钮来升级服务

PHP项目的Docker化指南

也可以直接调用cSphere的API 来实现自动化升级

 

在调用cSphere的API前,先在cSphere的设置页面生成一个API Key

PHP项目的Docker化指南

调用以下 API,即可实现自动升级应用

PHP项目的Docker化指南

以上是全部内容。


Q&A

Q1: Docker支持php7版本吗?

A1: 支持的

 

Q2: 怎么利用docker连接多个Nginx容器?

A2:如果是指如何将流量分配到多个 nginx容器上,这可以可以通过haproxy 等负载均衡对接服务发现系统来实现。nginx 容器的数目的动态增减,都能实时地更新到负载均衡上。

 

Q3: 请问下 docker宿主机的资源监控如何管理的如何保证容器被合理的分配到宿主机

A3: 希云cSphere支持宿主机的资源监控,可以对内存,CPU,硬盘IO、网络流量等进行监控和告警。容器的分配,在编排的时候可以设置调度策略,比如 Round-robin 等策略或者指定容器的资源偏好,比如优先选择CPU充足的主机,内存充足的主机等。

 

Q4: 如何基于Docker配置持续集成的开发环境?

A4: 可以先把项目Docker化,也就是先实现把应用代码能构建出Docker镜像,并且能使用Docker部署。之后再通过 git 的 hook 实现自动构建镜像,自动部署测试环境等。

 

Q5: 数据库比如mysql放到docker中性能会影响多大?

A5: 性能影响是非常小的,只要是MySQL 数据目录是通过 volume 从宿主机映射到Docker 容器的话。

 

归类 技术分享