4.PhalconPhalconPHP是一个使用C扩展开发的PHP Web框架提供高性能和低资源占用。Phalcon是一个开源的、全堆栈的PHP 5框架使用C扩展编写专门为高性能优化。无需学习和使用C语言所有函数都以PHP类的方式出现。Phalcon是一个松耦合的框架。Phalcon是目前PHP MVC框架中性能最高的全栈框架Yaf也具有极高的性能但是非全栈框架。使用Docker Hub镜像安装Docker Hub上的Phalcon镜像$ sudo docker pull szeist/phalcon-apache2创建并运行Phalcon镜像$ sudo docker run -v /document/root/on/your/mahine:/var/www -p 8080:80 szeist/phalcon-apache2此时Apache服务器会在TCP端口8080运行PhalconPHP框架。-v命令后的文件夹就是Phalcon项目的根目录。定制镜像笔者推荐读者基于本书第10章使用的SSHD镜像来定制自定义镜像这样可以方便地使用SSH服务访问Phalcon容器。当然读者也可以使用第三方Dockerfile来定制镜像FROM szeist/phalcon ENV DEBIAN_FRONTEND noninteractive RUN apt-get install -y -q apache2 libapache2-mod-php5 ;\ a2enmod rewrite RUN apt-get clean ADD etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf ENV DEBIAN_FRONTEND dialog ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_PID_FILE /var/run/apache2/apache2.pid EXPOSE 80 ENTRYPOINT [/usr/sbin/apache2] CMD [-D FOREGROUND]13.1.3 相关资源PHP官网http://php.net/ PHP Docker官方镜像https://registry.hub.docker.com/_/php/PHP tutum镜像https://registry.hub.docker.com/u/tutum/apache-php/PHP tutum Dockerfilehttps://registry.hub.docker.com/u/tutum/apache-php/dockerfile/CakePHP框架官网http://cakephp.org/CakePHP Docker Hub镜像https://registry.hub.docker.com/u/vcarl/cakephp/ Zend框架官网http://framework.zend.com/ Zend Server官网http://www.zend.com/en/products/serverZend Server Docker官方镜像https://registry.hub.docker.com/_/php-zendserver/Zend Server Docker官方镜像标签https://registry.hub.docker.com/_/php-zendserver/tags/manage/ Zend Server 5.4Docker官方镜像https://registry.hub.docker.com/u/zend/php-5.4-zend-server/ Zend Server 5.5Docker官方镜像https://registry.hub.docker.com/u/zend/php-5.4-zend-server/https://registry.hub.docker.com/u/zend/php-5.5-zend-server/Symfony 2框架官网http://symfony.com/ Symfony 2Dockerfilehttps://registry.hub.docker.com/u/gregory90/php-symfony/dockerfile/ Phalcon框架官网http://www.phalconphp.com/en/ Phalcon Docker Hub镜像https://registry.hub.docker.com/u/szeist/phalcon-apache2/ Phalcon Dockerfilehttps://registry.hub.docker.com/u/szeist/phalcon-apache2/dockerfile/13.2 C/C本节将介绍三款流行的C/C开发环境GCC、LLVM和Clang。13.2.1 GCCGCCGNU Compiler Collection是一个开源的C/C语言的编译器系统它由GNU项目主持。GCC支持多种编程语言并支持交叉编译至多种指令集的处理器Target Processor。GCC是GNU工具链的关键组件遵循GNU GPL协议。1.使用官方镜像将C/C代码运行在GCC容器内的最简方法就是将GCC编译指令写入Dockerfile中然后使用此Dockerfile构建自定义镜像最后直接运行此镜像即可启动程序。假定在当前目录创建一个C语言源文件main.c内容可能为/* Hello World program */#includestdio.hint main(){printf(Hello World\n);return 0} 首先从官方仓库获取GCC基础镜像$ sudo docker pull gcc如果对GCC的版本有要求可以在以上命令中加入镜像标签并在下一步的Dockerfile的FROM指令中明确GCC版本号。之后在Dockerfile中加入需要执行的GCC编译命令FROM gcc:4.9COPY . /usr/src/myappWORKDIR /usr/src/myappRUN gcc -o myapp main.cCMD [./myapp]现在就可以使用Dockerfile来构建镜像my-gcc-app$ sudo docker build -t my-gcc-app .创建并运行此容器会编译并运行程序输出Hello World$ sudo docker run -it --rm --name my-running-app my-gcc-appHello World$ 如果只需要容器编译程序而不需要运行它可以使用如下命令$ sudo docker run --rm -v $(pwd):/usr/src/myapp -w /usr/src/myapp gcc:4.9 gcc -o myapp myapp.c以上命令会将当前目录“$pwd”挂载到容器的/usr/src/myapp目录并执行gcc-o myapp myapp.c.。GCC将会编译myapp.c代码并将生成的可执行文件输出至/usr/src/myapp文件夹。如果项目已经编写好了Makefile也可以在容器中直接执行make命令$ sudo docker run --rm -v $(pwd):/usr/src/myapp -w /usr/src/myapp gcc:4.9 make2.定制镜像读者可以基于本书第10章中使用的SSHD基础镜像来定制GCC镜像构建后直接运行。读者也可以使用Docker Hub中提供的第三方Dockerfile定制或修改后构建镜像然后运行容器即可。下面笔者给出了基于buildpack-depswheezy镜像创建GCC镜像的Dockerfile# https://registry.hub.docker.com/u/snormore/llvm/dockerfile/ FROM buildpack-deps:wheezy # https://gcc.gnu.org/mirrors.html RUN gpg --keyserver pgp.mit.edu --recv-key \ B215C1633BCA0477615F1B35A5B3A004745C015A \ B3C42148A44E6983B3E4CC0793FA9B1AB75C61B8 \ 90AA470469D3965A87A5DCB494D03953902C9419 \ 80F98B2E0DAB6C8281BDF541A7C8C3B2F71EDF1C \ 7F74F97C103468EE5D750B583AB00996FC26A641 \ 33C235A34C46AA3FFB293709A328C3A2C3C45C06 ENV GCC_VERSION 4.9.1 # 下载需要的tar格式源码并解压安装 RUN apt-get update \ apt-get install -y curl flex wget \ rm -r /var/lib/apt/lists/* \ curl -SL http://ftpmirror.gnu.org/gcc/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.bz2 -o gcc.tar.bz2 \ curl -SL http://ftpmirror.gnu.org/gcc/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.bz2.sig -o gcc.tar.bz2.sig \ gpg --verify gcc.tar.bz2.sig \ mkdir -p /usr/src/gcc \ tar -xvf gcc.tar.bz2 -C /usr/src/gcc --strip-components1 \ rm gcc.tar.bz2* \ cd /usr/src/gcc \ ./contrib/download_prerequisites \ { rm *.tar.* || true; } \ dir$(mktemp -d) \ cd $dir \ /usr/src/gcc/configure \ --disable-multilib \ --enable-languagesc c \ make -j$(nproc) \ make install-strip \ cd http://www.hzcourse.com/resource/readBook?path/openresources/teach_ebook/uncompressed/15029/OEBPS/Text/.. \ rm -rf $dir \ apt-get purge -y --auto-remove curl gcc g wget13.2.2 LLVMLLVMLow Level Virtual Machine是一个起源于2000年的编译器基础建设项目以C实现包含LLVM中介码LLVM IR、LLVM除错工具、LLVM C标准库等。该项目是为了对任意编程语言实现的程序利用虚拟技术创造出编译时期、链结时期、运行时期以及“闲置时期”的优化。它最早是以C/C为对象目前已经支持了包括ActionScript、Ada、D、Fortran、GLSL、Haskell、Java bytecode、Objective-C、Swift、Python、Ruby、Rust、Scala以及C#等众多语言。1.使用官方镜像在Docker Hub中已经有用户提供了LLVM的镜像读者可以直接下载使用。$ sudo docker pull bowery/clang2.定制镜像读者可以基于本书第10章中使用的SSHD基础镜像来定制GCC镜像构建后直接运行。读者也可以使用Docker Hub中提供的第三方Dockerfile定制或修改后构建镜像然后运行容器即可。13.2.3 ClangClang是一个用C实现、基于LLVM的C/C/Objective C/Objective C编译器其目标之一就是超越GCC成为标准的C/C编译器它遵循LLVM BSD许可。Clang最初是Apple公司为了解决使用GCC编译Objective-C的问题从头实现的一套编译器系统。Clang有如下特性·快通过编译OS X上几乎包含了所有C头文件的carbon.h的测试包括预处理Preprocess、语法lex、解析parse、语义分析Semantic Analysis、抽象语法树生成Abstract Syntax Tree的时间Clang比GCC 4.0快2.5倍。·内存占用小Clang内存占用约是源码的1.3倍而Apple GCC则超过10倍的内存使用。·诊断信息可读性强Clang对于错误的语法不但有源码提示还会在错误的调用和相关上下文上有更好提示。·良好的GCC兼容性。·设计清晰简单容易理解易于扩展增强。与代码基础古老的GCC相比学习曲线平缓。·基于库的模块化设计易于IDE集成及其他用途的重用。由于历史原因GCC是一个单一的可执行程序编译器其内部完成了从预处理到最后代码生成的全部过程中间诸多信息都无法被其他程序重用。Clang将编译过程分成彼此分离的几个阶段AST信息可序列化。通过库的支持程序能够获取到AST级别的信息将大大增强对于代码的操控能力。对于IDE而言代码补全、重构是重要的功能然而如果没有底层的支持只使用tags分析或正则表达式匹配是很难达成的。1.使用官方镜像在Docker Hub中已经有用户提供了Clang的镜像读者可以直接下载使用。$ sudo docker pull bowery/clang2.定制镜像如前文所说读者可以基于SSHD镜像自定义Dockerfile。也可以使用Docker Hub中的第三方镜像构建Clang容器。这里笔者以ubuntutrusty系统为例下面给出了一个示例Dockerfile文件# https://registry.hub.docker.com/u/rsmmr/clang/dockerfileFROM ubuntu:trusty# 设置环境变量ENV PATH /opt/llvm/bin:$PATH# 确定默认的启动命令CMD bash# 安装依赖包Setup packages.RUN apt-get update apt-get -y install cmake git build-essential vim python # 将install-clang拷贝至本目录ADD . /opt/install-clang# 编译和安装LLVM/clangRUN /opt/install-clang/install-clang -j 4 -C /opt/llvm13.3 JavaJava是一种拥有跨平台、面向对象、泛型编程特点的编译型语言广泛应用于企业级Web应用开发和移动应用开发。它是并发的基于类的面向对象的高级语言。Java的设计理念是尽可能地减少部署依赖致力于允许Java应用的开发者“开发一次到处运行”。这就意味着Java的二进制编码不需要再次编辑即可运行在异构的JVM上。Java在大型互联网项目特别是互联网金融和电子商务项目中非常受欢迎。1.使用官方镜像将Java代码运行在Docker容器中的最简单方法就是将Java编译指令直接写入Dockerfile然后使用此Dockerfile构建镜像最后直接运行此镜像即可启动程序。具体步骤如下首先从官方仓库获取Java基础镜像$ sudo docker pull java然后在本地新建一个空目录在其中创建Dockerfile文件。在Dockerfile中加入需要执行的Java编译命令例如FROM java:7COPY . /usr/src/myapp WORKDIR /usr/src/myapp RUN javac Main.java CMD [java Main]使用此Dockerfile构建镜像my-java-app$ sudo docker build -t my-java-app .然后运行此镜像即自动编译程序并执行$ sudo docker run -it --rm --name my-running-app my-java-app如果只需要容器中编译Java程序而不需要运行则可以使用如下命令$ sudo docker run --rm -v $(pwd):/usr/src/myapp -w /usr/src/myapp java:7 javac Main.java以上命令会将当前目录“$pwd”挂载为容器的工作目录并执行javac Main.java命令编译代码。生成的可执行文件将输出至当前目录下。2.定制镜像笔者建议用户基于第10章的SSHD镜像来自定义Dockerfile。当然读者也可以基于各种系统基础镜像如Ubuntu来定制Java镜像。此处笔者给出了基于dockerfile/ubuntu镜像创建Java镜像的Dockerfile文件供读者参考##OpenJDK Java 7 JRE Dockerfile##https://github.com/dockerfile/java # https://github.com/dockerfile/java/tree/master/openjdk-7-jre##使用Ubuntu基础镜像FROM dockerfile/ubuntu # 安装Java环境RUN \apt-get update \apt-get install -y openjdk-7-jre \rm -rf /var/lib/apt/lists/*# 定义工作目录WORKDIR /data # 定义环境变量ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64 # 定义默认启动命令CMD [ bash ]3.相关资源·Java Docker官方镜像https://registry.hub.docker.com/_/java/·Java Docker官方镜像标签https://registry.hub.docker.com/_/java/tags/manage/13.4 Python13.4.1 Python技术栈Python是一种解释型的、带CLI交互接口的、面向对象的、开源的动态脚本语言。它集成了模块modules、异常处理exceptions、动态类型dynamic typing、高级数据结构元组、列表、序列以及类classes等高级特性。Python设计精良语法简约表达能力很强。Python代码与C/C代码之间可以方便地相互调用。Python还可以作为各种需要可编程接口的应用无论是各种系统管理接口还是各种需要交互式CLI的应用。Python的可移植性非常强所有的当前主流操作系统Windows 2000所有Mac类Unix系统都支持Python。Python非常适合敏捷Web开发的各种应用场景。在中小型团队中可以选择Python作为Restful API后端或者移动App后端的实现语言。下面笔者将带领大家使用Docker部署Python环境以及部署Python技术栈中的主流框架。1.使用官方镜像我们可以使用Docker官方的Python镜像作为基础在此之上进行必要的定制第一步下载Docker官方的Python镜像$ sudo docker pull python如果读者对Python的版本有要求可以在以上命令中加入Tag标签以便于在下一步的Dockerfile的FROM指令中明确Python版本号。官方镜像都有明确的标签列表具体地址可以参见本章的“相关资源”部分。第二步在读者的Python项目中新建一个DockerfileFROM python:3-onbuildCMD [ python ./your-daemon-or-script.py ]如果读者需要使用Python 2的话可用下列命令FROM python:2-onbuildCMD [ python ./your-daemon-or-script.py ]之后读者就可以在一个Python容器中运行自己的程序了。第三步通过此Dockerfile构建自定义的镜像$ sudo docker build -t my-python-app .第四步创建容器并运行$ sudo docker run -it --rm --name my-running-app my-python-app如果读者只需要运行单个Python脚本那么无需使用Dockerfile构建自定义镜像而是通过以下命令直接使用官方Python镜像带参数运行容器$ sudo docker run -it --rm --name my-running-script -v $(pwd):/usr/src/myapp -w /usr/src/myapp python:3 python your-daemon-or-script.py如果读者需要使用Python 2的话可用下列命令$ sudo docker run -it --rm --name my-running-script -v $(pwd):/usr/src/myapp -w /usr/src/myapp python:2 python your-daemon-or-script.py2.定制镜像笔者首先推荐读者基于本书第10章的SSHD镜像进行Python镜像的定制这样可以使用SSH服务方便地访问Python容器。当然也可以使用以下Dockerfile来定制镜像FROM buildpack-deps # 系统更新 RUN apt-get update apt-get install -y curl procps # 清理Debian系统已有的Python环境 RUN apt-get purge -y python python-minimal python2.7-minimal RUN mkdir /usr/src/python WORKDIR /usr/src/python # 设置系统变量 ENV LANG C.UTF-8 ENV PYTHON_VERSION 2.7.8 RUN curl -SL https://www.python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tar.xz \ | tar -xJ --strip-components1 test_listfolders with AssertionError: Lists differ: [] ! [deep’, ‘deep/f1’, ‘deep/f2 http://www.hzcourse.com/resource/readBook?path/openresources/teach_ebook/uncompressed/15029/ RUN ./configure \ make -j$(nproc) \ make EXTRATESTOPTS--exclude test_file2k test_mhlib test \ make install \ make clean # 安装 pip 和 virtualenv RUN curl -SL https://bootstrap.pypa.io/get-pip.py | python2 RUN pip install virtualenv CMD [python2]