参考:阮一峰Docker 入门教程犬小哈Docker 日常命令大全

From: https://www.nodeseek.com/post-32012-1

由于最近的lnmp.org一键包投毒事件,不太敢再继续用lnmp一键包来装lnmp环境了。个人不太喜欢用面板,不如乘着这个机会把环境移植到docker去。用docker最大的好处就是全部东西都是官方的,不太担心会被投毒。但是用了这么多年lnmp一键包,还是有点感情的(很多config不想自己手动再搓一遍)。于是决定同时尽量使用来自一键包的各种配置文件。

Docker这边,目标是做出一个lnmp最小环境并全部使用nignx,mysql,php-fpm官方镜像。

太长不看版

https://github.com/anshi233/lnmp-docker

这个repo里包含了理论上走完全文能得到的一个完整lnmp环境。使用方法请参考README。比一键包麻烦一点但是基本上就是跑几行命令的事。
但是还是强烈推荐自己手搓一个环境出来。

Docker架构

经过一段时间研究后,于是决定参考https://lnmp.org/faq/lnmp-software-list.html把关键的配置文件全部映射到docker环境里面去。

Docker大致架构决定如下,主要使用docker compose来达成类似“一键”包的效果。

现在,我们可以尝试把lnmp一键包搭建的环境的配置文件复制到以上设计好的docker的目录里去了。

lnmp的环境的配置文件来源很自由,你可以从你已经搭了环境的机器复制过来。或者单开一台临时vps装上lnmp2.0然后复制到其他机器。这里只复制nginx,php,www的文件夹。mysql打算重新创建文件夹并手动导入sql来迁移。

mysql和dockerfile就手动创建

运行权限方面,我强烈不推荐使用root权限去运行任何公开服务。所以计划使用www用户来运行nginx和php-fpm。mysql用户运行mysql。

如果是新机器,我们需要手动在host主机里创建www和mysql用户。推荐创建的同时指定一个uid。具体的创建命令每个发行版都可能不太一样,请google。

如果是已经有www mysql用户的老机器,我们可以通过查看/etc/passwd来查询www用户的uid。稍后会用到。

配置目录的权限

nginx

nginx的配置文件默认情况下是在/usr/local/nginx/conf 里面。理论上只要把这个文件映射到docker nginx的配置文件目录里就可以了。但是实际上,lnmp.org提供的配置文件模板里有些绝对路径也需要根据实际情况去修改。

首先理清下原设置应该被映射到docker容器里面的哪个路径

原设置

config: /usr/local/nginx/

ssl: /some_ssl_folder

web: /home/www or /home/wwwroot

logs: /usr/local/nginx/logs(原本是用来存放pid文件的的,可忽略) and /home/wwwlogs

而他们在官方nginx docker容器里的默认对应位置是

config: /etc/nginx

ssl: N/A (我们自己创建)

web: 我们自己创建

logs: 我们自己创建

于是只有config需要映射到/etc/nginx里面去,其他文件夹都是可以很灵活地放到其他地方。

我们在docker compose里可以创建以下卷映射:

接下来我们可以把已经安装了lnmp2.0的机器上的/usr/local/nginx/conf文件夹全部复制到docker文件夹里面的nginx/conf里面去了。

同时原本的www用户也要加上。由于容器内的用户名和主机并不互通。为确保一致我们需要用uid。

然后就是修改nginx的配置文件了。我们只需要修改一些用绝对路径的选项。

以上为nginx.conf需要修改的地方。

为了让容器运行在www用户下。我的方法为在docker compose文件里明文指定www用户的uid和gid。比如在nginx service下面加上这一行:

同时,我还想给nginx加上lua支持,需要添加插件。这里有点坑,由于alpine apk能安装的nginx-lua插件不一定是最新版本的。在写这个文档时,nginx docker官方最新版本是1.25.2,apk上最新的版本是1.24.0,nginx运行时会因错误版本而报错。比较稳妥的方法就是让官方image手动编译我们要的模块。参考:docker-nginx/modules at master · nginxinc/docker-nginx (github.com)

创建dockerfiles/nginx.Dockerfile

