首页 > 数据库 >2-2、dockerfile之php-fpm,mysql

2-2、dockerfile之php-fpm,mysql

时间:2024-04-09 22:36:06浏览次数:23  
标签:fpm nginx conf mysql docker php dockerfile

dockerfile之php-fpm

# cd docker-training/php-fpm/
# ls 
Dockerfile          nginx_nginx.conf  supervisor_nginx.conf
nginx_default.conf  php_www.conf      supervisor_php-fpm.conf

各文件解释:
nginx_nginx.conf 替换默认的nginx.conf文件
nginx_default.conf 替换默认的default.conf文件
php_www.conf 修改apache用户为nginx
supervisor_nginx.conf 添加启动nginx的supervisor文件
supervisor_php-fpm.conf 添加启动php-fpm的supervisor文件

php-fpm Dockerfile文件:
# cat docker-training/php-fpm/Dockerfile 
#
# MAINTAINER        Carson,C.J.Zeong <[email protected]>
# DOCKER-VERSION    1.6.2
#
# Dockerizing php-fpm: Dockerfile for building php-fpm images
#
FROM       csphere/centos:7.1
#FROM       6a42a6009825 #centos:7.1的image id
MAINTAINER Carson,C.J.Zeong <[email protected]>

# Set environment variable
ENV APP_DIR /app

RUN yum -y install nginx php-cli php-mysql php-pear php-ldap php-mbstring php-soap php-dom php-gd php-xmlrpc php-fpm php-mcrypt && \ 
    yum clean all

ADD nginx_nginx.conf /etc/nginx/nginx.conf
ADD nginx_default.conf /etc/nginx/conf.d/default.conf

ADD php_www.conf /etc/php-fpm.d/www.conf
RUN sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php.ini

RUN mkdir -p /app && echo "<?php phpinfo(); ?>" > ${APP_DIR}/info.php

EXPOSE    80 443

ADD    supervisor_nginx.conf /etc/supervisor.conf.d/nginx.conf
ADD    supervisor_php-fpm.conf /etc/supervisor.conf.d/php-fpm.conf

ONBUILD ADD . /app
ONBUILD RUN chown -R nginx:nginx /app



命令解析:
ONBUILD ADD . /app
ONBUILD 在生成当前docker镜像的时候不生效,在子镜像生效;ONBUILD在产品发布时起着非常重要的作用!
举例:
A镜像中有ONBUILD指令,在构建A镜像时ONBUILD指令不执行;B镜像FROM A,在构建B镜像时ONBUILD指令开始执行;

如何给docker镜像命名:
registry-url: registry服务器的域名或者ip
namespace:
image-name: docker镜像的名字
tag: docker镜像的版本号,推荐使用应用服务的版本号来命名,如php-fpm:5.4

生成php-fpm镜像:
docker build -t csphere/php-fpm:5.4 .

Step 12 : ONBUILD add . /app
 ---> Running in 9e21ede67350
 ---> 7541483a5a76
Removing intermediate container 9e21ede67350
Step 13 : ONBUILD run chown -R nginx:nginx /app
 ---> Running in ab55fc7a46a1
 ---> c61699e8c237
Removing intermediate container ab55fc7a46a1
Successfully built c61699e8c237


生成website容器:
docker run -d -p 8080:80 --name website csphere/php-fpm:5.4 
# docker run -d -p 8080:80 --name website php-fpm:5.4 
da30b15d3518320f4150b20ef329e59432a65610968977277879578b5fd8f4f7

参数解释:
-d 后台运行
-p 8080:80 将宿主机的8080端口映射到容器的80端口
--name website 给容器命名为website
csphere/php-fpm:5.4 使用这个镜像镜像创建docker容器
使用浏览器访问:http://your_ip:8080/info.php


如何进入一个正在运行的docker容器?
docker exec -it website /bin/bash

#查看当前容器中使用supervisor启动了哪些服务 
# supervisorctl    
nginx                            RUNNING   pid 9, uptime 0:23:15
php-fpm                          RUNNING   pid 10, uptime 0:23:15


#######################
csphere/mysql:5.5

