zoukankan      html  css  js  c++  java
  • 基于Docker搭建PHP开发环境

    Docker 是这几年非常火的一项技术,作为一名软件开发人员,应该及时的接触和掌握。

    镜像加速:

    可以在阿里云上免费的获取,然后进行配置即可使用。阿里云 Docker 加速器,没有阿里云账号注册一个即可。

    docker的具体安装可以参考官网上的安装教程,验证安装是否成功

    docker -v

    1.安装MySQL

    1)拉取镜像

    // 拉取最新版的mysql
    docker pull mysql
    
    //拉取指定版本的mysql
    docker pull mysql:5.7

    2)运行MySQL

    #运行最新版 Mysql
    docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345678 -d mysql
    #运行制定版本
    docker run --name mysql_57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:5.7

    参数说明:

    •  run:创建一个新的容器
    • --name:指定容器的名称
    • -p:端口映射(宿主机端口:容器端口)
    • -e: 传入环境变量
    • -d: 后台运行

    进入容器内部:

    docker exec -it mysql bash

    参数说明:

    • -i:标识允许对容器进行操作,交互式操作
    • -t:在容器中新创建一个伪终端
    • /etc/mysql: Mysql容器内的配置文件目录, 目录下包含my.cnf配置和一个conf.d文件夹,my.cnf文件内是一些基础配置。自定义的配置应该卸载conf.d文件夹下的配置文件里,从而覆盖默认的my.cnf
    • /var/lib/mysql:镜像内MySQL的持久化数据存储目录

    MySQL 属于有状态应用,若将其容器化需将其状态抽离到宿主机,其配置文件、日志文件和持久化数据都应该挂载到宿主机上。在 PC 上创建目录存储 Mysql 的数据、配置、日志,这样数据存储在宿主机上,我们删除容器后再次安装,可直接使用,不会导致数据丢失。

    mkdir -p docker/mysql &&  cd docker/mysql
    mkdir data log conf

    移除之前创建的mysql容器:

    docker stop mysql && docker rm mysql

    在 conf 目录中新建 my.cnf 文件,作为 Mysql 的配置文件

    vim my.cnf
    [mysqld]
    datadir=/var/lib/mysql
     #(默认不是中国时区,使用的时候被坑过)
    default-time_zone = '+8:00'
    log-error=/var/log/mysql/error.log

    然后重新创建 Mysql 容器,并将创建的目录挂载到容器内对应的目录上。

    docker run --name mysql 
                      --restart=always ( Docker 重启时容器也跟随启动)
                      --privileged=true (Docker 为容易内的 root 用户赋予真正的 root 权限,不然会提示 log 目录权限不足)
                      -p 3306:3306 
                      -v docker/mysql/conf:/etc/mysql/conf.d (将配置目录挂载到容器内的配置目录)
                      -v docker/mysql/data:/var/lib/mysql (将数据存储目录挂载到容器内的出局存储目录)
                      -v /docker/mysql/log:/var/log/mysql (将日志目录挂载到容器内的日志目录)
                      -e MYSQL_ROOT_PASSWORD=12345678 
                      -d mysql

    参数说明:

    • -v:将容器内路径挂载到宿主机路径

    如果发生目录找不到或错误, 尝试使用宿主机的绝对路径

    如果想要对默认数据进行修改,允许远程访问,需进入容器内执行操作

    $ docker exec -it mysql bash
    
    $ mysql -u root -p
    
    $ mysql-> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
    
    $ mysql-> FLUSH PRIVILEGES;

    2.安装NGINX

     1)拉取镜像

    docker pull nginx

    2)启动容器

    nginx run -d --name nginx -p 80:80 nginx

    然后访问 localhost 就可以看到 Nginx 的默认欢迎页面

    3)创建目录存储 Nginx 的配置和日志

    mkdir -p docker/nginx && cd docker/nginx
    mkdir conf log

    4)从容器内复制配置文件到宿主机,经配置文件映射到容器内对应的目录中

    docker cp nginx:/etc/nginx/conf.d/default.conf docker/nginx/conf/default.conf

    5)重建容器

    docker stop nginx && docker rm nginx
    docker run --name nginx -p 80:80 -v docker/nginx/conf:/etc/nginx/conf.d 
    -v docker/www:/usr/share/nginx/html -v docker/nginx/log:/var/log/nginx -d nginx

    3、安装PHP

    1)拉取PHP镜像

    
    docker pull php:fpm

    2)创建容器

    docker run --name php-fpm -p 9000:9000 -d php:fpm

    3)创建目录存储php配置文件和日志

    mkdir -p docker/php && cd docker/php
    mkdir conf log

    4)从容器中复制配置文件

    docker cp php-fpm:/usr/local/etc/php-fpm.d/www.conf docker/php/conf/www.conf
    docker cp php-fpm:/usr/local/etc/php/php.ini-production docker/php/conf/php.ini

    5)重新启动容器

    docker run --name php-fpm --link mysql:mysql 
                    -v ~/docker/www:/var/www/html 
                    -v docker/php/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf 
                    -v docker/php/conf/php.ini:/usr/local/etc/php/php.ini 
                    -d php:fpm
    • --link <name or id>:alias : 可以用来链接2个容器,使得源容器和接收容器之间可以互相通信    

          name和id是源容器的name和id,alias是源容器在link下的别名

    连接 PHP 和 Mysql 容器后,PHP 脚本连接数据库时,host 的值为 'mysql'。

    6)Nginx 容器支持 PHP-FPM 容器

    修改 Nginx 的配置文件 default.conf

    server {
            listen       80;
            server_name  localhost;
            root /var/www/html;
            charset utf-8;
    
            access_log  /var/log/nginx/access.log  main;
            error_log  /var/log/nginx/error.log;
    
            location / {
                index  index.html index.htm index.php;
                try_files $uri $uri/ /index.php?$query_string;
            }
            #error_page  404              /404.html;
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            location ~ .php$ {
                fastcgi_index index.php;
                #php-fpm容器名:端口号
                fastcgi_pass   php-fpm:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include       fastcgi_params;
            }
    
            location ~ /.ht {
                deny  all;
            }
    }

    在docker/www下创建index.php

    <?php
    phpinfo();

    打开localhost查看是否显示正常

    4.PHP扩展安装

    进入到容器中执行

    docker-php-ext-install mysqli
    
    如果无法安装,则可以
    pecl  install redis && docker-php-ext-install redis

    安装gd扩展

    apt-get update
    apt-get install libpng-dev libjpeg-dev libfreetype6-dev
    docker-php-ext-install gd

    有些扩展并不是自带的,需要使用perl来进行安装,例如memcached

    FROM php:7.1-fpm
    RUN apt-get update 
        # 手动安装依赖
        && apt-get install -y libmemcached-dev zlib1g-dev 
        # 安装需要的扩展
       && pecl install memcached-2.2.0 
       # 启用扩展
       && docker-php-ext-enable memcached

    使用docker-php-ext-enable来进行启用

    安装完扩展后,不需要修改配置文件,重启 PHP 容器即可。

    • 容器启动顺序:mysql > php > nginx

    其他:

    1.laradock  https://github.com/laradock/laradock  基于docker搭建的laravel框架开发环境

    常见问题:

    1.启动docker服务的时候出现错误:docker启动mysql容器失败,Errcode: 13 - Permission denied
    挂载目录没有相关权限导致,

  • 相关阅读:
    api服务器思路
    利用express写api接口
    sql基础语句
    安装npm后,nrm ls 报错internal/validators.js:124 throw new ERR_INVALID_ARG_TYPE(name, ‘string‘, value)
    JavaScript垃圾回收机制和闭包
    用git clone 远程的所有分支
    面试题重点
    Linux 常用命令
    防抖函数和节流函数
    GIT PUSH 出现EVERYTHING UP-TO-DATE 解决方法
  • 原文地址:https://www.cnblogs.com/xingxia/p/docker_php.html
Copyright © 2011-2022 走看看