docker 搭建lnmp

193 阅读4分钟

安装docker和docker-compose

Docker安装要求Linux 3.10以上版本

装了yum的可以执行下面的命令安装docker-compose

yum install docker-io docker-compose     

yum安装2024版本

安装依赖包

[root@localhost data]#yum install -y yum-utils device-mapper-persistent-data lvm2 
软件作用
yum-utils:提供了 yum-config-manager 工具
device mapper:是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
lvm2存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

设置阿里云镜像源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#下载yum仓库

安装docker

yum install -y docker-ce docker-ce-cli containerd.io
#  此处安装最新版   如果不想安装最新版
​
​
yum list --help
#可以使用帮助查看
yum list --showduplicates docker-ce
#查看所有的可用版本
yum -y install docker-ce-19.03.15-3.el7    docker-ce-cli-19.03.15-3.el7  containerd.io
软件作用
docker-ce(Docker Community Edition)这是 Docker 的社区版。Docker 社区版是免费的, 面向开发者、小型团队和个人使用。它包含了 Docker Engine, 这是一个用于构建和运行容器的开源容器运行时。
docker-ce-cli(Docker Command Line Interface)这是 Docker 的命令行工具, 它允许用户与 Docker Engine 交互,执行容器相关的操作。 通过 Docker CLI,用户可以构建、运行、管理和发布容器。
containerd.io它负责管理容器的生命周期,包括容器的创建、运行、暂停、继续和销毁等

部署MySQL

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

就完成了MySQL的安装,接下来我们再在PHP-FPM容器中使用。

部署Nginx

下载nginx镜像:

$ docker pull nginx

启动Nginx容器:

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

映射HTML路径

docker rm -f nginx # 删除容器
$ docker run --name nginx -p 80:80 -v opt/lnmp/nginx/webs/html/:/usr/share/nginx/html -v -d nginx

在浏览器上访问验证

如果配置文件有修改,需要重启容器生效:

$ docker restart nginx

配置 Nginx

Nginx 的强大很大部分体现在配置文件上,对于一些高级的应用来说,自定义 Nginx 非常重要。所以,我们需要把 Nginx 的配置文件复制到本地服务器目录:

$ cd /opt/lnmp/nginx/conf/conf.d

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

再加一个-v参数,把本地的配置文件映射到容器上,在重启容器:

$ docker stop nginx
$ docker rm nginx
$ docker run --name nginx -p 80:80 --link php-fpm -v /opt/lnmp/nginx/webs/html:/usr/share/nginx/html -v /opt/lnmp/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf -d nginx:latest

如果配置文件有修改,需要重启容器生效:

$ docker restart nginx

这样就可以直接在本地修改配置文件了。

4 部署PHP-FPM

下载 PHP-FPM 镜像:

$ docker pull php:fpm
$ docker run --name php-fpm -p 9000:9000 -d php:fpm
#复制www.conf到本地的www/config中
$ docker cp php-fpm:/usr/local/etc/php-fpm.d/www.conf www.conf  
#查看容器的  containerID
$docker ps -a   
#进入到正在运行的php-fpm容器中
$docker exec -it containerID /bin/bash
#进入到src中会看到2个压缩包
root@e8f61e487bb6:/usr/src#cd /usr/src/
root@e8f61e487bb6:/usr/src#ls -ll
-rw-r--r-- 1 root root 11928820 Dec  4 18:40 php.tar.xz
-rw-r--r-- 1 root root      850 Dec  4 18:40 php.tar.xz.asc
#解压tar.xz文件:先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar xvf xxx.tar来解包。
root@e8f61e487bb6:/usr/src# xz -d php.tar.xz
root@e8f61e487bb6:/usr/src#ls -ll
-rw-r--r-- 1 root root 139786240 Dec  4 18:40 php.tar
-rw-r--r-- 1 root root       850 Dec  4 18:40 php.tar.xz.asc
root@e8f61e487bb6:/usr/src#tar xvf php.tar
root@e8f61e487bb6:/usr/src#ls -ll
drwxr-xr-x 14 1000 1000      4096 Dec  4 16:12 php-7.3.0
-rw-r--r--  1 root root 139786240 Dec  4 18:40 php.tar
-rw-r--r--  1 root root       850 Dec  4 18:40 php.tar.xz.asc
exit;
#回到宿主机的config文件夹中,把容器里面的php.ini复制下来
$ docker cp php-fpm:/usr/src/php-7.3.0/php.ini-production php.ini

在本地服务器修改 php.ini 的内容,设置cgi.fix_pathinfo=0(要先删除前面的;注释符):

cgi.fix_pathinfo=0

然后重新启动容器:

$ docker stop php-fpm
$ docker rm php-fpm
$ docker run --name php-fpm -p 9000:9000 --link mysql:5.7.29 -v /opt/lnmp/nginx/webs/html/:/usr/share/nginx/html  -v /opt/lnmp/php-fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf -v /opt/lnmp/php-fpm/php.ini:/usr/local/etc/php-8.1.1/php.ini -d php:fpm

这样PHP-FPM的容器就部署完成了。注意,要保证配置文件 php.ini 和 www.conf 没有错误,否则会无法启动容器。

5 让Nginx容器支持FPM

打开 nginx 的配置文件,修改内容如下:

server {
    listen       80;
    server_name  _;
    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        #root   /usr/share/nginx/html;
        #index  index.php index.html index.htm;
	try_files $uri $uri/ =404;
    }

    error_page  404  /404.html;
    location = /40x.html {
        root    /user/share/nginx/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   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ .php$ {
        fastcgi_pass   php-fpm:9000;
        fastcgi_index  index.php;
#        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
	fastcgi_param SCRIPT_FILENAME $document_root$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;
    }
}

然后启动 nginx:

$docker stop nginx
$docker rm nginx
$ docker run --name nginx -p 80:80 --link php-fpm -v /opt/lnmp/nginx/webs/html:/usr/share/nginx/html -v /opt/lnmp/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf -d nginx:latest 

在宿主机下的 /Users/xiaohao/Desktop/www下创建 index.php 文件,内容:

<?php
    phpinfo();
?>