Docker搭建lnmp环境

发布时间 2023-06-13 17:03:31作者: 念秋

使用的服务器配置很低,而且快要到期了。到时候更换服务器再搭建lnmp,也挺花时间的,所以这里先未雨绸缪一波。

参考自博客园

首先使用命令行依次配置nginx/php-fpm/mysql,然后再使用docker-compose重新配置一次。

Nginx:

docker pull nginx	//简单的拉取镜像
docker create --name temp_nginx nginx	//创建一个容器,以便复制文件

这是项目的树形图:
[root@localhost lnmp]# tree
.
├── conf.d
├── data
├── html
│   ├── index.html
│   └── index.php
└── logs

docker cp temp_nginx:/etc/nginx/conf.d/default.conf ./con.d/	//直接复制基础的配置文件

docker network create lnmp	//创建一个网络

docker run --name lnmp_nginx --network lnmp -dp 80:80 -v /root/lnmp/html:/usr/share/nginx/html -v /root/lnmp/conf.d:/etc/nginx/conf.d nginx
//启动nginx镜像,包括别名,端口,配置文件,网页访问根目录,加入网络。

启动以后,直接浏览器访问http://虚拟机IP/index.html,就能看见html目录下的index.html文件了。
后续需要修改nginx的配置文件,直接修改./conf.d/default.conf,然后docker restart lnmp_nginx即可。
或者,docker exec -it lnmp_nginx nginx -s reload也可以。
或者docker exec -it lnmp_nginx /bin/sh	//直接进入容器的命令行,再运行 nginx -s reload也可以刷新配置文件。
可以进入容器使用nginx -t 检验配置文件是否出错。

php-fpm

docker pull php:5.6.40-fpm	//简单的拉取镜像

docker run --name lnmp_php --network lnmp -dp 9000:9000 -v /root/lnmp/html:/usr/share/nginx/html php:5.6.40-fpm		//这样写,在上面的html下面编写php文件就可以执行了
还是加入了同一个网络,这样在nginx配置文件里面就可以直接使用lnmp_php这个别名,而不用IP地址。

当然,非要使用IP地址也可以:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' phpfpm	//可能需要自己修改一些东西,我执行起来没问题,并且和我用portainer看见的ip一样。

docker ps,能看见php-fpm在运行就ok。或者自己进入php-fpm的容器,直接php index.php。看看运行有没有出错,就知道路径啥的配置正确没有。

php弄好了,就需要修改nginx的配置文件了。很容易看见conf配置文件里面注释了php的部分,略加修改即可。

大概是改成下面这样
location ~ \.php$ {
        root           /usr/share/nginx/html;	//这里很坑,默认是html,我忘了改。
        fastcgi_pass   lnmp_php:9000;	//加入一个网络,使用重命名也是ok的,否则,使用IP地址也可以
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; //这一行必须修改
        include        fastcgi_params;
    }
    
[13/Jun/2023:07:34:57 +0000] "GET /index.php HTTP/1.1" 404 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43" "-"
2023/06/13 07:34:57 [error] 79#79: *86 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.133.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://172.19.0.3:9000", host: "192.168.133.129"
好久才发现,原来是nginx对php的路径有问题。root默认是html,我改成/usr/share/nginx/html,就可以正常访问了。

root那个路径不改,就会出现这样的问题。

后来试了一下,新建一个容器,但是不加入lnmp的网络,无论怎样修改nginx配置文件,使用别名也好,使用容器的IP也好,都是不能正常使用php的服务的。也就是实现了容器和网络之间的隔离。
2023/06/13 07:48:13 [error] 91#91: *104 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.133.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://172.17.0.3:9000", host: "192.168.133.129"


mysql

docker pull mysql:5.5.62

docker run --name lnmp_mysql --network lnmp -dp 3306:3306 -v /root/lnmp/data:/var/lib/mysql -v /root/lnmp/logs:/logs -e MYSQL_ROOT_PASSWORD=123456 mysql:5.5.62
mysql没有什么好说的。只是试了下能运行,能进入容器修改配置就ok了。

docker-compose

version: '3'
services:
  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./html:/usr/share/nginx/html
      - ./conf.d:/etc/nginx/conf.d
    depends_on:
      - php-fpm
    restart: always # 设置重启策略为always
    networks:
      - mylnmp
  php-fpm:
    image: php:5.6.40-fpm
    ports:
      - 9000:9000
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - mysql
    restart: always # 设置重启策略为always
    networks:
      - mylnmp
  mysql:
    image: mysql:5.5.62
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./data:/var/lib/mysql
    networks:
      - mylnmp
    restart: always # 设置重启策略为always

networks:
  mylnmp:
    name: mylnmp # 指定网络名称

和上面的几乎没什么区别,好在这样一个文件,就可以在切换服务器的时候,轻松搭建好环境,我需要做的,也只是提供html文件夹内的文件罢了。

docker-compose up -d	//执行即可

还是需要自己修改nginx的配置文件。

location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   php-fpm:9000;	//使用docker-compose中的服务名称
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;	//这里还是要改
        include        fastcgi_params;
    }

总的来说,搭建lnmp也不怎么复杂,使用docker-compose更简洁,方便