cat csphere/mysql/Dockerfile 
#
# MAINTAINER        Carson,C.J.Zeong <[email protected]>
# DOCKER-VERSION    1.6.2
#
# Dockerizing Mariadb: Dockerfile for building Mariadb images
#
FROM csphere/centos:7.1
#FROM       6a42a6009825 #centos:7.1的image id
MAINTAINER Carson,C.J.Zeong <[email protected]>

ENV DATA_DIR /var/lib/mysql

# Install Mariadb
RUN yum install -y mariadb mariadb-server && \
    yum clean all

ADD mysqld_charset.cnf /etc/my.cnf.d/

COPY scripts /scripts
RUN chmod +x /scripts/start

EXPOSE 3306

VOLUME ["/var/lib/mysql"]

ENTRYPOINT ["/scripts/start"]
-----------------------

命令解析:
VOLUME ["/var/lib/mysql"]
VOLUME指令,宿主机文件目录和docker容器文件目录做映射
ENTRYPOINT ["/scripts/start"]
ENTRYPOINT在每次启动docker容器时都会被执行,此例,是运行了一个shell脚本"/scripts/start"

每次启动都会运行/scripts/start脚本,脚本内容如下:
# cat start 
#!/bin/bash
set -e
#
# When Startup Container script
#
if [[ -e /scripts/firstrun ]]; then
    # config mariadb
    /scripts/firstrun_maria
        rm /scripts/firstrun
else
    # Cleanup previous mariadb sockets
    if [[ -e ${DATA_DIR}/mysql.sock ]]; then
        rm -f ${DATA_DIR}/mysql.sock
    fi
fi
exec /usr/bin/mysqld_safe
-------------------------
脚本解析:
set -e 脚本中只要有一行有错误,就会中断脚本执行
如果firstrun文件存在,执行firstrun_maria脚本,如果不存在,删除mysql.sock文件,并启动Mariadb
firstrun_maira脚本是初始化Mariadb,以及设置数据库用户和密码,详情内容请自行阅读脚本文件

构建mysql docker镜像:
docker build -t csphere/mysql:5.5 .

###docker volume 保证删除容器后,数据不被删除

保存容器中的数据
数据共享
使用方法:
1.在Dockerfile中定义VOLUME["/data"]

2.通过docker run -d -v <host_dir>:<container_dir>

###案例:
创建mysql容器,不挂载docker volume,删除后,数据是否存在
创建mysql容器,挂载docker volume,删除后,数据是否存在

运行不挂载docker volume的mysql容器:
# docker run -d -p 3306:3306 --name dbserver csphere/mysql:5.5
# docker run -d -p 3306:3306 --name dbserver mysql:5.5 
0a3092395c1e6a84f0ecd5383799f210519c5aefc82cbb7ee2ed1a471fc463f5

删除docker容器,容器里面的数据都会随着容器被删除而删除
# docker rm dbserver
Error response from daemon: Cannot destroy container dbserver: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
Error: failed to remove containers: [dbserver]

参数解释:
删除状态为“Exited”的docker容器:
docker rm 
强制删除docker容器:
docker rm -f 

运行挂载docker volume的mysql容器:
docker run -d -p 3306:3306 -v /var/lib/docker/vfs/dir/mydata:/var/lib/mysql csphere/mysql:5.5 
f49165d5e081b8bd8af9cb9c0bbbeb6545d45f857c1a852646c105 docker exec -it f49 /bin/bash

登陆数据库创建mydb数据库
# mysql
# show databases;
# create database mydb;
Query OK, 1 row affected (0.00 sec)
# show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
# exit
exit

查看主机文件目录下,是否已生成mydb数据库目录文件
# ls /var/lib/docker/vfs/dir/mydata/
aria_log.00000001  ibdata1      ib_logfile1  mysql       performance_schema
aria_log_control   ib_logfile0  mydb         mysql.sock  test

停止docker容器:
# docker stop f49165d5e081
f49165d5e081

