dockerfile构建nginx并结合php

查看nginx和php的目录结构:

[[email protected] docker_demo]# tree nginx
nginx
├── Dockerfile
├── fastcgi_params
├── nginx-1.8.1.tar.gz
├── nginx.conf
└── www.conf
[[email protected] docker_demo]# tree php
php
├── Dockerfile
├── init.d.php-fpm
├── libmcrypt-2.5.7.tar.gz
├── php-5.6.30.tar.bz2
├── php-fpm.conf.default
└── php.ini-production

这里将详细讲述nginx和php的构建过程,以及构建过程中用到的所有工具包和配置文件

首先介绍nginx的构建,查看nginx的Dockerfile:

[[email protected] nginx]# cat Dockerfile
FROM centos_init:v2

MAINTAINER [email protected]163.com

RUN useradd -M -s /sbin/nologin www
ADD nginx-1.8.1.tar.gz /usr/local/src

RUN yum install libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel

WORKDIR /usr/local/src/nginx-1.8.1
RUN ./configure --user=www --group=www --prefix=/usr/local/nginx --with-file-aio --with-ipv6 --with-http_ssl_module  --with-http_spdy_module --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install

COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY fastcgi_params /usr/local/nginx/conf/fastcgi_params
RUN mkdir /usr/local/nginx/conf/vhost
COPY www.conf /usr/local/nginx/conf/vhost/www.conf

EXPOSE 80

CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

从上面的基础镜像可以看见是centos_init:v2,这里贴出该镜像的Dockerfile:

[[email protected] nginx]# cat ../init/Dockerfile
# base image
FROM centos

# MAINTAINER
MAINTAINER [email protected]163.com

# backup CentOS-Base.repo to CentOS-Base.repo.bak
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

# add epel and aliyun repo to /etc/yum.repos.d
COPY CentOS7-Base-163.repo /etc/yum.repos.d/CentOS7-Base-163.repo
COPY epel-release-latest-7.noarch.rpm /etc/yum.repos.d/

# install epel.repo
WORKDIR /etc/yum.repos.d/
RUN yum install -y epel-release-latest-7.noarch.rpm
RUN yum clean all

# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel ntpdate crontabs

# change timzone to Asia/Shanghai
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

centos_init:v2镜像添加了repo的环境和编译的环境,而centos镜像就是初始的官方镜像

下面回归到nginx的构建文件:

从nginx的Dockerfile文件中可以看出,安装nginx采用的编译安装,创建了用户www和安装了nginx的一些依赖包,copy了一些配置文件到镜像中,这里

用到的配置文件将会全部放置到github上供参考,然后通过Dockerfile进行构建nginx镜像:

# docker build -t nginx:v1 .

这里需要介绍配置文件:

