继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

利用 docker 搭建 yaf

吴小琪
关注TA
已关注
手记 22
粉丝 8992
获赞 336

下面先简单介绍一下docker,然后记录下自己如何在docker下搭建lnmp(linux,nginx,mysql,php)环境,并安装php的扩展yaf。

<!--more-->

前言

下面先简单介绍一下docker,然后记录下自己如何在docker下搭建lnmp(linux,nginx,mysql,php)环境,并安装php的扩展yaf。

什么是docker?
定义:

Docker:an open source project to pack,ship and run any application as a lightweight container.

这个docker官方的解释:将任何应用以轻量级的容器的形式来进行打包发布和运行。

Node.js: allows to package an application with all of its dependencies into a standardized unit。

这是node.js的解释:docker允许一个应用程序及其所有依赖以一种标准的单位来进行打包。

wiki的定义:

Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制[1]。Docker利用Linux核心中的资源分脱机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担[2]。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、内存、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的 LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,
依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。”

类比:
  • 可以粗略的理解为轻量级的虚拟机
  • 开挂的chroot
VM vs Docker

paste

docker 安装
for mac

首先在[https://store.docker.com/editions/community/docker-ce-desktop-mac](docker for mac)官网进行下载,安装和安装普通mac软件一样。
安装完毕后在右上角有一个小船的标示。
paste

当然可以在命令行中输入:docder info显示
paste

表示安装成功!

docker 基本概念
Docker 镜像

我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:14.04 就包含了完整的一套 Ubuntu 14.04 最小系统的 root 文件系统。

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

Docker 容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会把容器和虚拟机搞混。

前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失。

Docker Registry

镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。

仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOS 的 Quay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像使用的就是这个服务。

docker常用命令
  • 获取镜像:
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
  • 获取镜像:

  • 列出镜像
docker images
  • 利用 commit 理解镜像构成
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
  • 删除本地镜像
docker rmi [选项] <镜像1> [<镜像2> ...]
  • 启动容器
docker run -d -p 8002:8001 -p 8000:8000 -p 80:80 --name lnmp_yaf lnmp/yaf:v1 /sbin/init

docker exec -it lnmp_yaf /bin/bash # 进入
  • 终止容器
docker stop [容器ID或容器名]
  • 进入容器
docker attach [容器ID或容器名]
  • 删除容器
docker rm [容器ID或容器名]
数据管理
数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新,不会影响镜像
数据卷默认会一直存在,即使容器被删除
*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

挂载一个主机目录作为数据卷
docker run -d -p 8001:8001 -p 8000:8000 -p 80:80 --name lnmp_yaf -v /Users/junqi1/yaf_code:/home/work lnmp/yaf:v1 /sbin/init
docker exec -it lnmp_yaf /bin/bash # 进入
docker下lnmp配置
  • 首先安装centos:
 docker pull centeros
  • 启动镜像并进入

    docker run -it centos:latest bash # -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端
  • 执行一键安装lnmp(需要大概84分钟)

    wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz && tar zxf lnmp1.4.tar.gz && cd lnmp1.4 && ./install.sh lnmp

    可以需要用yum install 安装wget

    安装yaf扩展
  • yaf 扩展安装

    cd ~
    wget http://pecl.php.net/get/yaf-3.0.5.tgz
    tar zxvf yaf-3.0.5.tgz
    cd yaf-3.0.5
    phpize # 生成匹配文件
    ./configure --with-php-config=/usr/local/php/bin/php-config # php-config存放php的一些配置信息,比如路径等。它会结合本地的php-config配置信息进行前期的编译准备
    make #开始编译
    make test
    make install # 将module下的yaf.so放在/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/yaf.so下面
    
  • 修改php.ini

打开php.ini(/usr/local/php/etc/php.ini),加入下面三行

[Yaf]
extension=yaf.so
yaf.environ="product"
  • 添加vhost
lnmp vhost add
  • 修改vhost配置文件

打开/usr/local/nginx/conf/vhost/imooc.com.conf, 修改为下面的代码

server
    {
        listen 80;
        server_name imooc.com n;
        index index.php;
        root  /home/work/imooc;

        include enable-php.conf;

        if (!-e $request_filename) {
            rewrite ^/(.*) /index.php?$1 last;
        }

        access_log  /home/work/logs/imooc.com.log;
    }
  • 添加yaf项目
cd /home/work/imooc/
mkdir tmp
wget https://github.com/laruence/yaf/archive/master.zip
unzip master.zip 
cd yaf-master/tools/cg/
./yaf_cg imooc
cp -rf tmp/yaf-master/tools/cg/output/imooc/* ./ (在imooc目录下)

最后的代码项目结果为:
paste

  • 今后在这个基础上编写代码:

可以使用sublime 直接编写啦!

docker run -d -p 8001:8001 -p 8000:8000 -p 80:80 --name lnmp_yaf -v /Users/junqi1/yaf_code:/home/work lnmp/yaf:v1 /sbin/init
打开App,阅读手记
3人推荐
发表评论
随时随地看视频慕课网APP