【docker】docker-compose一键搭建LNMP环境,内含一个php项目

简单搭建LNMP 服务

项目github地址:https://github.com/a376230095/docker_compose_lnmp.git

前提步骤:

  • 先创建好目录:mkdir -p /root/lnmp

搭建mysql

  • 安装mysql的容器运行:docker run -d --name cs_mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7
  • 进入mysql,赋予权限
    • docker exec -it cs_mysql bash
    • grant all privileges on . to ‘root’@‘%’;
    • flush privileges;

搭建php

  • 安装php的容器运行:docker run -d -v /root/lnmp/var/nginx/www/html:/var/www/html -p 9000:9000 --link cs_mysql:mysql --name cs_phpfpm php:7.2-fpm
  • 安装php插件
    • docker exec -it cs_phpfpm bash
    • 安装mysqli和pdo_mysql的插件
      • docker-php-ext-install mysqli
      • docker-php-ext-install pdo_mysql
    • 安装gd插件
      • apt update
      • apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
      • docker-php-source extract
      • cd /usr/src/php/ext/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

搭建nginx

  • 运行nginx 容器命令:docker run -d -p 80:80 --name cs_nginx -v /root/lnmp/var/nginx/www/html:/var/www/html -v /root/lnmp/etc/nginx/conf.d:/etc/nginx/conf.d --link cs_mysql:mysql --link cs_phpfpm:phpfpm --name cs_nginx nginx:1.18.0
  • 配置nginx
    • cd etc/nginx/conf.d/
    • vim default.conf
    server {
      listen       80;
      server_name  localhost;
      location / {
          root   /var/www/html;
          index  index.html index.htm index.php;
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
          root   /usr/share/nginx/html;
      }
      location ~ \.php$ {
          root           html;
          fastcgi_pass   cs_phpfpm:9000;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
          include        fastcgi_params;
      }
    }
    
  • 把项目放到nginx上
    • cd var/nginx/www/html/
  • 但是做上面两个步骤都没啥意义,我们的default.conf和项目不能放在容器里面,因为我们要做volumes,做了-v参数,容器里面volumes的内容都是空的
  • 因此要cd /root/lnmp/etc/nginx/conf.d,把default.conf放进去
  • 把项目放到/root/lnmp/var/nginx/www/html/上去

项目启动

  • 进入ip/项目目录即可


docker-compose搭建lnmp+php项目

大概思路

  • 不自己制作images上传到docker的hub上
  • 只有php需要拓展,安装额外的插件,需要做一个dockerfile
  • nginx需要把default.conf和项目放到-v的目录里面,使用shell脚本来完成

php的dockerfile

  • 仅仅使用RUN就可以安装mysqli、gd、pdo_mysql三个插件
FROM php:7.2-fpm
RUN apt update && apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
RUN docker-php-source extract
RUN cd /usr/src/php/ext/gd
RUN 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
RUN docker-php-ext-install gd
RUN docker-php-ext-install mysqli && docker-php-ext-install pdo_mysql

docker-compose的编排

  • 这样做会有几个问题
    • 端口固定死了,php的端口可以不写死9000,nginx也可以不写死80,mysql可以不写死3306
    • php和mysql甚至都不用端口映射,直接给nginx服务即可
    • 容器卷的位置也可以自己修改
    • 因此端口和容积卷可以作为配置文件来作为配置
    • 额外编写一个配置文件,执行脚本的时候读取配置文件内容,然后修改内容,diy完成啦
version: '3'

services:

 mysql:
  image: mysql:5.7
  ports:
   - 3306:3306
  environment:
   MYSQL_ROOT_PASSWORD: 1234

 php:
  build:
   context: ./php
   dockerfile: dockerfile
  links:
   - mysql
  ports:
   - 9000:9000
  volumes:
   - /root/lnmp/var/nginx/www/html:/var/www/html

 nginx:
  image: nginx:1.18.0
  links:
   - mysql
   - php
  volumes:
   - /root/lnmp/var/nginx/www/html:/var/www/html
   - /root/lnmp/etc/nginx/conf.d:/etc/nginx/conf.d
  ports:
   - 80:80

