美文网首页
Dockerfile 方式定制 lnmp 环境

Dockerfile 方式定制 lnmp 环境

作者: c23a8b1826f9 | 来源:发表于2020-06-30 15:18 被阅读0次

    现在容器化技术越来越成熟和流行,比传统的虚拟化技术确实是有很大的优势,所以流行是必然的。今天来实践一把,使用 Docker 的 dockerfile 方式定制 lnmp 环境。

    环境配置
    操作系统:CentOS Linux release 7.6.1810
    Docker 版本:19.03.5
    Nginx 版本:1.15.5
    PHP 版本:7.2.26
    MySQL 版本:8.0.18
    Redis 版本:5.0.5
    创建目录结构
    docker目录://docker相关配置
    [root@zhangdeTalk data]# tree docker
    docker
    ├── bin
    │ └── docker-compose-linux.yml //dockerfile.yml
    ├── config
    │ ├── mysql
    │ │ └── mysqld.cnf //数据库配置文件
    │ ├── nginx
    │ │ ├── conf.d
    │ │ │ └── default.conf //nginx主要配置文件
    │ │ └── nginx.conf //nginx基础配置文件
    │ ├── php
    │ │ ├── php.ini //php基础配置文件
    │ │ └── www.conf //php主要配置文件
    │ └── redis
    │ └── redis.conf //redis配置文件
    ├── dockerfile
    │ ├── mysql-8.0.18
    │ │ └── Dockerfile //mysql的dockerfile
    │ ├── nginx-1.15.5
    │ │ └── Dockerfile //nginx的dockerfile
    │ ├── php-7.2-fpm
    │ │ └── Dockerfile //php的dockerfile
    │ └── redis-5.0.5
    │ └── Dockerfile //redis的dockerfile
    ├── README.en.md
    └── README.md
    www目录://站点目录
    [root@zhangdeTalk data]# tree www
    www
    └── zhangdetalk_blog_admin
    ├── 1.html
    └── index.php
    logs目录://日志目录
    [root@zhangdeTalk data]# tree logs
    logs
    ├── mysql
    ├── nginx
    │ ├── access.log
    │ └── error.log
    ├── php
    └── redis
    mysql目录://数据库数据目录
    redis目录://数据库数据目录
    Docker 安装
    先在 CentOS 安装 Docker,可参考另外一篇文章:CentOS 安装 Docker

    构建 lnmp 镜像 Dockerfile
    PHP Dockerfile
    From php:7.2-fpm

    维护者信息

    MAINTAINER zhangdeTalk 2393222021@qq.com

    时区

    ENV TZ Asia/Shanghai
    RUN date -R

    RUN docker-php-ext-install bcmath dom fileinfo filter ftp gd gmp hash iconv imap json mbstring mysqli odbc opcache pdo pdo_mysql pdo_odbc phar reflection session snmp soap sockets zip

    RUN docker-php-ext-install mysqli opcache pdo_mysql

    WORKDIR /working
    RUN apt-get update --fix-missing && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include --with-jpeg-dir=/usr/include/jpeg
    && docker-php-ext-install gd mysqli opcache pdo_mysql gd zip
    ENV PHPREDIS_VERSION 4.0.1
    ENV PHPXDEBUG_VERSION 2.6.0
    ENV PHPSWOOLE_VERSION 4.2.13
    ENV PHPMONGODB_VERSION 1.5.3
    RUN pecl install redis-PHPREDIS_VERSION \ && pecl install xdebug-PHPXDEBUG_VERSION
    && pecl install swoole-PHPSWOOLE_VERSION \ && pecl install mongodb-PHPMONGODB_VERSION
    && docker-php-ext-enable redis xdebug swoole mongodb

    install composer new

    https://getcomposer.org/installer | https://install.phpcomposer.com/installer

    RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    && php composer-setup.php
    && php -r "unlink('composer-setup.php');"
    && mv composer.phar /usr/local/bin/composer
    && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
    RUN apt-get install -y git

    clear

    RUN rm -rf /var/cache/apt/*
    && rm -rf /var/lib/apt/lists/*
    RUN mkdir /var/lib/sessions
    && chmod o=rwx -R /var/lib/sessions

    容器启动时执行指令

    CMD ["php-fpm"]
    Nginx Dockerfile
    From nginx:1.15.5

    维护者信息

    MAINTAINER zhangdeTalk 2393222021@qq.com

    时区

    ENV TZ Asia/Shanghai
    RUN date -R

    容器启动时执行指令

    CMD ["nginx", "-g", "daemon off;"]
    Mysql Dockerfile
    From mysql:8.0.18

    维护者信息

    MAINTAINER zhangdeTalk 2393222021@qq.com

    时区

    ENV TZ Asia/Shanghai
    RUN date -R

    容器启动时执行指令

    CMD ["mysqld"]
    Redis Dockerfile
    From redis:5.0.5

    维护者信息

    MAINTAINER zhangdeTalk 2393222021@qq.com

    时区

    ENV TZ Asia/Shanghai
    RUN date -R

    容器启动时执行指令

    CMD ["redis-server"]
    dockerfile.yml 配置
    version: '3.3'
    services:
    nginx:
    build: ../dockerfile/nginx-1.15.5
    ports:
    - "80:80" #nginx
    restart: always
    tty: true
    container_name: nginx
    volumes:
    - /data/www:/var/www/html
    - /data/logs/nginx:/var/log/nginx
    - /data/docker/config/nginx/conf.d:/etc/nginx/conf.d
    - /data/docker/config/nginx/nginx.conf:/etc/nginx/nginx.conf
    - /etc/letsencrypt:/etc/letsencrypt
    networks:
    - lnmp-networks
    php7:
    build: ../dockerfile/php-7.2-fpm
    tty: true
    restart: always
    container_name: php7
    volumes:
    - /data/www:/var/www/html
    - /data/logs/php:/var/log/php
    - /data/docker/config/php/php.ini:/usr/local/etc/php/php.ini
    - /data/docker/config/php/www.conf:/usr/local/etc/php-fpm.d/www.conf
    depends_on:
    - nginx
    networks:
    - lnmp-networks
    redis:
    build: ../dockerfile/redis-5.0.5
    container_name: redis
    tty: true
    restart: always
    volumes:
    - /data/docker/config/redis/redis.conf:/etc/redis/redis.conf
    - /data/redis:/var/lib/redis
    - /data/logs/redis:/var/log/redis
    networks:
    - lnmp-networks
    mysql:
    build: ../dockerfile/mysql-8.0.18
    container_name: mysql
    tty: true
    restart: always
    ports:
    - "3306:3306" #mysql
    volumes:
    - /data/mysql:/var/lib/mysql
    - /data/docker/config/mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
    - /data/logs/mysql:/var/log/mysql
    - /data/mysqlback:/data/mysqlback
    environment:
    MYSQL_ROOT_PASSWORD: root
    networks:
    - lnmp-networks
    networks:
    lnmp-networks:
    Nginx 配置文件
    vim /data/docker/config/nginx/conf.d/default.conf

    server {
    listen 80;
    listen [::]:80;
    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html index.php;
    charset utf-8;
    server_name zhangdetalk.com www.zhangdetalk.com;
    location ~ .md{ default_type 'text/plain'; } root /var/www/html/zhangdetalk_blog_admin;//项目目录 location / { #try_filesuri uri/ =404; index index.php index.htm index.html; if (!-erequest_filename) {
    rewrite ^(.*)/index.php?s=1 last;
    break;
    }
    }
    location ~ .php{ include fastcgi_params; fastcgi_index index.php; fastcgi_pass php7:9000;//容器:端口号 fastcgi_param SCRIPT_FILENAMEdocument_root$fastcgi_script_name;
    }
    }
    docker-compose 安装

    1. curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose
    2. chmod +x /usr/local/bin/docker-compose //设置可执行权限
      创建并启动容器
      docker-compose -f docker-compose-linux.yml up -d --force-recreate --remove-orphans
      容器查看
      docker ps

    测试
    vim /data/www/zhangdetalk_blog_admin/index.php
    <?php
    echo "Hello World";
    conn = mysqli_connect('数据库容器名字','dbuser','dbpw'); if(conn){
    echo '数据库连接成功!';
    }else{
    echo '数据库连接失败!';
    }
    phpinfo();
    ?>

    通过访问站点:http://www.zhangdetalk.com/
    可以看到显示数据库连接成功,并打印出PHP的相关信息
    到此步,我们的lnmp环境搭建大功告成!
    github 源码
    相关的源码下载地址:https://github.com/zhangdejian/docker_lnmp.git
    遇到的问题
    1、PHP代码连接数据库,host不能写成127.0.0.1或localhost,需要填写数据库容器名字

    2、mysql8连接,连接失败,因为加密方式有变化
    解决方式:主机登录mysql,修改成旧的加密方式(mysql_native_password),并重置密码

    • mysql -uroot -p;
    • use mysql;
    • select host,user,plugin from user;
    • alter user 'root'@'%' identified with mysql_native_password by '123456';

    相关文章

      网友评论

          本文标题:Dockerfile 方式定制 lnmp 环境

          本文链接:https://www.haomeiwen.com/subject/myjxqktx.html