Docke--Dockerfile 构建LNMP环境
Dockerfile 构建nginx并结合php
1、构建基础镜像
先构建一个基础镜像,添加repo的环境和编译的环境,而centos镜像就是初始的官方镜像,后面构建php、nginx、mysql都使用该镜像为base image:
[root@server myCentos]# cat Dockerfile #查看Dockerfile文件
# base image
FROM centos:centos7.3.1611 # MAINTAINER
MAINTAINER @qq.com # add epel and yum
RUN yum install wget epel-release -y \
&& mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back \
&& wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo \
&& wget -P /etc/yum.repos.d/ http://mirrors.163.com/.help/CentOS7-Base-163.repo \
&& yum clean all && yum makecache # Necessary packages
RUN yum install -y wget gcc gcc-c++ glibc make autoconf openssl openssl-devel ntpdata crontabs # change timzone to Asia/Shanghai
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@server myCentos]# docker build -t centos:v1 . #构建镜像取名为centos:v1
[root@server myCentos]# docker images #构建完成后查看该镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v1 cca50f986518 About a minute ago 665MB
查看nginx和php的目录结构:
[root@server ~]# tree nginx
nginx
├── Dockerfile
├── fastcgi_params
├── nginx-1.8..tar.gz
├── nginx.conf
└── www.conf
[root@server ~]# tree php
php
├── Dockerfile
├── libmcrypt-2.5..tar.gz
├── php-5.6..tar.gz
├── php-fpm.conf.default
└── php.ini-production
这里详细描述下nginx和php的构建过程,已经构建过程中用到的所有工具包和配置文件
2、构建nginx镜像
首先构建nginx镜像,查看nginx的Dockerfile:
[root@server nginx]# cat Dockerfile
# base image
FROM centos:v1 MAINTAINER @qq.com RUN useradd -M -s /sbin/nologin www
ADD nginx-1.8..tar.gz /usr/local/src # install Dependency package
RUN yum install libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel libxml2 libxml2-dev libxslt-devel WORKDIR /usr/local/src/nginx-1.8. # make && make install
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 # configure
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY fastcgi_params /usr/local/nginx/conf/fastcgi_params
RUN mkdir /usr/local/nginx/conf/conf.d
COPY www.conf /usr/local/nginx/conf/conf.d/www.conf EXPOSE CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
这里nginx采用了编译安装,创建了用户www和安装了nginx的一些依赖包,copy了一些配置文件到镜像中。详细配置文件参考:
通过Dockerfile构建nginx镜像:
[root@server nginx]# docker build -t nginx:v1 . #构建nginx镜像,tag为v1
[root@server nginx]# docker images #查看构建完成的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 c1c90aaefa1e seconds ago 752MB
centos v1 cca50f986518 2 hours ago 665MB
特别说明下配置文件:
[root@server nginx]# cat www.conf
server {
listen ;
root /usr/local/nginx/html;
index index.htm index.html index.php;
location ~ \.php$ {
root /usr/local/nginx/html;
fastcgi_pass php:;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
可以发现fastcgi_pass php:9000;
这是因为php也是一个容器,和nginx是隔离的,后面启动容器的时候nginx将会通过--link的方式与镜像进行互联访问
3、构建php镜像
查看php的Dockerfile:
[root@server php]# cat Dockerfile
# base image
FROM centos:v1 MAINTAINER @qq.com ADD libmcrypt-2.5..tar.gz /usr/local/src WORKDIR /usr/local/src/libmcrypt-2.5.
RUN ./configure && make && make install ADD php-5.6..tar.gz /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.
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 's@;pid = run/php-fpm.pid@pid = run/php-fpm.pid@g' -e 's@nobody@php@g' -e 's@listen = 127.0.0.1:9000@listen = 0.0.0.0:9000@g' /usr/local/php/etc/php-fpm.conf
RUN sed -i 's@;daemonize = yes@daemonize = no@g' /usr/local/php/etc/php-fpm.conf EXPOSE CMD ["/usr/local/php/sbin/php-fpm"]
构建的服务必须运行在前台,而对于nginx来说:daemon off 表示将后台运行关闭了,于是运行在前台
而对于php:sed -i 's@;daemonize = yes@daemonize = no@g' /usr/local/php/etc/php-fpm.conf
这里也是将daemon模式关闭了,于是/usr/local/php/sbin/php-fpm 运行在前台
通过Dockerfile构建php镜像:
[root@server php]# docker build -t php:v1 . #构建php镜像,tag为v1
[root@server php]# docker images #查看构建完成的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
php v1 2019612cc0a4 seconds ago .19GB
nginx v1 c1c90aaefa1e About an hour ago 752MB
centos v1 cca50f986518 2 hours ago 665M
4、启动nginx容器和php容器
利用构建的镜像启动php、nginx服务:
[root@server php]# docker run -d --name php -v /www:/usr/local/nginx/html php:v1 #启动一个php容器并通过-v进行映射
cf77c85e7c2f63a7ac2db2edaa37d22418503e8cfa35d87b9cfad541d03e004a
[root@server php]# docker run -d --name nginx -p : -v /www:/usr/local/nginx/html --link=php:php nginx:v1 #启动一个nginx容器并通过-v进行映射及--link进行关联php容器
3bbc12db8e9cc118a7824c5a314d13c4e37f3a6397f32bbfe939f9e424b306e0
上面启动php的容器时,使用了-v进行映射,如果这里不进行映射,那么php的程序会启动,但是遇到php结尾的文件将不会解析,出现file not found的错误
补充:生产环境一般将配置文件、日志文件、web站点目录存放在宿主机,这样方便管理,且如果nginx配置发生改变后,直接docker stop nginx容器名,然后再启动即可。如下启动nginx容器
# docker run -d --name nginx -p 80:80 -v /opt/docker/www:/usr/local/nginx/html -v /docker/NginxConf/:/usr/local/nginx/conf/conf.d -v /docker/log:/usr/local/nginx/logs --link=php:php nginx:v1
查看容器状态:
[root@server php]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bbc12db8e9c nginx:v1 "/usr/local/nginx/sb…" seconds ago Up seconds 0.0.0.0:->/tcp nginx
cf77c85e7c2f php:v1 "/usr/local/php/sbin…" minutes ago Up minutes /tcp php
在宿主机上到网站目录创建测试文件:
[root@server www]# tree . #查看网站目录的结构
.
├── index.php
└── test.html
[root@server www]# cat index.php #查看index.php文件
<?php phpinfo() ?>
[root@server www]# cat test.html #查看test.html文件
<h1>Hello Docker nginx-php</h1>
访问测试:


进入到php容器查看hosts文件:
[root@server ~]# docker exec -it php /bin/bash #使用exec进入php容器
[root@cf77c85e7c2f php-5.6.]# cat /etc/hosts
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
172.17.0.2 cf77c85e7c2f
进入到nginx容器查看hosts文件:
[root@server ~]# docker exec -it nginx /bin/bash #使用exec进入nginx容器
[root@3bbc12db8e9c nginx-1.8.]# cat /etc/hosts
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
172.17.0.2 php cf77c85e7c2f
172.17.0.3 3bbc12db8e9c
可以看到nginx的hosts文件中有一条php的解析,这就是为什么nginx能够和php进行通信的缘由(通过--link进行指定)
基于上面的步骤,nginx和php的连接就ok了,下面添加一个mysql 然后测试部署wordpress
5、构建mysql镜像
查看mysql的目录结构:
[root@server mysql]# tree .
.
├── business.sql
├── Dockerfile
├── MariaDB-10.0.-centos7-x86_64-client.rpm
├── MariaDB-10.0.-centos7-x86_64-common.rpm
├── MariaDB-10.0.-centos7-x86_64-compat.rpm
├── MariaDB-10.0.-centos7-x86_64-server.rpm
├── server.cnf
└── setup.sh
查看mysql的Dockerfile:
[root@server mysql]# cat Dockerfile
FROM centos MAINTAINER @qq.com COPY MariaDB-10.0.-centos7-x86_64-client.rpm /root/MariaDB-10.0.-centos7-x86_64-client.rpm
COPY MariaDB-10.0.-centos7-x86_64-common.rpm /root/MariaDB-10.0.-centos7-x86_64-common.rpm
COPY MariaDB-10.0.-centos7-x86_64-compat.rpm /root/MariaDB-10.0.-centos7-x86_64-compat.rpm
COPY MariaDB-10.0.-centos7-x86_64-server.rpm /root/MariaDB-10.0.-centos7-x86_64-server.rpm
WORKDIR /root
RUN yum remove mysql-libs -y
RUN yum -y install *.rpm
ADD business.sql /root/business.sql
ADD server.cnf /etc/my.cnf.d/server.cnf
ADD setup.sh /root/setup.sh RUN yum clean all
RUN chmod +x /root/setup.sh
EXPOSE CMD ["/root/setup.sh"]
(1)这里所使用的基础镜像是centos(官方镜像,latest);(2)配置文件通过后面启动时挂载进去,(如果后面有更改,只需要在某个目录创建好配置文件,然后进行挂载即可);(3)business.sql是关于执行的sql(赋予root密码,创建数据库等等);(4)setup.sh是执行了重新初始化mysql(mariadb),最后重启了服务(使用了 --user=mysql,避免出现了使用root用户启动mariadb)
setup.sh脚本原理:Dockerfile用来安装数据库服务,安装完成后,通过setup.sh脚本重新将mysql进行初始化 初始化后,开启MySQL服务执行setup.sh中的sql,关闭mysql数据库 重新以前台的方式启动MySQL数据库服务
[root@server mysql]# cat setup.sh
#!/bin/sh
chown -R mysql:mysql /var/lib/mysql mysql_install_db --user=mysql > /dev/null mysqld_safe --user=mysql & sleep mysql < /root/business.sql sleep ps -wef | grep mysql | grep -v grep | awk '{print $2}' | xargs kill - mysqld_safe --user=mysql
setup.sh
[root@server mysql]# cat business.sql
create database wordpress DEFAULT CHARACTER SET utf8; USE mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES; UPDATE user SET password=PASSWORD("root") WHERE user='root';
FLUSH PRIVILEGES;
business.sql
[root@server mysql]# cat server.cnf
[mysqld]
bind-address=0.0.0.0
console=
general_log=
general_log_file=/dev/stdout
collation-server=utf8_unicode_ci
character-set-server=utf8
server.cnf
通过Dockerfile构建mysql镜像:
[root@server mysql]# docker build -t mysql:v1 . #构建mysql镜像
查看构建完成的镜像:
[root@server mysql]# docker images #查看三个镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql v1 4a3e428817c1 hours ago 813MB
php v1 2019612cc0a4 hours ago .19GB
nginx v1 c1c90aaefa1e hours ago 752MB
6、部署lnmp环境及wordpress
基于上面的三个镜像 nginx、mysql、php构建lnmp环境,我们先将上面启动的容器给删除掉,因为没有什么用了
先启动三个容器:
[root@server mysql]# docker run -d --name mysql -v /root/mysql/server.cnf:/etc/my.cnf.d/server.cnf -v /data/mysql:/var/lib/mysql -p : mysql:v1 #启动一个mysql容器
df28bcb97289676654ea7b573b0e3e52f910a599ff03b2dbf2dfe6345726127d
[root@server mysql]# docker run -d --name php -v /www:/usr/local/nginx/html --link=mysql:mysql php:v1 #启动一个php容器
2f7fd098f0069deeaef4eb5b067e981c6be01a16d0769c3bc4203eab03a45c40
[root@server mysql]# docker run -d --name nginx -p : -v /www:/usr/local/nginx/html --link=php:php nginx:v1 #启动一个nginx容器
b68688cd6f2d324e58c469cfb49fa7a14257ef2bb0c301a40a36ef244201c159
[root@server mysql]# docker ps #查看启动的三个容器的状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b68688cd6f2d nginx:v1 "/usr/local/nginx/sb…" seconds ago Up seconds 0.0.0.0:->/tcp nginx
2f7fd098f006 php:v1 "/usr/local/php/sbin…" About a minute ago Up About a minute /tcp php
df28bcb97289 mysql:v1 "/root/setup.sh" About a minute ago Up About a minute 0.0.0.0:->/tcp mysql
这里阐述下这里启动的这三个容器:(1)先启动一个mysql容器, 并且将上面的server.cnf配置文件和数据目录挂载到了容器内部,这样就防止了数据的丢失;(2)接着启动一个php容器,使用了-v进行映射,如果这里不进行映射,那么php的程序会启动,但是遇到php结尾的文件将不会解析,出现file not found的错误,并且使用了 --link 与mysql 关联,这样php容器就可以连接mysql数据库了;(3)最后启动一个nginx容器,同样使用了-v 进行映射,将网站目录映射到宿主机,通过 --link与php 关联。
开始安装wordpress:
[root@server ~]# cd /www/
[root@server www]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
[root@server www]# tar xf wordpress-4.7.-zh_CN.tar.gz
[root@server www]# ll
总用量
-rw-r--r-- root root 1月 : index.php
-rw-r--r-- root root 1月 : test.html
drwxr-xr-x nobody nfsnobody 4月 wordpress
-rw-r--r-- root root 4月 wordpress-4.7.-zh_CN.tar.gz
通过浏览器访问宿主机进行安装:http://IP/wordpress


...省略...

进入到mysql容器查看hosts:
[root@server ~]# docker exec -it mysql /bin/bash #使用exec进入mysql容器
[root@df28bcb97289 ~]# cat /etc/hosts
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
172.17.0.2 df28bcb97289
进入到php容器查看hosts:
[root@server ~]# docker exec -it php /bin/bash #使用exec进入到php容器
[root@2f7fd098f006 php-5.6.]# cat /etc/hosts
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
172.17.0.2 mysql df28bcb97289
172.17.0.3 2f7fd098f006
进入到nginx容器查看hosts:
[root@server ~]# docker exec -it nginx /bin/bash #使用exec进入到nginx容器
[root@b68688cd6f2d nginx-1.8.]# cat /etc/hosts
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
172.17.0.3 php 2f7fd098f006
172.17.0.4 b68688cd6f2d
通过观察可以看见在php容器的hosts中有一条mysql的记录,这也就是为什么安装wordpress时后,我们直接填写mysql容器的名字变可以连接了。同理,nginx中也有一条php的记录。
相关软件包及配置文件见GitHub :https://github.com/buji595/docker_project/tree/master/Dockerfile_Project/lnmp
Docke--Dockerfile 构建LNMP环境的更多相关文章
- docker:Dockerfile构建LNMP平台
docker:Dockerfile构建LNMP平台 1.dockerfile介绍 Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker buil ...
- Dockerfile分离构建LNMP环境部署wordpress
最近忙着写自己的项目,也把一个站点的bbs论坛打算迁移到Docker中,测试没发现啥大问题.在单台上面的架构如下:(往后我们也是要讲到compose和swarm调度的慢慢来) 1.首先我们先安装一下d ...
- 使用dockerfile构建镜像(docker build)
Docker buidl . 找出当前文件夹下的Docker build文件名的文件 Docker build -t centos(镜像名) . 在当前目录下找centos的镜像文件 Docker ...
- [phvia/dkc] Docker Compose 快速构建(LNMP+Node)运行环境
快速构建(LNMP+Node)运行环境. dkc 在此作为 docker-compose 的缩写,你可以理解为 alias dkc=docker-compose 准备 安装 docker 选择1) 从 ...
- 原lnmp环境服务器升级为mysql+nginx+php单个docker容器构建的lnmp环境
时间:2018年2月 一.项目背景 我单位现web服务架构为lnmp环境,服务器软件.硬件升级部署难:同时开源软件日新月异,考虑到技术升级,领导决定服务器架构整体升级为容器架构,维护性.移植性强. 二 ...
- 十九.部署LNMP环境、构建LNMP平台、地址重写
proxy client web1 web2 1.部署LNMP环境 1.1 部署nginx(前面已部署过) 1.2 部署mariadb ]# yum -y install mariadb mari ...
- 高级运维(三):部署Lnmp环境、构建Lnmp平台、地址重写
一.部署LNMP环境 目标: 安装部署Nginx.MariaDB.PHP环境 1> 安装部署Nginx.MariaDB.PHP.PHP-FPM: 2> 启动Nginx.MariaDB.FP ...
- Docker进阶之九:Dockerfile 及 通过Dockerfile搭建lnmp
一.Dockerfile指令 指令 描述 指令 描述 FROM 构建的新镜像是基于哪个镜像 例如:FROM centos:6 COPY 拷贝文件或目录到镜像,用法同上例如:COPY ./start.s ...
- Docker LNMP环境搭建
原文地址:https://www.awaimai.com/2120.html 1 快速使用 2 安装docker和docker-compose 3 使用国内镜像仓库 4 目录说明 4.1 目录结构 4 ...
随机推荐
- 简简单单的Vue1(MVVM与Vue的双向绑定原理)
既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 Vue 在此之前的文章我们讲述了前端开发的工具,语言的知识,接下来我们从头开始学习一个 ...
- web前端图片上传(3)--filereader
这篇文章主要是为了介绍一种文件上传的方式.当然文件中是包含图片的.如果大家仔细看我的第一篇web前端图片上传(1)就会知道,其实也是按照这种方式上传你的,但是由于上次时间比较紧张,没有详细的介绍今天的 ...
- WEB前端学习资源清单
常用学习资源 JS参考与基础学习系列 [MDN]JS标准参考 es6教程 JS标准参考教程 编程类中文书籍索引 深入理解JS系列 前端开发仓库 <JavaScript 闯关记> JavaS ...
- loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...
- 1.4 GPU分析
shader 加宏 编译说明glsl
- IntentService原理分析
IntentService是一个异步处理请求的服务,通过Context#startService(Intent)可以将请求发送给IntentService,IntentService在工作线程中依次串 ...
- MyDAL - .QueryOneAsync() 使用
索引: 目录索引 一.API 列表 .QueryOneAsync() .QueryOneAsync<M>() 如: .QueryOneAsync<Agent>() , 用于 单 ...
- selenium之元素定位-css
CSS定位方式和XPATH定位方式基本相同,只是CSS定位表达式有其自己的格式.CSS定位方式拥有比XPATH定位速度快,且比XPATH稳定的特性.下面详细介绍CSS定位方式的使用方法 被测网页的HT ...
- SQL 游标的使用
适用场景:对查询出的结果集遍历,作用类似于其他语言的列表循环语句. 相关语法: --定义游标 DECLARE cr CURSOR FOR( SELECT Cust_ID ,Cust_Name ,IDC ...
- MYSQL的information_schema数据库中你可以得到的信息!!!
1.COLUMNS 记录了所有表字段的一些基本信息,例如权限信息等. 2:TABLES :使用该表可以查询每一个表的详细信息,例如数据占用空间大小.索引大小以及表的更新时间以及表的行数等 3:视图 可 ...