说明

  • Docker下搭建lnp环境
  • 本案例下web环境只安装了NGINX+PHP,MySQL推荐使用单独服务器维护
  • 问题:该方式PHP安装某些扩展(比如gd)会有很多问题

环境信息

  • 系统:CentOS7.6
  • 软件:docker 20.10.11
  • 镜像:nginx:1.21,php:7.4-fpm

CentOS7下安装Docker

》设置仓库,安装所需软件包

[root@192 ~]# yum install -y wget vim yum-utils device-mapper-persistent-data lvm2
[root@192 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

》安装依赖包 container-selinux

[root@192 ~]# wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.119.1-1.c57a6f9.el7.noarch.rpm
[root@192 ~]# yum -y install ./container-selinux-2.119.1-1.c57a6f9.el7.noarch.rpm

》 安装Docker Engine-Community和containerd

#列出并排序存储库中可用的版本
[root@192 ~]# yum list docker-ce --showduplicates | sort -r
#安装
[root@192 ~]# yum install -y docker-ce docker-ce-cli containerd.io

》检查docker是否安装成功

[root@192 ~]# systemctl start docker
[root@192 ~]# systemctl enable docker
[root@192 ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.11
 API version:       1.41
 Go version:        go1.16.9
 Git commit:        dea9396
 Built:             Thu Nov 18 00:38:53 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.11
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.9
  Git commit:       847da18
  Built:            Thu Nov 18 00:37:17 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

》配置镜像加速

[root@192 ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": [
        "https://docker.mirrors.ustc.edu.cn/",
        "https://hub-mirror.c.163.com",
        "https://registry.docker-cn.com"
    ]
}
[root@192 ~]# systemctl daemon-reload
[root@192 ~]# systemctl restart docker

Web环境(NGINX+PHP)

》安装php-fpm

  • 拉取镜像

    [root@192 ~]# docker pull php:7.4-fpm
  • 成功结果

    Digest: sha256:610af6fce15abd550be76b9231ea32dae2ca9b481a3a439bf75cc5532ab63364
    Status: Downloaded newer image for php:7.4-fpm
    docker.io/library/php:7.4-fpm
  • 启动容器

    [root@192 ~]# docker run -d --name my-php74-fpm \
    -p 9000:9000 \
    -v /mnt/hgfs/www/lnmp/nginx/html:/var/www/html \
    php:7.4-fpm

》安装NGINX

  • 拉取镜像

    [root@192 ~]# docker pull nginx:1.21
  • 成功结果

    Digest: sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
    Status: Downloaded newer image for nginx:1.21
    docker.io/library/nginx:1.21
  • 创建数据目录

    mkdir -pv /mnt/hgfs/www/lnmp/nginx/{conf/conf.d,data,logs}
  • 准备配置文件nginx.conf、conf.d/default.conf

    • nginx.conf

      [root@192 ~]# vim /mnt/hgfs/www/lnmp/nginx/conf/nginx.conf
      user  nginx;
      worker_processes  1;
      
      error_log  /var/log/nginx/error.log warn;
      pid        /var/run/nginx.pid;
      
      events {
          worker_connections  1024;
      }
      
      http {
          include       /etc/nginx/mime.types;
          default_type  application/octet-stream;
      
          log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';
      
          access_log  /var/log/nginx/access.log  main;
      
          sendfile        on;
          #tcp_nopush     on;
      
          keepalive_timeout  65;
      
          #gzip  on;
      
          include /etc/nginx/conf.d/*.conf;
      }
    • default.conf

      [root@localhost ~]# vim /mnt/hgfs/www/lnmp/nginx/conf/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   http://127.0.0.1;
          #}
      
          # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
          #
          #location ~ \.php$ {
          #    root           html;
          #    fastcgi_pass   127.0.0.1:9000;
          #    fastcgi_index  index.php;
          #    fastcgi_param  SCRIPT_FILENAME  /scripts$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

    [root@192 ~]# docker run -d --name my-nginx \
    -p 80:80 \
    -v /mnt/hgfs/www/lnmp/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v /mnt/hgfs/www/lnmp/nginx/conf/conf.d:/etc/nginx/conf.d \
    -v /mnt/hgfs/www/lnmp/nginx/html:/usr/share/nginx/html \
    -v /mnt/hgfs/www/lnmp/nginx/logs:/var/log/nginx \
    --link my-php74-fpm:php \
    nginx:1.21
    • 启动报错(因为我的是虚拟机共享宿主机Mac目录所以会有这种问题):

      docker: Error response from daemon: error while creating mount source path '/mnt/hgfs/www/lnmp/nginx/html': chown /mnt/hgfs/www/lnmp/nginx/html: operation not permitted.
- 删除失败的容器
[root@192 ~]# docker rm -v nginx
- 重新赋予文件夹权限
[root@192 ~]# chattr -i /mnt/hgfs/www/lnmp/nginx/html
  • 新建NGINX默认欢迎页

    [root@192 ~]# echo "Hello World" > /mnt/hgfs/www/lnmp/nginx/html/index.html
    [root@192 ~]# curl 192.168.2.101
    Hello World

》NGINX关联PHP

  • 修改nginx的 default.conf 配置文件,使其支持解析php文件

    [root@localhost ~]# vim /mnt/hgfs/www/lnmp/nginx/conf/conf.d/default.conf
    # index这一行加个index.php
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
    }
    
    # 打开以下几行的注释
    location ~ \.php$ {
        fastcgi_pass   php:9000; # 这里的php关联上边的my-php74-fpm
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
        include        fastcgi_params;
    }
  • 测试php文件的解析

    [root@192 ~]# vim /mnt/hgfs/www/lnmp/nginx/html/index.php
    <?php
    phpinfo();
    
    [root@192 ~]# curl 192.168.2.101/index.php

》配置PHP连接数据库

  • 测试php连接数据库

    [root@192 ~]# vim /mnt/hgfs/www/lnmp/nginx/html/mysql.php
    <?php
    $link = mysqli_connect('192.168.145.57', 'root', 'root');
    if (!$link) {
     die('Could not connect: ' . mysqli_connect_error());
    }
    echo 'Connected successfully';
    mysqli_close($link);
    
    [root@192 ~]# curl 192.168.2.101/mysql.php
    • 连接报错:

      Fatal error:Call to undefined function mysqli_connect()...
- 默认PHP没安装连接数据库扩展,进入容器进行安装
[root@192 ~]# docker exec -it my-php74-fpm bash
root@07a0104892c2:/var/www/html# cd /usr/local/etc/php
root@07a0104892c2:/usr/local/etc/php# docker-php-ext-install mysqli
root@07a0104892c2:/usr/local/etc/php# docker-php-ext-install pdo pdo_mysql

# 安装完重启
[root@192 ~]# docker restart my-php74-fpm

备注

》为什么要安装yum-utils、device-mapper-persistent-data、lvm2?

  • 在新主机首次安装 Docker Engine-Community之前,需要设置Docker仓库,之后,您可以从仓库安装和更新 Docker。

设置仓库,需要安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

  • Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
  • LVM(Logical Volume Manager)逻辑卷管理。它是对磁盘分区进行管理的一种机制,建立在硬盘和分区之上的一个逻辑层,用来提高磁盘管理的灵活性。通过LVM可将若干个磁盘分区连接为一个整块的卷组(Volume Group),形成一个存储池。可以在卷组上随意创建逻辑卷(Logical Volumes),并进一步在逻辑卷上创建文件系统,与直接使用物理存储在管理上相比,提供了更好灵活性。
  • device-mapper-persistent-data 和 lvm2两者都是Device Mapper所需要的。

》什么是Docker Engine-Community?

  • Docker Engine - Community(docker-ce,Docker引擎社区版)
  • CE( Community Edition)是社区版,简单理解是免费使用,提供小企业与小的IT团队使用,希望从Docker开始,并尝试基于容器的应用程序部署。

EE(Docker Enterprise Edition)是企业版,收费。提供功能更强。适合大企业与打的IT团队。为企业开发和IT团队设计,他们在生产中构建、交付和运行业务关键应用程序

》什么是containerd?

  • containerd是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。containerd可以在宿主机中管理完整的容器生命周期,包括容器镜像的传输和存储、容器的执行和管理、存储和网络等。
  • containerd是从Docker中分离出来的一个项目,可以作为一个底层容器运行时,现在它成了Kubernete容器运行时更好的选择。
  • 不仅仅是Docker,还有很多云平台也支持containerd作为底层容器运行时。

》什么是container-selinux?

  • 顾名思义就是容器防火墙,老旧版本的docker使用的是docker-selinux,新版的都使用了container-selinux。反正想正常使用Docker就得装这个。

附录

》参考链接

基于Docker方式的LNMP环境搭建

Docker 部署lnmp

device mapper与device-mapper-persistent-data 和 lvm2

docker带ce和不带ce的区别

再见 Docker!5分钟转型 containerd

初识 Containerd

标签: Lnmp, Docker

添加新评论


手机号仅后台超管可见,普通注册用户以及网站前台全站不可见,请勿担心泄露风险!