docker从零构建php(docker菜鸟教程linux)

发布时间:2022-11-08

本文目录一览:

  1. [如何 在Docker窗口中部署PHP开发环境](#如何 在Docker窗口中部署PHP开发环境)
  2. 怎么样使用Docker部署一个PHP开发环境
  3. [Docker PHP 入门实践(三)](#Docker PHP 入门实践(三))
  4. PHP下如何优雅的使用Docker来构建环境
  5. 如何使用Docker搭建PHP应用开发环境
  6. 怎么使用Docker搭建PHP开发环境

如何 在Docker窗口中部署PHP开发环境

环境部署一直是一个很大的问题,无论是开发环境还是生产环境,但是 Docker 将开发环境和生产环境以轻量级方式打包,提供了一致的环境。极大的提升了开发部署一致性。当然,实际情况并没有这么简单,因为生产环境和开发环境的配置是完全不同的,比如日志等的问题都需要单独配置,但是至少比以前更加简单方便了,这里以 PHP 开发作为例子讲解 Docker 如何布置开发环境。 一般来说,一个 PHP 项目会需要以下工具:

  • Web 服务器: Nginx/Tengine
  • Web 程序: PHP-FPM
  • 数据库: MySQL/PostgreSQL
  • 缓存服务: Redis/Memcache 这是最简单的架构方式,在 Docker 发展早期,Docker 被大量的滥用,比如,一个镜像内启动多服务,日志收集依旧是按照 Syslog 或者别的老方式,镜像容量非常庞大,基础镜像就能达到 80M,这和 Docker 当初提出的思想完全南辕北辙了,而 Alpine Linux 发行版作为一个轻量级 Linux 环境,就非常适合作为 Docker 基础镜像,Docker 官方也推荐使用 Alpine 而不是 Debian 作为基础镜像,未来大量的现有官方镜像也将会迁移到 Alpine 上。本文所有镜像都将以 Alpine 作为基础镜像。 Nginx/Tengine 这部分笔者已经在另一篇文章 Docker 容器的 Nginx 实践中讲解了 Tengine 的 Docker 实践,并且给出了 Dockerfile,由于比较偏好 Tengine,而且官方已经给出了 Nginx 的 alpine 镜像,所以这里就用 Tengine。笔者已经将镜像上传到官方 DockerHub,可以通过
docker pull chasontang/tengine:2.1.2_f/code

获取镜像,具体请看 Dockerfile。

PHP-FPM

Docker 官方已经提供了 PHP 的 7.0.7-fpm-alpine 镜像,Dockerfile 如下:

FROM alpine:3.4
# persistent / runtime deps
ENV PHPIZE_DEPS \
    autoconf \
    file \
    g++ \
    gcc \
    libc-dev \
    make \
    pkgconf \
    re2c
RUN apk add --no-cache --virtual .persistent-deps \
    ca-certificates \
    curl
# ensure www-data user exists
RUN set -x \
    addgroup -g 82 -S www-data \
    adduser -u 82 -D -S -G www-data www-data
# 82 is the standard uid/gid for "www-data" in Alpine
ENV PHP_INI_DIR /usr/local/etc/php
RUN mkdir -p $PHP_INI_DIR/conf.d
##autogenerated##
ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data
##/autogenerated##
ENV GPG_KEYS 1A4E8B7277C42E53DBA9C7B9BCAA30EA9C0D5763
ENV PHP_VERSION 7.0.7
ENV PHP_FILENAME php-7.0.7.tar.xz
ENV PHP_SHA256 9cc64a7459242c79c10e79d74feaf5bae3541f604966ceb600c3d2e8f5fe4794
RUN set -xe \
    apk add --no-cache --virtual .build-deps \
    $PHPIZE_DEPS \
    curl-dev \
    gnupg \
    libedit-dev \
    libxml2-dev \
    openssl-dev \
    sqlite-dev \
    curl -fSL "" -o "$PHP_FILENAME" \
    echo "$PHP_SHA256 *$PHP_FILENAME" | sha256sum -c - \
    curl -fSL "" -o "$PHP_FILENAME.asc" \
    export GNUPGHOME="$(mktemp -d)" \
    for key in $GPG_KEYS; do \
        gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
    done \
    gpg --batch --verify "$PHP_FILENAME.asc" "$PHP_FILENAME" \
    rm -r "$GNUPGHOME" "$PHP_FILENAME.asc" \
    mkdir -p /usr/src \
    tar -Jxf "$PHP_FILENAME" -C /usr/src \
    mv "/usr/src/php-$PHP_VERSION" /usr/src/php \
    rm "$PHP_FILENAME" \
    cd /usr/src/php \
    ./configure \
    --with-config-file-path="$PHP_INI_DIR" \
    --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \
    $PHP_EXTRA_CONFIGURE_ARGS \
    --disable-cgi \
    # --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)
    --enable-mysqlnd \
    # --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see )
    --enable-mbstring \
    --with-curl \
    --with-libedit \
    --with-openssl \
    --with-zlib \
    make -j"$(getconf _NPROCESSORS_ONLN)" \
    make install \
    { find /usr/local/bin /usr/local/sbin -type f -perm +0111 -exec strip --strip-all '{}' + || true; } \
    make clean \
    runDeps="$( \
        scanelf --needed --nobanner --recursive /usr/local \
            | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
            | sort -u \
            | xargs -r apk info --installed \
            | sort -u \
    )" \
    apk add --no-cache --virtual .php-rundeps $runDeps \
    apk del .build-deps
COPY docker-php-ext-* /usr/local/bin/
##autogenerated##
WORKDIR /var/www/html
RUN set -ex \
    cd /usr/local/etc \
    if [ -d php-fpm.d ]; then \
        # for some reason, upstream's php-fpm.conf.default has "include=NONE/etc/php-fpm.d/*.conf"
        sed 's!=NONE/!=!g' php-fpm.conf.default | tee php-fpm.conf /dev/null; \
        cp php-fpm.d/ php-fpm.d/; \
    else \
        # PHP 5.x don't use "include=" by default, so we'll create our own simple config that mimics PHP 7+ for consistency
        mkdir php-fpm.d; \
        cp php-fpm.conf.default php-fpm.d/; \
        { \
            echo '[global]'; \
            echo 'include=etc/php-fpm.d/*.conf'; \
        } | tee php-fpm.conf; \
    fi \
    { \
        echo '[global]'; \
        echo 'error_log = /proc/self/fd/2'; \
        echo; \
        echo '[www]'; \
        echo '; if we send this to /proc/self/fd/1, it never appears'; \
        echo 'access.log = /proc/self/fd/2'; \
        echo; \
        echo 'clear_env = no'; \
        echo; \
        echo '; Ensure worker stdout and stderr are sent to the main error log.'; \
        echo 'catch_workers_output = yes'; \
    } | tee php-fpm.d/docker.conf \
    { \
        echo '[global]'; \
        echo 'daemonize = no'; \
        echo; \
        echo '[www]'; \
        echo 'listen = [::]:9000'; \
    } | tee php-fpm.d/zz-docker.conf
EXPOSE 9000
CMD ["php-fpm"]
##/autogenerated##

怎么样使用Docker部署一个PHP开发环境

安装Docker 平时开发的环境一般都是Mac或者Windows,所以接下来只针对前两者写下步骤,这两个平台,官方都推荐了两种安装方式:app和工具包(toolbox)。注:app方式对系统版本和配置会有一定要求,Mac版本会自动为你安装好VM(虚拟机),但Windows需要你安装微软虚拟化产品Hyper-V,而toolbox方式则需要你额外安装virtualbox来作为docker的VM。

Docker PHP 入门实践(三)

在本教程的其余部分,我们将基于 ThinkPHP 框架完成一个天气查询的应用。使用 天气查询-API文档-开发指南-Web服务 API | 高德地图API 的接口来实现我们的功能。把查询数据缓存到 MySql 中,这样就不用每次频繁的请求第三方的接口了(有请求次数限制) 选择高德开放平台-天气查询 API 主要是因为它是免费的。当然你也可以使用其他的第三方天气查询接口,看个人喜好。 该应用是一个非常简单的 REST API 应用,主要实现两个接口。 在我们进行应用编码之前,首先使用 Docker 安装并运行 ThinkPHP ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简代码的同时,更注重易用性。遵循 Apache2 开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产品发布/销售 。 这就是为什么我选择它作为本教程的教学框架。我不想让你因为一个框架而放弃,但我也不想从头开始建立所有的东西,因为该教程的重点是Docker,而不是我们的PHP应用。 用Docker 创建 ThinkPHP 应用 实际上比用本地配置PHP环境所需的操作少。并且为我们还需要使用 Composer,多亏了Docker,我们甚至不需要在主机上安装它。 首先打开你的终端,创建一个项目目录。

mkdir weather-app
cd weather-app

现在使用官方Composer Docker镜像安装 ThinkPHP 。

docker run --rm -v $(pwd):/app composer create-project topthink/framework weather-app

如果你查看weather-app/目录,你会看到 ThinkPHP 6 的项目目录,如下所示: 我们的 docker 运行命令与第二章中的命令相似,但我们使用了不同的镜像。我们没有使用运行hello.php 脚本的 PHP 镜像,而是使用了一个 Composer 镜像。让我们来看看有什么变化。 项目创建完成后,我们需要添加几个路由 URL 和 Controller 文件 。让我们打开 weather-app 目录下的 app/controller , 然后新建 Weather.php 文件,内容如下:

<?php
namespace app\controller;
use think\Controller;
use think\Request;
class Weather extends Controller
{
    public function index()
    {
        return 'Hello, Docker!';
    }
}

然后打开 weather-app 目录下的 app/route , 在 app.php 文件中追加如下内容:

use think\facade\Route;
Route::get('weather', 'Weather/index');

现在我们可以在 Docker 容器中运行我们的应用程序,只是为了验证我们的程序是否运行正常,因为我们只添加了两个路由 URL。打开命令行,运行:

docker run -d -p 8000:80 --name weather-app -v $(pwd):/var/www/html php:7.4-apache

现在,在浏览器中打开 http://localhost:8000/weather ,你应该看到一个空页面,上面有以下文字:

Hello, Docker!

那么恭喜你,你刚刚已经成功地在 Docker 中运行了你的第一个 ThinkPHP 应用程序。 这次我们使用的docker run命令与我们用来运行 hello.php 脚本 和composer create-project ...的两个命令不同。原因是这次我们想获得包含 Apache 的最新版本的PHP,这样我们就可以为我们的 Web 应用提供服务。让我们更详细地了解新增的命令部分。 你可以通过向终端发送一个 "中断 "信号来停止和退出终端。在 Windows 上,这可以通过按 Ctrl + C 来实现。 运行你的新网络应用程序的另一个选择是在 "Detached"模式中运行容器。这意味着你在终端将不会看到来自你的容器的输出。这可以通过在我们之前的命令中添加-d标志来实现。

docker run -d -p 8000:80 --name weather-app -v $(pwd):/var/www/html php:7.4-apache

在分离模式下启动容器后,你的终端将显示新容器的完整ID--类似于a70d25c2a7cedae673f8ab...如果你想停止这个容器,你可以使用docker stop命令,用容器的ID告诉Docker。比如说:

docker stop a70d25c2a7ce

因为输入整个ID是很麻烦的,如果你愿意,Docker允许你只输入前三个或更多的字符。 最后,我建议为你的容器命名。我们在本书后面的许多例子中都会这样做,因为用名字来记住一个容器比用随机分配的ID要容易得多,再加上ID是随机的,所以每次你运行一个新版本的容器时,它都会得到一个新的ID。只要不是已经有一个同名的容器,名字就可以多次发出来。为了给我们的新应用容器命名,我们可以用传入的--name标志重新创建它。

docker run -d -p 8000:80 --name weather-app -v $(pwd):/var/www/html php:7.4-apache

在使用docker run命令时,还有许多可用的选项,所以你可能想更详细地阅读文档。在我们开发其余的应用程序时,我们会涉及其中的一些选项。 现在我们要引入高德的天气 SDK ,在使用该 SDK 之前你需要阅读高德开放平台-天气查询的技术文档,再添加 SDK 之前我们首先要确保所有现有的容器都停止了。

docker ps

这个命令将列出所有正在运行的容器。你也可以通过添加-a标志来查看停止的容器。 如果有任何容器正在运行,那么在我们继续前进之前,使用docker stop 来停止它们。

docker stop weather-app

该命令将在你的项目中装新的软件包。在这个过程中,你应该在终端看到一些类似这样的输出。

docker run --rm -v $(pwd):/app composer require amap/weather

现在 SDK 已经安装完毕,可以使用了。 我们将使用刚刚添加的高德天气 SDK 来完善我们的业务逻辑,打开 controller 目录下的 Weather.php 添加以下内容:

<?php
namespace app\controller;
use think\Controller;
use think\Request;
use Amap\Weather\Client;
class Weather extends Controller
{
    public function index()
    {
        $client = new Client('your-api-key');
        $data = $client->getWeather('310000');
        return json($data);
    }
}

我们做了一些更新--主要是对引入天气 API 初始化天气类 我们的应用程序已经初步完成了向API传递一个真实的位置ID并返回一些数据。首先,使用这个高德位置查询找到一个位置ID。我使用的是上海的ID进行测试。310000,当然你直接传 上海 也是可以的。ok,让我们再次运行Docker容器。

docker run -d -p 8000:80 --name weather-app -v $(pwd):/var/www/html php:7.4-apache

并在你的浏览器中访问正在运行的应用程序,地址是http://localhost:8000/weather。你应该可以看到一个JSON数据,看起来像这样。

{
    "city": "上海",
    "adcode": "310000",
    "province": "上海",
    "reporttime": "2022-11-08 12:00:00",
    "casts": [
        {
            "date": "2022-11-08",
            "dayweather": "晴",
            "nightweather": "多云",
            "daytemp": "18",
            "nighttemp": "12"
        }
    ]
}

你的 Docker 化的 PHP 应用程序现在正从外部数据源返回真实数据,并在Apache中提供服务,但你可能会注意到,它的速度并不快(我的页面加载时间为1.92秒!)。 高德天气 API 是一个免费的服务,其他国家可能无法访问。为了解决这个问题,我们将把查询的数据保存在我们自己的 MySQL 数据库中,可以再下次访问的时候可以快速地响应。这将极大地提高性能,下个章节我们将学习如何用 Docker 将 MySql 与 PHP 应用程序相结合。

PHP下如何优雅的使用Docker来构建环境

需要以下工具:

  • Web 服务器: Nginx/Tengine
  • Web 程序: PHP-FPM
  • 数据库: MySQL/PostgreSQL
  • 缓存服务: Redis/Memcache

如何使用Docker搭建PHP应用开发环境

后盾网是专门学习php的内容非常专业,名师辅导你,很好的教养环境.楼主快去吧2

怎么使用Docker搭建PHP开发环境

推荐phpstudy,可以选择不同的php版本,也可以切换apache环境或者nginx环境