• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

dnmp: docker-compose部署LNMP环境 Nginx(Openresty)、MySQL5.7、PHP7.2(5.6)、Redis5 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

dnmp

开源软件地址:

https://gitee.com/Tinywan/dnmp

开源软件介绍:

images

996.icuBuild status

:book: 目录

Docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

为什么使用Docker

  • 加速本地的开发和构建流程,容器可以在开发环境构建,然后轻松地提交到测试环境,并最终进入生产环境
  • 能够在让独立的服务或应用程序在不同的环境中得到相同的运行结果
  • 创建隔离的环境来进行测试
  • 高性能、超大规划的宿主机部署
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境

环境要求

快速使用

拉取代码 (gitee地址

$ git clone git@github.com:Tinywan/dnmp.git$ cd dnmp       

新建配置文件

$ cp env.example .env

开启容器服务

$ docker-compose up

守护进程 docker-compose up -d

单独重启容器服务

$ docker-compose up --no-deps -d nginx -- php74

如:在配置 docker-compose.yml中增加了nginx的端口号映射

结束

如何清理您的Docker数据

Docker不会对您的系统进行任何配置更改,但是它会占用大量的磁盘空间

1. 使用情况统计信息

$ docker system dfTYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE  Images          25        13        9.467GB   4.368GB (46%)Containers      13        8         235MB     19.47MB (8%) Local Volumes   14        2         6.45GB    5.869GB (90%)Build Cache     0         0         0B        0B

2. 定期修剪

为了安全地删除已停止的容器,未使用的网络和悬挂的图像,最好每隔一段时间运行以下命令

$ docker system pruneWARNING! This will remove:  - all stopped containers  - all networks not used by at least one container  - all dangling images  - all dangling build cacheAre you sure you want to continue? [y/N] yDeleted Containers:5096cc97946c148450214a4330e35a67035289ecacc2806e9f693a0d46ebe75e

3. 全面清理启动

可以使用单个命令擦除每个未使用的容器,图像,卷和网络

$ docker system prune -a --volumesWARNING! This will remove:  - all stopped containers  - all networks not used by at least one container  - all volumes not used by at least one container  - all images without at least one container associated to them  - all build cacheAre you sure you want to continue? [y/N] yDeleted Volumes:d8827bb292a529057fc972acb982a6f13b6608ed10132b9e9a689959cafec30e...Deleted Images:untagged: dnmp_php72:latestdeleted: sha256:1b29834e4f9054d78a0d5e91e114e40b865ad8ddce06a3c7ba3703f9911775e6Total reclaimed space: 12.71GB

4. 使用情况

docker-data-clear.png

How to clean your Docker data

项目结构

  dnmp  ├── docker-compose.yml      -- 基础配置文件  ├── env.example             -- 环境配置文件,拷贝 env.example  .env  ├── services                -- 服务目录  │   ├── php  │   │   └── extensions      -- 扩展目录  │   │   └── Dockerfile      -- 镜像构建文件  │   ├── nacos  │   │   └── conf            -- 配置文件目录  │   │   └── env             -- 环境变量目录  │   │   └── Dockerfile      -- 镜像构建文件(构建比较耗时,不推荐)  ├── conf  │   ├── nginx.conf          -- Nginx 主配置文件  │   ├── conf.d  │   │   └── 80.conf         -- HTTP 80 虚拟主机扩展配置文件  │   │   └── 443.conf        -- HTTPS 虚拟主机扩展配置文件  │   │   └── lua.conf        -- Lua 配置虚拟主机扩展配置文件  │   ├── letsencrypt         -- Nginx 证书目录  │   ├── mysql     │   └── my.cnf          -- MySQL 配置文件  │   ├── etcd     │   └── etcd.conf.yml   -- Etcd 配置文件  │   ├── redis     │   └── redis.conf      -- Redis 配置文件  │   ├── php     │   ├── php.ini         -- PHP 运行核心配置文件     │   ├── php-fpm.conf    -- PHP-FPM 进程服务的配置文件     │   └── php-fpm.d     │        └── www.conf   -- PHP-FPM 扩展配置文件  │   └──lua                  -- Lua 脚本目录  │        └── bin  │            └── limit.lua -- 核心库脚本  │        └── test  │             └── http.lua  -- 测试脚本  ├── data                    -- 数据目录  │   ├── redis  │   │   ├── appendonly.aof  -- AOF 数据库保存文件  │   │   ├── dump.rdb        -- RDB 数据库保存文件  │   │   └── redis.log       -- Redis 日志文件  │   └── mysql               -- MySQL 数据目录  ├── log     ├── nginx               -- Nginx 系统错误日志     │   ├── access.log     │   └── error.log     └──redis                -- Redis错误日志     └──nacos                -- Nacos错误日志     └──php                  -- PHP错误日志  └── www                     -- 项目代码目录      └── site                -- 具体项目目录         └──index.php

Nginx管理

  • 配置文件端口必须和 docker-compose.ymlports - 8088:80中的映射出来的端口一一对应

    列如:conf/conf.d/www.conf中配置端口为 80,则映射端口也80,对应的映射端口为:8088:80

  • 重新加载配置文件 docker exec -it dnmp-nginx nginx -s reload

    或者 docker exec dnmp-nginx nginx -s reload

  • 在容器内执行 shell 命令:docker exec -it dnmp-nginx sh -c "ps -aef | grep nginx | grep -v grep | grep master |awk '{print $2}'"

  • Nginx 日志定时备份和删除

  • 容器时间跟宿主机时间不一致

    • 原因:宿主机采用了 CST 时区。容器采用了 UTC 时区。
    • 复制主机的localtimedocker cp /etc/localtime lnmp-nginx:/etc/
    • 重启容器:docker restart lnmp-nginx

MySQL管理

  • 进入容器:docker exec -it dnmp-mysql /bin/bash

    Windows 环境使用:docker exec -it dnmp-mysql bash

  • 修改配置文件 my.cnf,重新加载:docker-compose restart mysql

  • 容器内连接:mysql -uroot -p123456

  • 外部宿主机连接:mysql -h 127.0.0.1 -P 3308 -uroot -p123456

  • 数据-备份-恢复

    • 导出(备份)

      • 导出数据库中的所有表结构和数据:docker exec -it dnmp-mysql mysqldump -uroot -p123456 test > test.sql
      • 只导结构不导数据:docker exec -it dnmp-mysql mysqldump --opt -d -uroot -p123456 test > test.sql
      • 只导数据不导结构:docker exec -it dnmp-mysql mysqldump -t -uroot -p123456 test > test.sql
      • 导出特定表的结构:docker exec -it dnmp-mysql mysqldump -t -uroot -p123456 --table user > user.sql
    • 导入(恢复)docker exec -i dnmp-mysql -uroot -p123456 test < /home/www/test.sql

      如果导入不成功,检查 sql 文件头部:mysqldump: [Warning] Using a password on the command line interface can be insecure.是否存在该内容,有则删除即可

  • MySQL 备份小脚本

    Crontab 任务:55 23 * * * bash /backup/mysql_auto_backup.sh >/dev/null 2>&1
    注意:crontab 定时执行 Docker 任务的时候是不需要添加参数 -it-t是分配一个伪终端,但是 crontab 执行的时候实际是不需要的。

  • 项目配置文件建议:

    • root 默认不开开启远程访问
    • 新建项目用户 www,配置主机Host字段值为 MySQL 容器 ip 段172.18.0.%
    • 查看容器 IP address:docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dnmp-mysql

PHP管理

  • docker安装PHP扩展常用命令

    • docker-php-source

      此命令,实际上就是在PHP容器中创建一个/usr/src/php的目录,里面放了一些自带的文件而已。我们就把它当作一个从互联网中下载下来的PHP扩展源码的存放目录即可。事实上,所有PHP扩展源码扩展存放的路径: /usr/src/php/ext 里面。

    • docker-php-ext-install

      这个命令,就是用来启动 PHP扩展 的。我们使用pecl安装PHP扩展的时候,默认是没有启动这个扩展的,如果想要使用这个扩展必须要在php.ini这个配置文件中去配置一下才能使用这个PHP扩展。而 docker-php-ext-enable 这个命令则是自动给我们来启动PHP扩展的,不需要你去php.ini这个配置文件中去配置。

    • docker-php-ext-enable

      这个命令,是用来安装并启动PHP扩展的。命令格:docker-php-ext-install “源码包目录名”

    • docker-php-ext-configure

      一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到。

    • Docker php安装扩展步骤

  • 进入 php 容器 docker exec -it dnmp-php /bin/bash

    如果提示:bash: export: [/bin/bash,': not a valid identifier。删除配置文件vim ~/.bashrc末尾部分:[/bin/bash, -c, source ~/.bashrc]

  • 重启 php 服务 docker-compose restart php

    修改核心配置文件 php.ini,可使用该命令重新加载配置文件。
    修改扩展配置文件 www.conf,可使用该命令重新加载配置文件。

  • 服务管理

    • 配置测试:docker exec -it dnmp-php bash -c "/usr/local/php/sbin/php-fpm -t"
    • 启动:docker exec -it dnmp-php bash -c "/usr/local/php/sbin/php-fpm"
    • 关闭:docker exec -it dnmp-php bash -c "kill -INT 1"
    • 重启:docker exec -it dnmp-php bash -c "kill -USR2 1"
    • 查看 php-fpm 进程数:docker exec -it dnmp-php bash -c "ps aux | grep -c php-fpm"
    • 查看 PHP 版本:docker exec -it dnmp-php bash -c "/usr/local/php/bin/php -v"
  • 编译安装扩展

    • 1、下载:cd /opt && git clone https://github.com/php/pecl-encryption-mcrypt.git
    • 2、生成配置文件:/usr/local/php/bin/phpize --with-php-config=/usr/local/php/bin/php-config
    • 3、检测配置文件:./configure --with-php-config=/usr/local/php/bin/php-config
    • 4、编译:make -j2
    • 5、安装:make install
    • 6、修改php.ini配置文件:vim /usr/local/php/etc/php.ini
    • 7、重启php-fpmkill -USR2 1
  • 服务器开机自动启 PHP 容器,Ubuntu 18.04 rc.local systemd 设置

    #!/bin/sh -e# docker-compose php container/usr/local/bin/docker-compose -f /home/www/dnmp/docker-compose.yml up -d# docker tab cron startsleep 10; docker exec lnmp-php bash -c "/etc/init.d/cron start"exit 0

    编辑文件vim /etc/rc.local,添加以上内容以上主要是解决服务器重启后,PHP 容器不能够重启以及 PHP 容器之内的 Crontab 服务不能够启动的的问题,目前没有其他解决方案

Redis管理

  • 连接 Redis 容器:docker exec -it dnmp-redis redis-cli -h 127.0.0.1 -p 63789
  • 通过容器连接:docker exec -it dnmp-redis redis-cli -h dnmp-redis -p 63789
  • 单独重启 redis 服务 docker-compose up --no-deps -d redis
  • 外部宿主机连接:redis-cli -h 127.0.0.1 -p 63789

Composer管理

使用Docker安装

Linux环境

进入项目目录,执行以下命令安装

docker run --rm --interactive --tty --volume $PWD:/app --user $(id -u):$(id -g) composer install --ignore-platform-reqs

--ignore-platform-reqs 参数表示官方 docker composer 库没有包含当前 PHP 版本

Windows环境

安装一个新的 composer 包

E:\dnmp> docker run --rm --interactive --tty -v e:/dnmp/www/thinkphp_3.2:/app  composer require tinywan/load-balancing --ignore-platform-reqs

tinywan/load-balancing 为需要安装的包名

执行执行项目的绝对路径

E:\dnmp> docker run --rm --interactive --tty -v e:/dnmp/www/tp6:/app  composer install --ignore-platform-reqs

tp6 为项目目录

容器内

  • 需要进入dnmp-php容器: docker exec -it dnmp-php /bin/bash

  • 查看 composer版本:composer --version

  • 修改 composer 的全局配置文件(推荐方式)

    composer config -g repo.packagist composer https://packagist.phpcomposer.com// 或者composer config -g repo.packagist composer https://packagist.laravel-china.org

    如果你是墙内客户,务必添加以上国内镜像。否则会出现file could not be downloaded (HTTP/1.1 404 Not Found)

  • 更新框架或者扩展

    /var/www/tp5.1# apt update/var/www/tp5.1# apt install sudo/var/www/tp5.1# sudo -u www-data sh -c "/usr/local/php/bin/php /usr/local/bin/composer install"

    请使用www-data 更新安装包,而不是默认直接使用root账户,尽量使用composer install 更新安装包,而不是composer update

宿主机

建议在主机 HOST 中使用 composer,避免 PHP 容器变得庞大,Docker Official Images

宿主机直接使用命令:docker exec dnmp-php bash -c "cd /var/www/p2p_wallet; /usr/local/php/bin/php /usr/local/sbin/composer update"

  • 1、在主机创建一个目录,用以保存 composer 的配置和缓存文件

    mkdir ~/dnmp/composer
  • 2、打开主机的 ~/.bashrc 或者 ~/.zshrc 文件,加上

    composer () {    tty=    tty -s && tty=--tty    docker run \        $tty \        --interactive \        --rm \        --user $(id -u):$(id -g) \        --volume ~/dnmp/composer:/tmp \        --volume /etc/passwd:/etc/passwd:ro \        --volume /etc/group:/etc/group:ro \        --volume $(pwd):/app \        composer "$@"}
  • 3、让文件起效

    source ~/.bashrc
  • 4、在主机的任何目录下就能用composer

    cd ~/dnmp/www/composer create-project topthink/think tp5.2composer update topthink/framework

    第一次执行提示:Unable to find image 'composer:latest' locally,不要慌,稍等片刻

Crontab管理

执行方案

  • 1、使用主机的 cron 实现定时任务(推荐)
  • 2、创建一个新容器专门执行定时任务,crontab for docker
  • 3、在原有容器上安装 cron,里面运行 2 个进程

宿主机执行任务(推荐)

# 2019年2月14日 @add Tinywan 获取图表数据 每3分钟执行一次*/30 * * * * docker exec dnmp-php echo " Hi Lnmp " >> /var/www/crontab.log

dnmp-php 为容器名称

容器内执行任务

  • 需要进入dnmp-php容器: docker exec -it dnmp-php /bin/bash
  • 手动启动 crontab,/etc/init.d/cron start
  • 添加 Crontab 任务 crontab -e
  • 添加任务输出日志到映射目录:* * * * * echo " Hi dnmp " >> /var/www/crontab.log
  • 定时执行 ThinkPHP5 自带命令行命令:*/30 * * * * /usr/local/php/bin/php /var/www/tp5.1/think jobs hello

配置任务调度器 scheduler

将下面内容添加到 crontab 计划任务中:

* * * * * /usr/local/bin/php /var/www/www.tinywan.com/scheduler.php 1>> /dev/null 2>&1

默认crontab 服务是没有启动的。需要启动Crontab 任务 /var/www # crond start

images

WebSocket管理

在项目中难免会用到 workerman

  • 进入dnmp-php容器:docker exec -it dnmp-php /bin/bash

  • 以 daemon(守护进程)方式启动 workerman :php ../workerman/start.php start -d

  • 宿主机平滑重启 workerman :docker exec -it dnmp-php bash -c "/usr/local/php/bin/php /var/www/site/think worker:gateway reload"

  • 配置docker-compose.yml 文件中对应的映射端口

    php:    ports:        - "9000:9000"        - "9502:9502" # workerman 映射端口        - "1239:1239" # Gateway 客户端
  • 防火墙问题,如果使用阿里云 ESC,请在安全组增加入方向出方向端口配置

    协议类型:自定义 TCP端口范围:9502/9502授权对象:0.0.0.0/0
  • 宿主机可以查看对应端口号是否已经映射成功

    ps -aux|grep 9502WorkerMan: worker process  AppGateway websocket://0.0.0.0:9502
  • 通过telnet命令检测远程端口是否打开

    telnet 127.0.0.1 9502Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.

    出现Connected表示连通了

  • 通过 Console 测试是否支持外网访问

    var ws = new WebSocket('ws://宿主机公网ip:9502/');ws.onmessage = function(event) {    console.log('MESSAGE: ' + event.data);};ƒ (event) {    console.log('MESSAGE: ' + event.data);}MESSAGE: {"type":"docker","text":"Hi Tinywan"< 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap