docker学习——docker-compose 搭建lnmp环境

本文尝试使用三种方式搭建docker lnmp环境,再使用laravel进行测试
第一步: 尝试多容器搭建lnmp环境
第二步: 通过docker-compose编排搭建lnmp环境
第三步: 编写dockerfile 结合docker-compose
第四步: 运行laravel框架测试lnmp环境

第一步:多容器搭建lnmp环境

1. 安装 nginx 镜像
1.1 创建lnmp的网络
docker network create --driver=bridge --subnet=192.168.0.0/16 mynginx
1.2 准备nginx.conf 和 default.conf文件
在测试 /home/nginx/ 目录下准备nginx.conf文件,内容如下:

#创建进程的用户和用户组,多个时用空格隔开
#user  nobody;
#服务进程数量,一般等于 CPU 数量
worker_processes  1;

#全局错误日志定义,建议开启error级别日志.[ debug | info | notice | warn | error | crit ]
error_log  /var/log/nginx/error.log notice;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#记录进程 ID 的文件
pid        /var/run/nginx.pid;
events {
	#一个 worker_processe 允许的最大并发连接数量
    worker_connections  1024;
}

http {
    include       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  0;
    #http连接的持续时间
    keepalive_timeout  65;

	#gzip压缩设置,开启或关闭
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

===============================================================================

在测试 /home/nginx/conf.d 目录下准备default.conf文件,内容如下:

server{
      listen 80;
      location / {
        root /usr/share/nginx/html;
        index  index.html index.htm index.php;
      }
      location ~ \.php$ {
        root /var/www;
        fastcgi_pass 192.168.0.3:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
      }
}
1.3 启动 nginx 容器 并 指定mynginx网络 :

nginx官方镜像
/usr/share/nginx/html 为默认的存放网页文件目录
/etc/nginx/conf.d/ 为默认的vhost配置文件目录

docker run --name nginx -d --rm \
-v /home/nginx/www:/usr/share/nginx/html \
-v /home/nginx/default.conf:/etc/nginx/conf.d/default.conf \
--network mynginx -p 8010:80 nginx

启动成功:
在这里插入图片描述

1.4 宿主机 /home/nginx/www 目录下编写测试index.html 文件
浏览器访问:宿主机IP地址:8010	

在这里插入图片描述

2. 安装 php-fpm 镜像
2.1 启动 php-fpm 容器并指定mynginx网络与指定容器IP:

php-fpm官方镜像
/var/www 为默认的php文件存放目录;此处通过 -v 参数将其挂载到与nginx镜像同一个目录

docker run --name fpm -d --rm \
-v /home/nginx/www:/var/www \
--network mynginx --ip 192.168.0.3 \
php:7.3-fpm
3. 安装 mysql 镜像
1.1 启动 mysql容器 并 指定mynginx网络 :

mysql官方镜像
/var/lib/mysql 为默认的数据库数据文件存放目录;此处通过 -v 参数将其挂载到宿主机目录/home/nginx/db/data

docker run --name mysql -d --rm \
-e MYSQL_ROOT_PASSWORD=root \
-v /home/nginx/db/data:/var/lib/mysql \
--ip 192.168.0.4 \
--network mynginx -p 33061:3306 mysql:5.7

navicat测试连接:宿主机IP地址;33061端口; 账户root;密码root
在这里插入图片描述
navicat新建数据库后可看到挂载文件夹同样生成了数据库文件
在这里插入图片描述

4. 测试
4.1 宿主机 /home/nginx/www 目录下编写测试phpinfo.php 文件
<?php
 phpinfo();
4.2 访问phpinfo
宿主机IP地址:8010/phpinfo.php

在这里插入图片描述

4.3 php连接mysql测试

编写mysqltest.php:

<?php
	$link = mysqli_connect('192.168.0.4', 'root', 'root');
	if (!$link) {
		die('Could not connect: ' . mysqli_error());
	}
	echo 'Connected successfully';
	mysqli_close($link);
?>

因为官方php:7.3-fpm镜像未安装mysqli插件 所以这一步测试需要自己安装

# 容器内安装插件
docker exec -it fpm docker-php-ext-install mysqli
docker exec -it fpm docker-php-ext-enable mysqli
# 查看mysqli插件是否安装成功
docker exec -it fpm php -m 
# 重启docker 让mysqli插件生效
docker restart nginx
docker restart fpm

访问测试:宿主机IP地址:8010/mysqltest.php
在这里插入图片描述

第二步:使用 docker-compose 编排

编排前先清理docker环境

  • 删除第一步成功运行的容器*
    在这里插入图片描述
  • 删除第一步创建的容器和网络
   docker rm -f fpm nginx mysql
   docker network rm mynginx
   # 删除上一步挂载的数据库文件夹
   cd /home/nginx/db
   rm -rf data
1. 创建新文件 docker-compose.yml,编排使用上述镜像

nginx挂载的配置文件:nginx.conf,default.conf需要事先准备

version: "2"
services:
  fpm:
    image: php:7.3-fpm
    container_name: fpm
    volumes:
      - /home/nginx/www:/var/www
    networks:
      mynginx:
        # 网络段使用192.168  主机段指定0.3
        ipv4_address: 192.168.0.3
  nginx:
    image: nginx
    container_name: nginx
    # 挂载宿主机端口8020
    ports:
      - "8020:80"
    volumes:
      # 挂载nginx目录
      - /home/nginx/www:/usr/share/nginx/html/
      # 挂载nginx日志
      - /home/nginx/log:/var/log/nginx/
      # 挂载nginx配置文件
      - /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      # 挂载虚拟主机配置文件
      - /home/nginx/conf/conf.d/:/etc/nginx/conf.d/
    networks:
      mynginx:
       # 网络段使用192.168  主机段指定0.2
        ipv4_address: 192.168.0.2
  mysql:
    image: mysql:5.7
    container_name: mysql
    # 暴露端口33061
    ports:
      - "33061:3306"
    # 数据库数据挂载
    volumes:
      - /home/nginx/db/data:/var/lib/mysql
    environment:
       # 创建默认homestead数据库
       - "MYSQL_DATABASE=homestead"  
       # 创建用户homestead
       - "MYSQL_USER=homestead"
       # 设置homestead用户密码
       - "MYSQL_PASSWORD=secret"
       # 设置root用户密码
       - "MYSQL_ROOT_PASSWORD=root"
    networks:
      mynginx:
       # 网络段使用192.168  主机段指定0.4
       ipv4_address: 192.168.0.4
# 同样创建mynginx网络 
networks:
  mynginx:
    driver: bridge
    ipam:
       driver: default
       # 子网掩码为 192.168.0.0/16
       # 网关为 192.168.0.1
       config:
        - subnet: 192.168.0.0/16
          gateway: 192.168.0.1
2. 启动服务
docker-compose up 

在这里插入图片描述

3. 访问测试
宿主机IP地址:8020/phpinfo.php

在这里插入图片描述

第三步: 编写dockerfile 结合docker-compose

编译dockerfile,生成自己的php-fpm镜像

1.1 php-fpm.dockerfile
FROM php:7.3-fpm

#设置容器时区
ENV TZ Asia/Shanghai

#添加阿里云的镜像源
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone \
       && mv /etc/apt/sources.list /etc/apt/sources.list.bak \
       && echo "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib" >/etc/apt/sources.list \
       && echo "deb http://mirrors.aliyun.com/debian-security stretch/updates main" >>/etc/apt/sources.list \
       && echo "deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib" >>/etc/apt/sources.list \
       && echo "deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" >>/etc/apt/sources.list 

# Install PHP needed extensions
# Here you can install any other extension that you need during the test and deployment process
RUN docker-php-ext-install \
    pdo_mysql \
    mysqli \
    pcntl \
    opcache \
    bcmath 

# Some extensions are not provided with the PHP source,but are instead available through PECL.
# To install a PECL extension, use pecl install to download and compile it, then use docker-php-ext-enable
RUN pecl install redis-5.1.1 \
    && docker-php-ext-enable redis 

#删除包缓存中的所有包
RUN apt-get clean \
    && apt-get autoclean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

CMD php-fpm

编译dockerfile,生成自己的php-fpm镜像

docker build -t kevin-fpm -f php-fpm.dockerfile .

在这里插入图片描述
编译成功后查看镜像
在这里插入图片描述

1.2 将生成的kevin-fpm推送远程docker hub仓库

tag 镜像 —— kevin-fpm为源镜像名称 ;
zhuqianqq/kevin-fpm:v0.1 为远程hub仓库名/镜像名:版本信息

docker tag kevin-fpm zhuqianqq/kevin-fpm:v0.1

在这里插入图片描述
推送远程仓库
备:若宿主机未登录远程仓库请先操作docker login命名

 docker push zhuqianqq/kevin-fpm:v0.1

在这里插入图片描述

1.3 编写dockerfile 结合docker-compose
version: "2"
services:
  fpm:
   #拉取远程仓库中的镜像
    image: zhuqianqq/kevin-fpm:v0.1
    container_name: kevin-fpm
    volumes:
      - /home/nginx/www:/var/www
  nginx:
    image: nginx
    container_name: kevin-nginx
    # 挂载宿主机端口8030
    ports:
      - "8030:80"
    volumes:
      # 挂载nginx目录
      - /home/nginx/www:/usr/share/nginx/html/
      # 挂载nginx日志
      - /home/nginx/log:/var/log/nginx/
      # 挂载nginx配置文件
      - /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      # 挂载虚拟主机配置文件
      - /home/nginx/conf/conf.d/:/etc/nginx/conf.d/
  mysql:
    image: mysql:5.7
    container_name: kevin-mysql
    # 暴露端口33062
    ports:
      - "33062:3306"
    # 数据库数据挂载
    volumes:
      - /home/nginx/db/data2:/var/lib/mysql
    environment:
       # 创建默认homestead数据库
       - "MYSQL_DATABASE=homestead"  
       # 创建用户homestead
       - "MYSQL_USER=homestead"
       # 设置homestead用户密码
       - "MYSQL_PASSWORD=secret"
       # 设置root用户密码
       - "MYSQL_ROOT_PASSWORD=root"
  redis:
        # 指定镜像
        image: redis:5
        container_name: kevin-redis
        ports:
        # 端口映射
            - 63791:6379
        volumes:
        # 目录映射
            - /home/redis5/conf:/usr/local/etc/redis
            - /home/redis5/data:/data
        environment:
            - TZ=Asia/Shanghai # 设置时区
       
# 运行docker-compose服务 -f 指定yml文件 -p 指定服务名称
docker-compose -f docker-compose.yml -p kevin-lnmp up

上述docker-compose编排的服务可以不定义网络信息,直接使用容器名当ip来访问。修改default02.conf如下图所示:
在这里插入图片描述

1.4 访问测试

宿主机IP地址:8030/phpinfo.php;其中直接的扩展redis已成功安装
在这里插入图片描述

第四步:运行laravel框架测试lnmp环境

测试前请确保宿主机已安装了php的composer环境

1.1 下载laravel代码
composer create-project --prefer-dist laravel/laravel 项目名 "5.5.*"

在这里插入图片描述

1.2 访问测试

宿主机IP地址:8030/laraveltest/public/index.php;
在这里插入图片描述

若访问出现权限问题:将kevin-fpm容器挂载/var/www目录所属组与所有者修改为www-data:www-data(www-data为php-fpm的所属组与所有者)

docker exec -it kevin-fpm chown -R www-data:www-data /var/www
1.3 访问测试(重写default02.conf)

访问:宿主机IP地址:8030/laraveltest/public/index.php 的url地址太长,重写nginx 虚拟主机配置;


server{
      listen 80;
      # 修改网站根目录
      root /var/www/laraveltest/public;
	  # laravel重写规则
      location / {
            try_files $uri /index.php?$args;
      }

      location ~ \.php$ {
          fastcgi_pass   kevin-fpm:9000;
          fastcgi_index  index.php;
          fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
          fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
          fastcgi_param  PATH_INFO  $fastcgi_path_info;
          fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
          include        fastcgi_params;
      }
}

测试:
在这里插入图片描述

1.4 访问测试(mysql数据库连接测试)
cd /home/nginx/www/laraveltest
# 修改.env文件
vi .env

在这里插入图片描述

# 创建测试控制器
php artisan make:controller TestController
cd /home/nginx/www/laraveltest/routes
# 增加测试数据库路由与redis路由
vi web.php

在这里插入图片描述

# 编写TestController连接数据库与redis方法
cd /home/nginx/www/laraveltest/app/Http/Controllers
vi TestController.php

在这里插入图片描述

测试:宿主机IP:8030/dbtest
在这里插入图片描述

1.5 访问测试(redis连接测试)
# laraveltest框架安装redis扩展包
cd /home/nginx/www/laraveltest
composer require predis/predis ^1.1

测试:宿主机IP:8030/redistest
在这里插入图片描述

完成整体试验!!

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值