如何在Linux下使用docker搭建LNMP环境

大家好,我是小焦。最近在使用docker的过程中遇到了许许多多的坑。首次使用它也是浪费了大量的精力。今天我们来简单说下如何用它搭建一个LNMP环境吧,遇到的坑和解决方法我也会写到里面。

我使用Docker的原因

最近也是想构思一个小项目玩玩,首先就是环境的选择,因为我是在个人电脑上测试环境等等,首先考虑的就是资源利用的问题,例如分布式,集群等等。不同的应用的放到单独的主机上来运行,每个应用再用VM开一个虚拟机显然不现实,费事费力不说,电脑也带不了这么多。所以就选择了它。

Docker的准备工作(重要)

安装dokcer的简单用法就不说了,自己下去百度。最注意的就是搭建前要考虑的问题,mysql和php的版本选择,ip的需求等等。在这过程中,我也是遇见了一坑又一坑,所以我们将问题提前解决。还有很多的细节我们会在配置的过程中注意说明。切记,出现任何问题,一定要看日志,可以快速解决很多事

  • 版本问题:由于php版本和最近版的mysql8兼容问题测试中遇见好多问题。所以我们选择mysql5.7+php7.2版本。
  • IP问题:为什么说这个?因为docker默认是每次启动容器时根据启动顺序会随机分配IP的,如果保证项目的正常运行,最好还是每个容器分配静态IP。下面的搭建环境中由于没涉及到这问题,所以我就不写了,如果有这方面问题,创建容器前务必设置ip
  • 挂载问题:不同容器使用相同文件,一定要在宿主机中创建目录然后挂载到容器中。
  • link:这个也要必须注意,如果是nginx要调用php,一定要将php和mysql建立联系。不然会出现找不到应用的问题。
  • 启动顺序:当我们link后,启动项目时一定要先启动php后再启动nginx,不然nginx会启动失败。
  • 端口映射:同理docker容器启动顺序不同分配的IP不一样,避免这种问题,我们将容器中的端口映射到宿主机就没这种困扰了
  • 由于容器中大多用的apt-get命令,安装软件速度超慢,连vi命令都没有非常扯淡,文件都没法编辑。使用前记得换源,或者直接用docker cp命令将宿主机中的文件cp到容器也可以。

搭建LNMP环境

由于我们要容器间相互调用,所以安装顺序是mysql>php>nginx.由于小焦不想再安装了,下面就只写出命令,不展示效果图了。

docker安装mysql

首先,我们从仓库拉取一个MySql的镜像mysql5.7

docker pull mysql:5.7

拉取完后,使用docker images命令查看镜像,确认没有问题启动容器,这里值得注意的是,我们创建容器时最好用它的ID,不要使用名字,万一写错了它有自动给你拉镜像。下面我用的时名字,确保没问题,大家最好用ID。-p参数代表端口映射,后面跟端口号,第一个时3306时宿主机的端口,第二个时容器的,这里我们选择3306。123456是给数据库设置的密码,大家根据自己的设置

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

创建完容器用ps命令查看 
docker ps -a

进入容器,上面我们创建容器时指定名字是mysql了,所以用它的名字就能进入
docker exec -it mysql /bin/bash

docker安装php-fpm

同样首先我们拉取php-fpm的镜像,这里我们选择7.2版本
docker pull php:7.2-fpm

再创建一个phpfpm容器,-v参数是目录挂载,第一个目录是宿主机的,第二个是容器中的对应位置。一定要挂载,不然到时候访问不到文件,只能手动CP了,非常麻烦。端口映射到9000,link参数链接我么上面创建的mysql容器。第一个是容器名,第二个是容器内部的名字
docker run -d -v /var/nginx/www/html:/var/www/html -p 9000:9000 --link mysql:mysql --name phpfpm php:7.2-fpm

因为后面我要使用pdo模块进行测试,所以我需要自己安装pdo_mysql模块,在docker容器中可以这样来安装。
docker-php-ext-install pdo_mysql

其次我在部署中需要用到php的gd库,它用上面的命令不能安装,我要单独安装,装前最好换源哦。下面列出gd库的安装方法。
apt update #更新软件源
apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev #安装各种库
docker-php-source extract #解压源码
cd /usr/src/php/ext/gd #gd源码文件夹

docker-php-ext-configure gd --with-webp-dir=/usr/include/webp --with-jpeg-dir=/usr/include --with-png-dir=/usr/include --with-freetype-

dir=/usr/include/freetype2 #准备编译
docker-php-ext-install gd #编译安装
php -m | grep gd #查看是否安装成功

docker安装nginx

这里直接写nginx安装最新版本
docker pull nginx

接下来运行nginx容器,和上面的php挂载同一个文件目录,因为它两访问的相同文件,最后那个nginx是镜像名,小焦建议直接用id名
docker run -d -p 80:80 -v /var/nginx/www/html:/var/www/html --link phpfpm:phpfpm --name nginx nginx

然后进入nginx容器,修改nginx的配置文件让它支持php
docker exec -ti nginx /bin/bash

在容器里找到nginx的配置文件,默认是在/etc/nginx目录下。添加下面的内容,具体的nginx配置自己百度,这里先吧php的添加就行了。
location ~ \.php$ {
    root           /var/www/html;
    fastcgi_index  index.php;
    fastcgi_pass   phpfpm:9000;//这里改成我们之前--link进来的容器,也可以直接用php容器的ip
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;//如果你的根目录和php容器的根目录不一样,这里的$document_root需要换成你php下的根目录,不然php就找不到文件了
    include        fastcgi_params;                                                                                                                                              
}

有个注意的问题,踏马的nginx容器中竟然没有vi命令,apt-get又慢的跟蜗牛一样,这是我们可以直接将nginx.conf这个文件docker cp到宿主机,改完配置之后直接cp进去,它会自动替换里面的那个文件。其次就是后面的中文注解记得删掉,不支持会报错。总之坑是非常的多,大伙自己折腾吧。有什么问题大伙进群探讨哦

喜欢(2)

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

欢迎访问的小伙伴! 希望在这里能帮到你。有问题请多多指教~ 点击联系站长
在线客服

在线客服

  • 扫描二维码,微信联系 扫描二维码,进群联系