删除docker容器,查看`mydb`目录是否被删除:
# docker rm f49165d5e081
f49165d5e081
# ls /var/lib/docker/vfs/dir/mydata/    验证,挂载docker volume后,容器被删除掉,数据还在
aria_log.00000001  ibdata1      ib_logfile1  mysql       performance_schema
aria_log_control   ib_logfile0  mydb         mysql.sock  test

新创建一个容器,挂载到刚才的数据目录下,是否可以把之前的数据库加载回来:
docker run -d -p 3306:3306 --name newdb -v /var/lib/docker/vfs/dir/mydata:/var/lib/mysql csphere/mysql:5.5 29418b93d4d4a00a86169c568b6f952e71d25b155d7f6b8012d953022691b2b8

docker exec -it newdb /bin/bash

# mysql
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

 

标签:fpm,nginx,conf,mysql,docker,php,dockerfile
From: https://www.cnblogs.com/skyzy/p/18125023

相关文章

  • 2-1、dockerfile之centos7
    docker基础及dockerfile1、docker组件(C/S)dockerclient:docker客户端dockerserver:dockerdaemon的主要组成部分,接受用户通过dockerclient发送的请求,并按照相应的路由规则实现路由分发docker镜像:docker镜像运行之后变成容器(dockerrun)dockerregistry:镜像仓库,registry......
  • 记一次php反序列化漏洞中的POPchain和POC构造实战
    来自于橙子科技反序列化靶场源代码如下:<?php//flagisinflag.phphighlight_file(__FILE__);error_reporting(0);classModifier{private$var;publicfunctionappend($value){include($value);echo$flag;}publicfunction......
  • PHP代码审计——Day7-Bells
    漏洞解析functiongetUser($id){global$config,$db;if(!is_resource($db)){$db=newMySQLi($config['dbhost'],$config['dbuser'],$config['dbpass'],$config[�......
  • Dockerfile简介
      1.什么是dockerfiledockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。2.Dockerfile构建过程解析dockerfile构建过程解析:  Docker执行Dockerfile的大致流程:    ......
  • Dockerfile 保留字 简介
       FROM基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROMMAINTAINER:RUNEXPOSE:当前容器对外暴露出的端口。WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点ENV:......
  • (亲测好用)使用PHP提取PDF内容的详细步骤与实例
    使用PHP提取PDF内容的详细步骤与实例在现代Web开发中,处理PDF文件的需求越来越普遍。无论是需要读取PDF文件的内容,还是需要进行PDF文件的编辑和转换,PHP都提供了丰富的库和函数来帮助我们完成这些任务。本文将详细介绍如何使用PHP来提取PDF文件的内容,并提供相关的代码示例。1.安装......
  • Composer安装与配置:简化PHP依赖管理的利器(包括加速镜像设置)
    在现代的PHP开发中,我们经常会使用许多第三方库和工具来构建强大的应用程序。然而,手动管理这些依赖项可能会变得复杂和耗时。为了解决这个问题,Composer应运而生。Composer是一个PHP的依赖管理工具,它可以帮助我们轻松地安装、更新和管理项目的依赖项。本文将介绍如何安装和配置C......
  • C语言,PHP扩展开发
    c语言代码:/*test_addextensionforPHP*/#ifdefHAVE_CONFIG_H#include"config.h"#endif#include<stdlib.h>#include<stdio.h>#include<string.h>#include<unistd.h>#include"php.h"#include"zend_exc......
  • 关于转义符 \ 在php正则中的匹配问题
    今天做题遇到一个很经典的问题,记录一下,先看一段代码<?php$str,=,"\\";$pattern,=,"/\\/";if(preg_match($partern,$str,$arr)){,,,,echo,"success";,,,,print_r($arr);}else{,,,,echo,"false";}看到这段代码的师傅们,思考一下,会输出success还是false输出fals......
  • 深入理解PHP+Redis实现布隆过滤器(亿级大数据处理和黑客攻防必备)
    布隆过滤器极简概括英文名称BloomFilter,用于判断一个元素是否在一个大数据集合中,如果检测到存在则有可能存在,如果不存在则一定不存在。Redis官网对于布隆过滤器的说明:https://redis.io/docs/data-types/probabilistic/bloom-filter/使用场景防止缓存穿透:用于快速判断某个商......