DNMP(Docker + Nginx + MySQL8 + PHP8 + Redis + ElasticSearch),一款简易的LNMP一键安装程序,支持Arm CPU。
dnmp
├── docker-compose.yml -- 基础配置文件
├── .env.example -- 环境配置文件,拷贝 .env.example 为 .env
├── services -- 服务目录
│ ├── php
│ │ └── conf -- 配置文件
│ │ └── extensions -- 扩展目录
│ │ └── Dockerfile -- 镜像构建文件
│ └── ...
├── data -- 数据目录
│ ├── redis
│ │ ├── appendonly.aof -- AOF 数据库保存文件
│ │ ├── dump.rdb -- RDB 数据库保存文件
│ │ └── redis.log -- Redis 日志文件
│ ├── mysql -- MySQL 数据目录
│ └── ...
├── log
├ ├── nginx -- Nginx 系统错误日志
│ │ ├── access.log
│ │ └── error.log
│ └──redis -- Redis错误日志
│ └──php -- PHP错误日志
└── www -- 项目代码目录
└── site -- 具体项目目录
└──index.php
拉取代码 国内Gitee地址
git clone git@github.com:fieos/dnmp.git
cd dnmp
新建配置文件
cp env.example .env
开启容器服务,并以守护进程执行
docker-compose up -d
-d 表示以守护进程在后台执行 重新构建服务,并以守护进程执行
docker-compose up --build -d
单独重启容器服务
docker-compose up --no-deps -d nginx -- php
如:在配置
docker-compose.yml
中增加了nginx的端口号映射
站点管理目录为services/nginx/sites-available,在当前目录创建conf文件,并指向项目目录
列如:
services/nginx/sites-available/localhost.conf
配置文件端口必须和 docker-compose.yml
的ports - 8088:80
中的映射出来的端口一一对应
列如:
conf/conf.d/www.conf
中配置端口为80
,则映射端口也80
,对应的映射端口为:8088:80
重新加载配置文件 docker exec -it nginx nginx -s reload
或者
docker exec dnmp-nginx nginx -s reload
容器默认时区为UTC时间,需要设置其他时区,
修改.env文件,设置Timezone参数为Asia/Shanghai 重新构建docker容器
docker up --build
进入容器:docker exec -it mysql /bin/bash
Windows 环境使用:
docker exec -it mysql bash
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搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到。
进入 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"
docker exec -it dnmp-php bash -c "ps aux | grep -c php-fpm"
docker exec -it dnmp-php bash -c "/usr/local/php/bin/php -v"
编译安装扩展
cd /opt && git clone https://github.com/php/pecl-encryption-mcrypt.git
/usr/local/php/bin/phpize --with-php-config=/usr/local/php/bin/php-config
./configure --with-php-config=/usr/local/php/bin/php-config
make -j2
make install
php.ini
配置文件:vim /usr/local/php/etc/php.ini
php-fpm
:kill -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 start
sleep 10; docker exec lnmp-php bash -c "/etc/init.d/cron start"
exit 0
编辑文件
vim /etc/rc.local
,添加以上内容 以上主要是解决服务器重启后,PHP 容器不能够重启以及 PHP 容器之内的 Crontab 服务不能够启动的的问题,目前没有其他解决方案
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
docker-compose up --no-deps -d redis
redis-cli -h 127.0.0.1 -p 63789
查看容器网络
$ docker network ls
连接容器到用户自定义网桥
$ docker run -itd --name dnmp_yearning --network dnmp_backend -p 8000:8000 -e MYSQL_ADDR=dnmp-mysql:3306 zhangsean/yearning
重新单独构建镜像
$ docker-compose build # 重建全部服务
$ docker-compose build php74 # 重建单个服务
进入 Docker 容器
$ docker exec -it dnmp-php bash
$ winpty docker exec -it dnmp-php bash
关闭容器并删除服务docker-compose down
单独重启 redis 服务 docker-compose up --no-deps -d redis
如果用户只想重新部署某个服务,可以使用
docker-compose up --no-deps -d <SERVICE_NAME>
来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
单独加载配置文件,列如修改了 nginx 配置文件www.conf
中的内容,如何即使生效,请使用以下命令重启容器内的 Nginx 配置文件生效:
docker exec -it lnmp-nginx nginx -s reload
lnmp-nginx
为容器名称(NAMES
),也可以指定容器的 ID 。nginx
为服务名称(docker-compose.yml
)
修改docker-compose.yml
文件之后,如何使修改的docker-compose.yml
生效?
docker-compose up --no-deps -d nginx
以上表示只是修改了
docker-compose.yml
中关于 Nginx 相关服务器的配置
容器资源使用情况
docker stats
docker stats dnmp-nginx dnmp-php dnmp-mysql dnmp-redis
docker stats --all --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" dnmp-nginx dnmp-php
docker-compose 常用命令
启动docker-compose.yml
定义的所有服务:docker-compose up
重启docker-compose.yml
中定义的所有服务:docker-compose restart
停止docker-compose.yml
中定义的所有服务(当前目录配置):docker-compose stop
停止现有 docker-compose 中的容器:docker-compose down
(重要)
如果你修改了
docker-compose.yml
文件中的内容,请使用该命令,否则配置文件不会生效
例如:Nginx 或者 MySQL 配置文件的端口
重新拉取镜像:docker-compose pull
后台启动 docker-compose 中的容器:docker-compose up -d
查看容器详细信息
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $INSTANCE_ID
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $INSTANCE_ID
docker inspect --format='{{.LogPath}}' $INSTANCE_ID
docker inspect --format='{{.Config.Image}}' $INSTANCE_ID
Docker镜像的导入导出,用于迁移、备份、升级等场景。涉及的命令有export、import、save、load
docker save -o composer-1.10.16.tar composer:1.10.16
注:composer:1.10.16 是本地已经存在的镜像。完成后会在本地生成一个
composer-1.10.16.tar
压缩包文件
导入之前先删除本地已经有的镜像
$ docker rmi composer:1.10.16
Untagged: composer:1.10.16
Untagged: composer@sha256:b78ead723780b67237069394745f85284cd153ab6176b85f4be65b02db484224
Deleted: sha256:eb14965007ad5c4427d4a3d9747b221a9ff9a2592e114db26280f434658f3dc8
开始导入镜像
$ docker load -i composer-1.10.16.tar
ace0eda3e3be: Loading layer [==================================================>] 5.843MB/5.843MB
4f34707acc6f: Loading layer [==================================================>] 3.025MB/3.025MB
c84148fa85b6: Loading layer [==================================================>] 11.78kB/11.78kB
ea7d729a7e1b: Loading layer [==================================================>] 5.12kB/5.12kB
84dc4b3d5140: Loading layer [==================================================>] 10.37MB/10.37MB
f2721b9bd68e: Loading layer [==================================================>] 4.096kB/4.096kB
8757a2dd4b44: Loading layer [==================================================>] 63.18MB/63.18MB
1a7224379637: Loading layer [==================================================>] 12.29kB/12.29kB
de8d4e13caf2: Loading layer [==================================================>] 60.42kB/60.42kB
cd74717e6911: Loading layer [==================================================>] 94.64MB/94.64MB
58d1af8009b9: Loading layer [==================================================>] 510kB/510kB
209722ef17f3: Loading layer [==================================================>] 4.096kB/4.096kB
8ae1fee25a6c: Loading layer [==================================================>] 2.005MB/2.005MB
644ab4ff51a2: Loading layer [==================================================>] 2.56kB/2.56kB
b56d854a67b1: Loading layer [==================================================>] 1.536kB/1.536kB
Loaded image: composer:1.10.16
使用命令docker images
查看已经导入镜像
注意:
export
和import
导出的是一个容器的快照, 不是镜像本身, 也就是说没有 layer。你的 dockerfile 里的 workdir, entrypoint 之类的所有东西都会丢失,commit 过的话也会丢失。快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。
区别和联系
生成本地 HTTPS 加密证书的工具 mkcert,一个命令就可以生成证书,不需要任何配置。
本地本地C:\Windows\System32\drivers\etc\hosts
文件,添加以下内容
127.0.0.1 dnmp.com
127.0.0.1 www.dnmp.org
127.0.0.1 www.dnmp.cn
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。