您现在的位置是:网站首页>>服务器>>Docker

docker 安装PHP环境(PHP + nginx + mysql+phpmyadmin)

发布时间:2018-11-09 13:44:54作者:wangjian浏览量:834点赞量:0

    一:安装docker

    参考  centos下安装docker windows 下安装docker

    二:拉取相关镜像 

    这里我拉去的镜像分别为 nginx ,php:7.1.0-fpm ,mysql:5.7,phpmyadmin/phpmyadmin

    你可以通过docker search命令查看相关镜像

    docker search php
    docker search nginx
    docker search mysql
    docker search phpmyadmin

    拉取mysql镜像

    docker pull mysql:5.7

    拉取phpmyadmin镜像

    docker pull phpmyadmin/phpmyadmin

    拉取PHP镜像

    docker pull php:7.1.0-fpm

    拉取nginx镜像

    docker pull nginx

    等待下载完成后,我们就可以在本地镜像列表里查到我们下载的相关镜像

    docker images

    image.png

    三:建立相关目录(用于存放PHP nginx mysql的配置文件)

    mkdir /srv/nginx
    mkdir /srv/mysql
    mkdir /srv/php

    四:安装mysql

    1:以mysql镜像运行为mysql的容器,mysql的密码设为123456

    docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

    2:查看容器中mysql的配置内容

    docker exec mysql ls /etc/mysql

    image.png

    3:把mysql容器中的配置目录conf.d复制到本地(宿主机)

    docker cp -a mysql:/etc/mysql/conf.d /srv/mysql/conf.d/

    4:停止mysql容器并删除

    docker stop mysql
    docker rm mysql

    5:重新运行mysql容器,并挂载我们复制出来的配置文件目录及mysql日志目录,mysql表信息目录

    docker run -p 3306:3306  --restart=always --name mysql -v /srv/mysql/conf.d:/etc/mysql/conf.d -v /srv/mysql/logs:/logs -v /srv/mysql/data:/var/lib/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

    命令说明

    -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。

    --restart=always:docker启动时容器自动启动

    --name mysql :将容器命名为mysql

    -v /srv/mysql/conf.d:/etc/mysql/conf.d:将主机的  /srv/mysql/conf.d挂载到容器的 /etc/mysql/conf.d (这里是mysql的配置目录)

    -v /srv/mysql/logs:/logs:将主机 /srv/mysql/logs 目录挂载到容器的 /logs(这里是mysql的日志目录)

    -v /srv/mysql/data:/var/lib/mysql :将主机/srv/mysql/data目录挂载到容器的 /var/lib/mysql (这里是mysql的表信息目录)

    --privileged=true :使用该参数,container(容器)内的root拥有真正的root权限。否则,container(容器)内的root只是外部的一个普通用户权限

    -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

    -d :后台运行容器,并返回容器ID

    mysql:5.7:表示使用mysql:5.7镜像运行mysql容器

    6:查看mysql容器是否运行

    docker ps

    image.png

    如上图表示mysql容器运行成功

    7:配置mysql容器使其可以远程连接mysql

    (1)进入mysql容器

    docker exec -it mysql /bin/bash

    image.png

    (2):设置容器mysql可以远程连接

    mysql -u root -p   #回车后会让你输入密码,密码是上面你创建出容器时设置的密码
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456';  
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456';
    FLUSH PRIVILEGES;
    exit;

    设置好远程连接后按Ctrl+D就可以退出mysql容器

    使用客户端进行远程连接测试:

    image.png

    这时候使用docker安装mysql成功

    五:安装phpmyadmin

    1使用phpmyadmin镜像运行容器

    docker run --name phpadmin --link mysql:db -p 9998:80 --restart=always -d phpmyadmin/phpmyadmin

    命令说明

    -p 9998:80:将容器的 80端口映射到主机的 9998端口。

    --restart=always:docker启动时容器自动启动

    --name phpmyadmin:将容器命名为phpmyadmin

    --link mysql:db:将mysql容器和phpmyadmin容器进行连接,并将mysql容器命名为db

    -d :后台运行容器,并返回容器ID

    phpmyadmin/phpmyadmin:表示使用phpmyadmin/phpmyadmin镜像运行phpmyadmin容器

    2:在浏览器输入:localhost:9998

    image.png

    phpmyadmin安装成功

    六:安装PHP

    1:使用php-fpm镜像运行容器

    docker run -p 9000:9000 --restart=always --name php -v /srv/php/logs:/phplogs  -v /data/www:/www --privileged=true --link mysql:mysql -d php:7.1.0-fpm

    命令说明

    -p 3306:3306:将容器的 9000 端口映射到主机的 9000 端口。

    --restart=always:docker启动时容器自动启动

    --name php:将容器命名为php

    -v /srv/php/logs:/phplogs:将主机的 /srv/php/logs挂载到容器的 /phplogs (这里是php的日志目录)

    -v /data/www:/www:将主机 /data/www 目录挂载到容器的 /www(这里是php的项目目录)

    --privileged=true :使用该参数,container(容器)内的root拥有真正的root权限。否则,container(容器)内的root只是外部的一个普通用户权限

    --link mysql:mysql:将mysql容器和php容器进行连接,并将mysql容器命名为mysql

    -d :后台运行容器,并返回容器ID

    php:7.1.0-fpm:表示使用php:7.1.0-fpm镜像运行php容器

    2:安装php拓展

    进入php容器

    docker exec -it php /bin/bash

    安装相关依赖

    apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev

    安装iconv拓展

    docker-php-ext-install iconv

    安装mcrypt拓展

    docker-php-ext-install mcrypt

    安装gd拓展

    docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && docker-php-ext-install gd

    安装mysqli拓展

    docker-php-ext-install pdo_mysql && docker-php-ext-install mysqli

    其他你所需要的拓展安装方法大体差不多

    按Ctrl+D就可以退出php容器,重启容器 docker restart php

    七:安装nginx

    (1):使用默认配置运行nginx容器

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

    (2):查看容器中nginx的配置文件目录

    docker exec nginx ls /etc/nginx

    image.png

    (3)复制容器内的配置文件文件夹conf.d内的配置文件到本地(宿主机)

    docker cp -a nginx:/etc/nginx/conf.d /srv/nginx/conf.d

    (4)停止Nginx容器并删除

    docker stop nginx
    docker rm nginx

    (5)重新运行nginx容器,并挂载配置文件及nginx日志

    docker run -p 80:80 --restart=always --name nginx -v /srv/nginx/conf.d:/etc/nginx/conf.d -v /srv/nginx/logs:/wwwlogs --privileged=true --link php:php -d nginx

    命令说明:

    -p 80:80:将容器的 80端口映射到主机的 80端口。

    --restart=always:docker启动时容器自动启动

    --name nginx:将容器命名为nginx

    -v /srv/nginx/conf.d:/etc/nginx/conf.d:将主机 /srv/nginx/conf.d目录挂载到容器的 /etc/nginx/conf.d(这里是nginx的配置目录)

    -v /srv/nginx/logs:/wwwlogs:将主机的 /srv/nginx/logs挂载到容器的 /wwwlogs(这里是nginx的日志目录)

    --privileged=true :使用该参数,container(容器)内的root拥有真正的root权限。否则,container(容器)内的root只是外部的一个普通用户权限

    --link php:php:将php容器和nginx容器进行连接,并将php容器命名为php

    -d :后台运行容器,并返回容器ID

    nginx:表示使用nginx镜像运行nginx容器

    (6):通过浏览器访问localhost

    image.png

    (7)nginx配置phpinfo

    [1]:新建一个phpinfo.php文件

    vim /data/www/phpinfo.php

    注意:这里创建phpinfo.php文件时必须要创建在/data/www目录下,因为只有这样才能够挂载到php容器中

    输入如下内容


    <?php
    phpinfo();
    ?>

    [2]:修改nginx的配置项

    vim /srv/nginx/conf.d/default.conf

    将其修改为:

    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
        #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   /usr/share/nginx/html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   https://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   php:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /www$fastcgi_script_name;
            include        fastcgi_params;
        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

    修改的是下图部分

    image.png

    上图中的主要参数说明

    1:php:9000 :

    php表示的是在运行nginx容器时使用的--link php:php 连接php容器时对于php容器的命名,9000表示在运行php容器时开放的端口

    如果在运行nginx容器时没有使用--link php:php时,使用

    docker inspect 容器ID或容器名 |grep '"IPAddress"

    image.png

    上面的命令可以查看容器的IP,如果没有使用--link php:php时将php:9000改为127.17.0.3:9000

    2:/www$fastcgi_script_name :

    /www表示的是在运行php容器时挂载本地/data/www目录的php容器的目录地址


    重新启动nginx 

    docker restart nginx

    [3]:在浏览器上输入localhost/phpinfo.php

    image.png


    (8)测试数据库连接

    1:使用客户端软件登录mysql创建一个test库,在test库中创建一个test表

    image.png

    2:在/data/www目录下创建一个ceshi.php文件

    vim /data/www/ceshi.php

    ceshi.php文件的内容为:

    <?php
    $con = @mysqli_connect("mysql","root","123456");  #连接数据库第一个参数为在运行php容器时连接mysql容器时给mysql容器命名的名字,如果在运行php容器时没有使用--link mysql:mysql 使用(docker inspect 容器ID或容器名 |grep '"IPAddress")获取到mysql容器的ip把第一个参数换成mysql容器ip,第二个参数为用户名,第三个为密码
    if (!$con){
     echo '失败';
    }
    else{
    $db = $con->select_db("test");
    if ($db){
    $res = $con->query("select * from test");
    while($row = $res->fetch_assoc()){
    var_dump($row);
    }
    }
    }

    在浏览器上输入localhost/ceshi.php

    image.png

0 +1