大家好,我是小焦。最近在使用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进去,它会自动替换里面的那个文件。其次就是后面的中文注解记得删掉,不支持会报错。总之坑是非常的多,大伙自己折腾吧。有什么问题大伙进群探讨哦
评论抢沙发