自动运行的脚本文件start.sh

#!/bin/bash
# 定义各种变量
mysql_port=$(cat config | grep mysql_port | awk -F "=" '{print $2}')
php_port=$(cat config | grep php_port | awk -F "=" '{print $2}')
nginx_port=$(cat config | grep nginx_port | awk -F "=" '{print $2}')
directory_conf=$(cat config | grep directory_conf | awk -F "=" '{print $2}')
directory_html=$(cat config | grep directory_html | awk -F "=" '{print $2}')

# 创建directory_conf 文件夹
if [[ -d $directory_conf  ]];then
        echo "$directory_conf exist,nothing do"
else
        echo "$directory_conf not exist,create it"
        mkdir -p $directory_conf
fi

# 创建directory_html文件夹
directory_html="/root/lnmp/var/nginx/www/html"
if [[ -d $directory_html ]];then
        echo "$directory_html exist,nothing do"
else
        echo "$directory_html not exist,create it"
        mkdir -p $directory_html
fi

# 复制default.conf 文件到conf文件夹上
# 复制t2文件夹到html文件夹上
cp -f default.conf $directory_conf
cp -rf t2 $directory_html

# 给两个文件夹加入权限
chmod -R 777 $directory_html
# 根据配置文件,修改docker-compose的端口和volumes
sed -i "s#[0-9]*:3306#$mysql_port:3306#g" docker-compose.yml
sed -i "s#[0-9]*:9000#$php_port:9000#g" docker-compose.yml
sed -i "s#[0-9]*:80#$nginx_port:80#g" docker-compose.yml
sed -i "s#\S*:/var/www/html#$directory_html:/var/www/html#g" docker-compose.yml
sed -i "s#\S*:/etc/nginx/conf.d#$directory_conf:/etc/nginx/conf.d#g" docker-compose.yml

# 构建docker-compose
docker-compose build
# 后台运行docker-compose
docker-compose up -d

配置文件

# mysql外部的暴露的端口号
mysql_port=3306
# php外部的暴露的端口号
php_port=9000
# nginx外部的暴露的端口号
nginx_port=80
# nginx配置文件的路径
directory_conf=/root/lnmp/etc/nginx/conf.d/
# nginx项目的路径
directory_html=/root/lnmp/var/nginx/www/html/

文件项目说明

简介

  • docker-compose 一键搭建LNMP平台,并集成了一个《发货100》的php项目
  • nginx版本号:1.18.0
  • mysql版本号:5.7
  • php版本号:7.2-fpm

项目运行的条件


config配置文件

  • 修改nginx的配置文件路径,修改nginx的项目路径,修改对外暴露的nginx、mysql、php的端口号

docker-compse的内容

  • 项目会自动生成两个目录:
    • /root/lnmp/var/nginx/www/html
    • /root/lnmp/etc/nginx/conf.d
  • nginx
    • 端口占用了80
    • volumes有两个:
      • /root/lnmp/var/nginx/www/html:/var/www/html
      • /root/lnmp/etc/nginx/conf.d:/etc/nginx/conf.d
  • php
    • 端口占用了9000
    • volumes有1个:
      • /root/lnmp/var/nginx/www/html:/var/www/html
  • mysql
    • 端口占用了3306
    • root的密码为1234
    • mysql的host地址为:mysql

文件结构:

  • default.conf:存放nginx的配置信息
  • docker-compose.yml:构建docker-compose的yml文件
  • php:构建php的dockerfile文件夹
  • start.sh:自动运行
  • t2:《发货100》的源码
  • config:配置文件
  • template:配置文件和docker-compose的备份和简单的测试脚本

发货100的运行

  • url:宿主机的ip/t2/install
  • 数据库的host为mysql
  • 其他应该很简单,就不填写了
1 Like