[[email protected] nginx]# cat www.conf
server {
    listen   80;
    root /usr/local/nginx/html;
    index index.htm index.html index.php;
    location ~ \.php$ {
        root /usr/local/nginx/html;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

可以看见fastcgi_pass php:9000;

这是因为php也是一个容器,和nginx是隔离的,后面nginx将会通过--link的方式与php镜像进行互联访问

查看php的Dockerfile文件:

[[email protected] php]# cat Dockerfile
FROM centos_init:v2

MAINTAINER [email protected]163.com

ADD libmcrypt-2.5.7.tar.gz /usr/local/src

WORKDIR /usr/local/src/libmcrypt-2.5.7
RUN ./configure && make && make install

ADD php-5.6.30.tar.bz2 /usr/local/src

RUN yum -y install libxml2 libxml2-devel bzip2 bzip2-devel libjpeg-turbo libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel libcurl libcurl-devel

WORKDIR /usr/local/src/php-5.6.30
RUN ./configure --prefix=/usr/local/php --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-mcrypt --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --enable-fpm --with-config-file-path=/usr/local/php/etc --with-bz2 --with-gd && make && make install

COPY php.ini-production /usr/local/php/etc/php.ini
COPY php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

RUN useradd -M -s /sbin/nologin php
RUN sed -i -e ‘[email protected];pid = run/[email protected] = run/[email protected]‘ -e ‘[email protected]@[email protected]‘ -e ‘[email protected] = 127.0.0.1:[email protected] = 0.0.0.0:[email protected]‘ /usr/local/php/etc/php-fpm.conf
RUN sed -i ‘[email protected];daemonize = [email protected] = [email protected]‘ /usr/local/php/etc/php-fpm.conf

EXPOSE 9000

CMD ["/usr/local/php/sbin/php-fpm"]

构建的服务必须运行在前台,而对于nginx来说:

daemon off表示将后台运行关闭了,于是运行在前台

而对于phh:sed -i ‘[email protected];daemonize = [email protected] = [email protected]‘ /usr/local/php/etc/php-fpm.conf

这里也是将daemon模式关闭了,于是/usr/local/php/sbin/php-fpm运行在前台

开始进行构建php:

[[email protected] php]# docker build -t php .

查看生成的镜像:

[[email protected] php]# docker images
REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
php                                                latest              8902ce599658        5 minutes ago       1.08GB
nginx                                              latest              c3babfeba09b        22 minutes ago      578MB

利用构建的镜像启动php、nginx服务:

[[email protected] php]# docker run -d --name=php -v /www:/usr/local/nginx/html php
538d9866defefe8c818fbebc7109a1cf8d271583f7ce6d14d4483a103a212903
[[email protected] php]# docker run -d --name=nginx -p80:80 -v /www:/usr/local/nginx/html --link=php:php nginx
c476e0e2b37f5400ea2175b9a3fc61636190727576187f3feb9248fea37ffd81

上面启动php的容器时,使用了-v进行映射,如果这里不进行映射,那么php的程序会启动,但是遇到php结尾的文件将不会解析,出现file not found的错误

查看容器状态:

[[email protected] php]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
c476e0e2b37f        nginx               "/usr/local/nginx/..."   11 seconds ago      Up 10 seconds       0.0.0.0:80->80/tcp       nginx
538d9866defe        php                 "/usr/local/php/sb..."   39 seconds ago      Up 38 seconds       9000/tcp                 php

网站目录结构:

[[email protected] www]# tree .
.
├── index.html
└── test.php

进入到php容器查看hosts文件:

[[email protected] php]# docker exec -it php /bin/bash
[[email protected] php-5.6.30]# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4      538d9866defe

查看nginx的hosts文件:

[[email protected] php]# docker exec -it nginx /bin/bash
[[email protected] nginx-1.8.1]# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4      php 538d9866defe
172.17.0.5      c476e0e2b37f

可以看见有一条php的解析,这就是为什么nginx能够和php进行通信的缘由(通过--link进行指定)

配置文件托管到github:https://github.com/jsonhc/docker_project/tree/master/docker_dockerfile/lnmp

时间: 2024-10-08 21:51:03

dockerfile构建nginx并结合php的相关文章

使用Dockerfile构建Nginx,Tomcat,MySQL镜像

实验环境说明 本机IP地址:192.168.10.157 构建mysql镜像时,验证的主机IP:192.168.10.149 构建Nginx镜像 1.下载基础镜像--centos镜像 docker pull centos 2.创建工作目录 mkdir /opt/nginx cd /opt/nginx/ 3.创建并编写Dockerfile文件 vim Dockerfile FROM centos MAINTAINER this is nginx image <xxy> RUN yum insta

dockerfile构建nginx镜像

Dockerfile是一个文本格式的配置文件,用户可以使用dockerfile来快速创建自定义的镜像. Dockerfile指令说明 分类 指令 说明 配置指令 ARG 定义创建镜像过程中使用的变量 配置指令 FROM 指定镜像创建的基础镜像 配置指令 LABEL 为生成的镜像添加元数据标签信息 配置指令 EXPOSE 声明镜像内服务监听的端口 配置指令 ENV 指定环境变量 配置指令 ENTRYPOINT 指定镜像的默认入口指令 配置指令 VOLUME 创建一个数据卷挂载点 配置指令 USRE

使用dockerfile构建nginx镜像 转

docker构建镜像的方法:   commit.dockerfile 1.使用commit来构建镜像: commit是基于原有镜像基础上构建的镜像,使用此方法构建镜像的目的:保存镜像里的一些配置信息和修改的信息.相当于一个镜像的快照. 2.使用dockerfile来构建镜像: dockerfile是快速构建所需(自定义)镜像. dockerfile的指令: FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令). RUN: 用来执行命令行命令.其基本格式: shell格式: RUN

Dockerfile构建nginx镜像以及使用nginx -g &quot;daemon off;&quot;方式前台运行

编写安装nginx的shell脚本 #!/bin/bash yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel cd /usr/local/nginx-1.16.0 ./configure --prefix=/usr/local/nginx && make && make install dockerfile FROM centos:7 ADD nginx-1.16.0.tar.gz /usr/lo

Dockerfile构建(ssh、systemctl、nginx、tomcat、mysql)

一.Dockerfile Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的.例如:你在淘宝上买了一个衣架,但是卖家并没有给你发一个完整的衣架,而是一些组件和一张图纸,你按照这个图纸一步一步将衣架组装起来,就成了你所需要的样子.那么 Dockerfile 就是这张图纸,镜像文件就是你需要的这个衣架,Dockerfile 不建议随便命名,就用 Dockerfile.因此,Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此

用Dockerfile构建docker image

dockerfile是为快速构建docker image而设计的,当你使用docker build 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个docker image. 而另一种构建docker iamge 的方法是pull一些基础镜像下来启动成容器,然后进入容器内安装各种需要的程序以及配置好需要的环境,最后commit成一个镜像.但是相比之 Dockerfile的方法会更加自动化,更加方便快捷,而且功能也更强大.(

Dockerfile构建LNMP分离环境部署wordpress

最近忙着写自己的项目,也把一个站点的bbs论坛打算迁移到Docker中,测试没发现啥大问题.在单台上面的架构如下:(往后我们也是要讲到compose和swarm调度的慢慢来) 1.首先我们先安装一下docker,好多人都发现国内用yum安装有各种问题;这里我们用国内的https://www.daocloud.io.登录后注册,然后点击下载.里面有提示,我们点击Linxu安装然后复制代码执行到shell上即可. [[email protected] nginx]# curl -sSL https:

Dockerfile构建容器

使用Dockerfile构建容器Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由一条一条的指令组成,每条指令对 应 Linux 下面的一条命令.Docker 程序将这些 Dockerfile 指令翻译真正的 Linux 命令.Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于 Makefile. Docker 程序将读取 Dockerfile,根据指令生成定制的 image.相比 image 这种黑盒子,Dock

8.Docker之使用dockerfile创建nginx镜像

一.前言 看了很多人的dockerfile,都是长篇大论,解释的又很少,对于初学者来说根本不知道指令的意思,哪怕知道指令的意思,也不知道指令后面配置的一大串东西来自于哪里,而这一大串又无需去记忆,例如: 开头的RUN指令都能根据dockerfile的指令说明可以知道该指令是干嘛用的,但是后面这一串这么长的东西又是来自于哪里? 所以在编写dockerfile之前,你必须懂的nginx(该文章是基于dockerfile创建nginx镜像)在linux上的安装流程,否则,需要安装什么依赖等都不知道,就