Docker 官方镜像构建 LNMP 测试环境
文章目录概述一. Network and Volumes二. image三. LNMP概述因为需要测试一些环境,在虚拟机里跑或者单个镜像又不方便,在宿主机又不安全,所以搭建一个通用的lnmp环境,把www目录与数据库需要导入的目录通过数据卷映射出来,方便源码导入修改。环境:mysql@v5.7php@v7.4nginx@v1.21一. Network and Volumes创建自定义网络,将lnm
文章目录
概述
因为需要测试一些环境,在虚拟机里跑或者单个镜像又不方便,在宿主机又不安全,所以搭建一个通用的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
更多推荐
所有评论(0)