php是最好的语言

centos7.5 利用docker安装nginx + php + mysql


docker比直接在服务器上安装环境有很多好处,自己百度
先安装docker(官方文档要求Linux kernel至少3.8以上,且docker只能运行在64位的系统中。由于RHEL6和CentOS6的内核版本为2.6,最好使用centos7以上)
可以先用uname -r查看系统是否符合要求
setenforce 0   
yum -y install docker-io  //开始安装
service docker start    //启动docker
docker run hello-world // 如果报错有可能是版本问题(一定要运行这个)
docker version   //查看版本
如果出现版本那么docker安装完成,如果中途报错自己百度,docker安装很简单的


*****现在拉取镜像(后面会制作自己的镜像,这里的镜像作为基础镜像)*****
这里先介绍几个常见的docker命令
#docker ps        查看所有正在运行的容器
#docker ps -a     查看所有容器包括停止掉的
#docker stop [容器id|容器别名]        停止容器
#docker rm [容器id|容器别名]          删除停止容器(这里是删除容器不是删除镜像,容器只有先停止才能删除)
#docker restart [容器id|容器别名]     重启容器
#docker start [容器id|容器别名]       启动停掉的容器
#docker stop $(docker ps -a -q)     停止所有容器
#docker rm $(docker ps -a -q)       删除所有停止的容器
#docker pull imageName              拉取镜像
#docker images                      查看镜像
#docker exec -it [容器id|容器别名] bash        进入对应镜像的终端
#docker inspect [容器id|容器别名]     查看容器的信息(比如挂载路径)
#docker exec myphp php /usr/share/nginx/html/index.php 这样子可以执行脚本 定时器也可以这样子写


docker pull nginx:1
docker pull php:7-fpm
docker pull mysql:5
拉取完成使用如下命令查看是否存在
docker images

//输出
//REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
//nginx               1                   7b27d9ade773        6 days ago          109.1 MB
//php                 7-fpm               5a94ee0038db        2 weeks ago         367 MB
//mysql               5                   3cc8ec7719ab        2 weeks ago         372.1 MB
//REPOSITORY(镜像名字) TAG(镜像标签) IMAGE ID(镜像ID)后面两个不用解释了

*****接下来运行镜像******
# mysql
docker run -e MYSQL_ROOT_PASSWORD=xutao -p 3306:3306 -d --name mymysql mysql:5
# php
docker run -p 127.0.0.1:9000:9000 -d --name myphp php:7-fpm
# nginx
docker run -d -p 80:80 --name mynginx nginx:1

#-p是映射端口 -d是后台运行 --name是别名(--name mymysql说明把这个容器命名为mymysql后面停止、重启、删除容器都可以用这个别名) 具体参数解释参见(http://www.runoob.com/docker/docker-install-nginx.html)

使用如下命令查看镜像是否运行起来,如果其中某个没有运行起来可以去掉-d参数再次运行查看错误
docker ps

//输出
//CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                               NAMES
//0c7e0eeedfa8        nginx:1             "nginx -g 'daemon of   7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp                  mynginx
//a83f0ca62adf        php:7-fpm           "docker-php-entrypoi   7 minutes ago       Up 7 minutes        127.0.0.1:9000->9000/tcp            myphp
//d08b39cec2c0        mysql:5             "docker-entrypoint.s   7 minutes ago       Up 7 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mymysql
// CONTAINER ID(容器id,停止 删除 重启都可以用这个) IMAGE(镜像信息) NAMES(容器别名,功能和容器id差不多)其他几个不用解释了

*****上面是基本启动,为了方便需要文件挂载,和不同容器之间的数据交换,所以运行命令需要多个参数*****
生成配置文件和测试文件
# 保存到/tmp/conf.d/default.conf ()
server {
    listen  80;
#    server_name test.phpindex.win;
    root /usr/share/nginx/html;
    index index.php index.html;
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        fastcgi_pass php-fpm:9000;    
    }
}

*⚠️fastcgi_pass php-fpm:9000; 这里需要注意 不然可能出现503  php-fpm可以用你的php容器的ip或者用容器名字都行

# 保存到/tmp/html/index.php
<?php
phpinfo();

#接下来给mysql挂载文件,防止数据被还原

mkdir /docker
mkdir /docker/mysql
mkdir /docker/mysql/conf
mkdir /docker/mysql/data
 
创建my.cnf配置文件
touch /docker/mysql/conf/my.cnf
 
my.cnf添加如下内容:
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

//这一步是为了挂载文件提前生成几个文件(比如数据库不挂载文件,那么停止,重启,运行原mysql容器建立的数据库都会被还原)

#再次运行容器(这里最好先停止,删除对应容器,再运行,别名不能重复)
#这里是停止,删除所有容器,正式最好停止单个,防止影响别的容器

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

#比如停止php容器
#docker stop myphp
#docker rm myphp

docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xutao --name mymysql mysql:5

docker run -p 9000:9000 -v /tmp/html:/usr/share/nginx/html --name myphp -d php:7-fpm

docker run -d  -p 80:80 -v /tmp/conf.d:/etc/nginx/conf.d --volumes-from myphp --link myphp:php-fpm --name mynginx nginx:1

#docker exec -it mynginx bash 我们进入nginx容器终端可以看见/usr/share/nginx/html是存放目录的文件 /etc/nginx/conf.d是配置文件的路径,其他需要挂载其他方法一样
#挂载完成我们操作主机的对应文件 那么容器对应的文件也会跟着改变,反之亦然,使用exit可以退出镜像终端
#-v挂载文件 --link和别的容器进行关联,具体查看这里(# --volumes-from用了这个nginx才能访问php的代码
#
docker ps #查看是否容器运行

#每次修改完nginx配置文件都要重启nginx容器才能起作用,操作基本和直接在linux搭建的一样
#php连接数据库不能使用127.0.0.1来连接 直接用主机ip

****接下来测试利用php连接mysql*****
docker exec -it myphp bash #进入php终端查看是否有对应的模块
php -m #查看php安装了哪些模块,这时候发现并没有mysqli和pdo_mysql常用模块 我们先安装
cd /usr/local/bin
docker-php-ext-install pdo_mysql
docker-php-ext-install mysqli
php -m #再次查看已经安装完毕
重启php和nginx
docker restart myphp    #这里myphp和mynginx是容器的别名
docker restart mynginx

在/tmp/html/index.php 写入如下代码
<?php
//echo phpinfo();
$mysqli = new mysqli("XX.XXX.XXX.XXX", "root", "xutao","test");
if(!$mysqli)  {
    echo"database error\n";
}else{
    echo"php env successful\n";
}
$result = $mysqli->query( 'select * from yyy' );
$row = $result->fetch_row();
echo $row[0];
$mysqli->close();
?>

使用命令测试是否有问题
curl 127.0.0.1

到这里基本就安装完毕了,可是如果你停止(docker stop myphp)、删除(docker rm myphp),重新运行容器(docker run -p 9000:9000 -v /tmp/html:/usr/share/nginx/html --name myphp -d php:7-fpm)
刚才安装的pdo_mysql、mysqli又会没有了(回到了镜像的最初状态,我们可以使用commit来生成新镜像也可以使用dockerfile来构建)

*commit比较简单可以参考(https://www.cnblogs.com/waterlufei/p/6682345.html)



作者:xTao 分类:LNMP 浏览:2470 评论:0