这里使用alpine版容器因为感觉会省点内存?

(可选)如果要启动lua支持,还需要在nginx.conf里面加上

到这里,nginx配置部分就大致准备完毕。接下来再把wwwroot里的默认网页复制到docker文件夹里并创建以下docker-compose.yml文件看看能不能工作。

保存完docker compose文件后使用以下命令启动nginx容器

如果所有东西都配置完毕,访问host主机,我们应该能看见熟悉的lnmp模板网站了。

但是现在还没有结束,探针一打开就报502错误。我们还需要配置php部分。

/wp-content/uploads/replace/efdd894639cb0bad7a3f0eb31191a762.jpeg

PHP

根据lnmp.org官方文档和php-fpm docker的文档,我们需要映射以下文件进到我们的php-fpm容器。

同时,php-fpm的配置文件也需要根据需求进行修改

Global块的修改:

www块的修改

原本php-fpm.conf的内容

需要改成监听端口模式

因为在docker里面,容器之间的交流推荐使用网络来解决。于是最好将php-fpm配置成端口监听模式。

到这里,php-fpm配置文件就修改完了。

nginx这边的php配置模板也需要更新。因为在容器里,我们需要拿端口来和php-fpm连接。

修改./nginx/conf/enable-php.conf 和 ./nginx/conf/enable-php-pathinfo.conf

但是目前还有一个问题,实际跑网站时我们需要很多额外的扩展(比如mysqli,gd,ioncube等等)。

可以通过dockefile里额外运行https://github.com/mlocati/docker-php-extension-installer这个项目来帮我们安装。

创建dockerfiles/php-fpm.Dockerfile

接下来在 compose file nginx容器的后面加上php的部分

然后运行php-fpm容器

不出意外,我们就可以访问探针了

/wp-content/uploads/replace/f498ac7fd08e1908108f6372d309b60e.jpeg

MYSQL

最后,我们来迁移mysql

由于一些原因,lnmp2.0创建的mysql数据库无法直接在docker版上运行。由于mysql可以很方便地通过mysqldump来导出整个数据库。所以采用了先导出整个数据库到sql文件,稍后再使用phpmyadmin之类的程序导入回去。

接下来准备mysql的docker compose部分。这里我使用了mysql容器官方的配置模板。

如果路径权限配置正确的话,mysql容器是能直接跑起来的。

其中,./mysql/conf.d是用来存放mysql额外配置文件的。(可选)这里可以创建一个网上复制来的低内存占用参数

low-mem.cnf

为了让phpmyadmin能够连接到我们的数据库,我们还需要修改一些phpmyadmin的参数。

找到./wwwroot/default/phpmyadmin/config.inc.php

最后,运行mysql容器

至此,我们应该可以得到一个的使用docker搭建的最小lnmp2.0环境了。mysql的数据可以轻松地通过phpmyadmin来导入。这里就不细说了。

如果要关闭服务的话可以使用

SSL

SSL证书获取部分,由于SSL证书获取的方法多种多样,所以略过了。如果想让容器也能读取到SSL证书,本文使用的例子是把SSL文件放到主机里的”./ssl”文件夹里去。

并在nginx的配置文件里指定被映射的”/ssl”文件夹为ssl保存目录。

你也可以自由地映射自己的ssl目录到nignx容器的任何地方。只需要确定nginx配置文件里的位置是正确的就可以了。
来源:本人博客

lnmp-docker From: https://github.com/anshi233/lnmp-docker

又一个使用docker实现lnmp.org的docker-compose项目,所有的配置文件都来自lnmp.org的LNMP2.0安装脚本。 强烈推荐使用自己的配置文件替换掉原有的配置文件。

文件列表

使用方法

首先创建www和mysql用户并指定uid(这里是基于debian的例子,实际上的命令可能因为发行版的不同而不同)。 如果你已经有www和mysql用户了,可以跳过这一步。

下载这个repo

请务必修改mysql的root密码并在第一次启动后删除docker compose 文件上的这一行

创建文件夹并分配权限

运行服务

The Default web port is 80 and 443 To enable or disable each service only