当前位置: 代码迷 >> 综合 >> Docker 官方镜像构建 LNMP 测试环境
  详细解决方案

Docker 官方镜像构建 LNMP 测试环境

热度:75   发布时间:2023-12-24 05:52:52.0

文章目录

    • 概述
    • 一. Network and Volumes
    • 二. image
    • 三. LNMP
      • 3.1 重新跑容器
      • 3.2 php 扩展问题
        • docker-php-source
        • docker-php-ext-enable
        • docker-php-ext-install
        • docker-php-ext-configure
    • 四. 打包docker-compose

概述

因为需要测试一些环境,在虚拟机里跑或者单个镜像又不方便,在宿主机又不安全,所以搭建一个通用的lnmp环境,把www目录与数据库需要导入的目录通过数据卷映射出来,方便源码导入修改。

环境:

  • mysql@v5.7
  • php@v7.4
  • nginx@v1.21

在这里插入图片描述

一. Network and Volumes

创建自定义网络,将lnmp的网络都放在一个自定义网络中,利于管理与容器组件之间的通信。

docker network create lnmp

创建数据卷,用于存储源码与数据库数据,数据卷不会受容器的影响,容器删除数据卷依然存在。 后面踩坑了,mac下的数据卷不好用,windows平台可以尝试使用,或者用后面的 -v 参数进行映射
https://docs.docker.com/storage/volumes/
根据官方文档, -v 不能带上服务配置文件,如果使用-v 会把宿主机的配置文件应用到容器,所以,带出一个问题,如果我没有默认的配置文件,就需要手动去download一份放本地,如果是项目迁移,使用-v就很合适。
在这里插入图片描述

docker volume create www
docker volume create sqldata

在这里插入图片描述

二. image

pull 官方镜像

docker pull mysql:5.7.37
docker pull nginx:1.21.6
docker pull php:7.4.29-fpm

在这里插入图片描述

三. LNMP

创建LNMP容器,把它们放在我们之前创建的网络中,把数据库目录跟www目录放在指定的宿主机目录下。

docker container run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --network lnmp --name mysql_lnmp --mount src=sqldata,dst=/var/lib/mysql 82d2d47667cf

想法是好的,但是现实是残酷的,mac下的volumes 数据卷一点也不好用,不知道是bug还是什么,mac下的docker使用 volumes没有这个目录,网上有可以访问的方法,但是不好用。最后我选择使用-v 直接映射目录不使用数据卷。

在这里插入图片描述
我没有docker目录,但是我的docker desktop 有且能看到文件,这很难受。

在这里插入图片描述

3.1 重新跑容器

mysql

https://hub.docker.com/_/mysql

在这里插入图片描述
mysql 不知道什么原因,可以将数据库文件通过 -v 映射到宿主机,且宿主机不需要原数据文件,可能是在mysql跑到时候会生成数据库文件

docker container run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --network lnmp --name mysql_lnmp -v /Users/wp_mac/home/docker/lnmp/sqldata:/var/lib/mysql/ 82d2d47667cf

在这里插入图片描述

php

https://hub.docker.com/layers/php/library/php/7.4.29-fpm/images/sha256-26ec7f68fdbd644692cd99b22f566b39ec7026f2bb0feec8d442dfc273af9114?context=explore
在这里插入图片描述
php.ini 默认配置文件
https://download.csdn.net/download/qq_38626043/85197220

带入原始配置文件至容器

docker container run -itd -p 9000:9000 --network lnmp -v /Users/wp_mac/home/docker/lnmp/php/php.ini:/usr/local/etc/php/php.ini -v /Users/wp_mac/home/docker/lnmp/www:/var/www/html --name php_lnmp eb029ced96bd

nginx

https://hub.docker.com/_/nginx

在这里插入图片描述
default.conf 默认配置文件

server {
    listen       80;listen  [::]:80;server_name  localhost;#access_log /var/log/nginx/host.access.log main;location / {
    root   /usr/share/nginx/html;index  index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {
    root   /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {
    # proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {
    # root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {
    # deny all;#}
}

带入原始配置文件进入容器,官方镜像的默认路径是/usr/share/nginx/html,但是php的www路径又是/var/www/html,所以在跑的时候,需要统一路径,不然nginx不能自动路由index.php文件。每次都需要手动输入index.php才能正常。这也算是个坑

docker container run -itd -p 80:80 --network lnmp --name nginx_lnmp -v /Users/wp_mac/home/docker/lnmp/www:/var/www/html -v /Users/wp_mac/home/docker/lnmp/nginx/default.conf:/etc/nginx/conf.d/default.conf fa5269854a5e

我们现在有三个容器,切它们在一个网络中

在这里插入图片描述

修改nginx配置文件,解析php

修改所有块 运行 目录 /var/www/html
修改fastcgi_pass 为 php容器名:9000
修改fastcgi_param 解析路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

重启nginx

在这里插入图片描述

在这里插入图片描述

3.2 php 扩展问题

php可能需要安装一些三方扩展,这需要用到一些docker为php封装的命令

docker-php-source

初始化,并生成 /usr/src/php目录,用于存放php扩展的目录。

docker-php-source extract | delete

docker-php-ext-enable

启用 php 扩展,使用此命令可以不用到php.ini中去开启。

docker-php-ext-enable mysqli

docker-php-ext-install

安装并启用扩展

docker-php-ext-install 源码包目录名
  • 源码包需要放在 /usr/src/php/ext 下
  • 默认情况下,PHP容器没有 /usr/src/php这个目录,需要使用 docker-- php-source extract来生成。
  • docker-php-ext-install 安装的扩展在安装完成后,会自动调用docker-php-ext-enable来启动安装的扩展。
  • 卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可。
  • 如果是github或者内部的扩展包需要下载或者挂载到ext目录下才能安装

docker-php-ext-configure

docker-php-ext-configure 一般都是需要跟 docker-php-ext-install搭配使用的,有一些扩展可能需要自定义配置,就需要docker-php-ext-configure命令来实现。

可以先配置在install

docker-php-ext-configure 库名 配置

四. 打包docker-compose

我将此基于官方镜像构建的lnmp环境打包至github,欢迎各位师傅star

https://github.com/wpsec/docker_lnmp