同步操作将从 开源技术小栈/dnmp 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
dnmp
├── v1 -- Nginx + PHHP-FPM
├── v2 -- Nginx + PHP7.2.3 + PHPRedis4.0
├── v3 -- Nginx + PHP7.2.3 + PHPRedis4.0 + MySQL5.7 + Reids3.2
├── v4 -- Nginx + PHP7.2.3 + PHPRedis4.0 + MySQL5.7 + Reids5.0
├── v5 -- Nginx + PHP7.2.3 + PHPRedis4.0 + MySQL5.7 + Reids5.0 + HTTPS
├── v6 -- Nginx + PHP7.2.3-v1 + PHPRedis4.0 + MySQL5.7 + Reids5.0 + HTTPS + Crontab
├── v7 -- Nginx + PHP7.2.3-v1 + PHPRedis4.0 + MySQL5.7 + Reids5.0 + HTTPS + Crontab + Websocket
└── v8 -- Nginx + PHP7.2.3-v1 + PHPRedis4.0 + MySQL5.7 + Reids5.0 + HTTPS + Crontab + Websocket + phpmyadmin
dnmp
└── dnmp
├── conf -- Nginx 配置目录
│ ├── conf.d
│ │ └── www.conf -- Nginx 扩展配置文件
│ ├── fastcgi.conf
│ ├── fastcgi_params
│ ├── mime.types
│ └── nginx.conf -- Nginx 主配置文件
├── docker-compose.yml -- 基础配置文件
├── docker-compose.override.yml -- 开发环境配置文件,默认加载
├── docker-compose.prod.yml -- 生产环境配置文件,-f 指定加载
├── env.sample -- 环境配置文件,拷贝 env.sample 为 .env
├── etc -- 公共配置目录
│ ├── letsencrypt -- Nginx 证书目录
│ │ ├── ssl.crt
│ │ └── ssl.key
│ ├── php-fpm.conf -- PHP-FPM 进程服务的配置文件
│ ├── php-fpm.d
│ │ └── www.conf -- PHP-FPM 扩展配置文件
│ ├── redis
│ │ ├── data
│ │ │ ├── appendonly.aof -- Redis AOF 数据库保存文件
│ │ │ └── redis.log -- Redis 日志文件
│ │ └── redis.conf -- Redis 配置文件
│ ├── mysql
│ │ └── data -- MySQL 数据存储目录
│ │ └── my.cnf -- MySQL 配置文件
│ └── php.ini -- PHP 运行核心配置文件
├── log -- Nginx 日志目录
│ ├── tp5_access.log
│ ├── tp5_error.log -- 项目错误日志
│ ├── access.log
│ └── error.log -- Nginx 系统错误日志
└── www -- 项目代码目录
└── site -- 具体项目目录
├── application
└── public
└──index.php -- 项目框架入口文件
https://oimy1q5h.mirror.aliyuncs.com
拉取项目:git clone https://github.com/Tinywan/dnmp.git
进入目录:cd dnmp/dnmp
启动所有容器(守护进程)
$ docker-compose up -d
Starting dnmp-redis ... done
Starting dnmp-mysql ... done
Starting dnmp-php ... done
Starting dnmp-nginx ... done
Starting dnmp-phpmyadmin ... done
浏览器访问:http://127.0.0.1/
80
端口没有被占用dnmp-redis
dnmp-mysql
请务必给使用-v
挂载主机目录赋予权限:sudo chown -R 1000 data(宿主机目录)
配置文件端口必须和 docker-compose.yml
的ports - 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}'"
容器时间跟宿主机时间不一致
localtime
: docker cp /etc/localtime lnmp-nginx:/etc/
docker restart lnmp-nginx
进入容器: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.
是否存在该内容,有则删除即可
Crontab 任务:
55 23 * * * bash /backup/mysql_auto_backup.sh >/dev/null 2>&1
注意:crontab定时执行Docker 任务的时候是不需要添加参数-it
。-t
是分配一个伪终端,但是crontab执行的时候实际是不需要的。
项目配置文件建议:
www
,配置主机Host
字段值为MySQL容器ip段172.18.0.%
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dnmp-mysql
进入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.init
,可使用该命令重新加载配置文件。
修改配置文件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 run --rm --interactive --tty --volume $PWD:/app --user $(id -u):$(id -g) composer install --ignore-platform-reqs
--ignore-platform-reqs
参数表示官方docker composer 库没有包含当前PHP版本
需要进入dnmp-php
容器: docker exec -it dnmp-php /bin/bash
查看 composer
版本:composer --version
修改 composer 的全局配置文件(推荐方式)
composer config -g repo.packagist composer https://packagist.phpcomposer.com
如果你是墙内客户,务必添加以上国内镜像
更新框架或者扩展
/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.2
composer update topthink/framework
第一次执行提示:
Unable to find image 'composer:latest' locally
,不要慌,稍等片刻
# 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
/etc/init.d/cron start
crontab -e
* * * * * echo " Hi dnmp " >> /var/www/crontab.log
*/30 * * * * /usr/local/php/bin/php /var/www/tp5.1/think jobs hello
在项目中难免会用到 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 9502
WorkerMan: worker process AppGateway websocket://0.0.0.0:9502
通过telnet
命令检测远程端口是否打开
telnet 127.0.0.1 9502
Trying 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"}
主机上访问phpMyAdmin的地址:http://localhost:8082
或者http://宿主机Ip地址:8082
默认登录账户:
root
,密码:123456
进入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
生成本地 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
一键生成证书。进入证书存放目录:$ cd etc/letsencrypt/
首次运行时,先生成并安装根证书
$ mkcert --install
Using the local CA at "C:\Users\tinywan\AppData\Local\mkcert" ✨
自定义证书签名
$ mkcert dnmp.com "*.dnmp.org" "*.dnmp.cn" localhost 127.0.0.1
Using the local CA at "C:\Users\tinywan\AppData\Local\mkcert" ✨
Created a new certificate valid for the following names 📜
- "dnmp.com"
- "*.dnmp.org"
- "*.dnmp.cn"
- "localhost"
- "127.0.0.1"
Reminder: X.509 wildcards only go one level deep, so this won't match a.b.dnmp.org ℹ️
The certificate is at "./dnmp.com+4.pem" and the key at "./dnmp.com+4-key.pem" ✅
已经生成的证书
$ ls etc/letsencrypt/
dnmp.com+4.pem dnmp.com+4-key.pem
配置Nginx 虚拟主机配置文件
server {
listen 443 ssl http2;
server_name www.dnmp.cn;
ssl_certificate /etc/letsencrypt/dnmp.com+4.pem;
ssl_certificate_key /etc/letsencrypt/dnmp.com+4-key.pem;
...
}
浏览器访问效果
$ docker run --rm -it -v "D:\Git\docker-lnmp\dev\nginx\v5\etc\letsencrypt":/acme.sh \
-e Ali_Key="LTAIn" -e Ali_Secret="zLzA" neilpang/acme.sh --issue --dns dns_ali \
-d tinywan.top -d *.tinywan.top -d *.frps.tinywan.top
保存目录
/home/www/openssl
D:\Git\docker-lnmp\dev\nginx\v5\etc\letsencrypt
参数详解(阿里云后台获取的密钥)
Ali_Key
阿里云 AccessKey IDAli_Secret
阿里云 Access Key Secret连接Redis报错:Connection refused
,其他客户端可以正常连接
容器之间相互隔绝,在进行了端口映射之后,宿主机可以通过127.0.0.1:6379访问redis,但php容器不行。在php中可以直接使用
hostname: lnmp-mysql-v3
来连接redis容器。原贴地址
Windows 10 启动错误 Error starting userland proxy: Bind for 127.0.0.1:3306: unexpected error Permission denied
检查本地是否有MySQL已经启动或者端口被占用。关闭即可
Linux 环境启动的时候,MySQL总是Restarting
:lnmp-mysql-v6 docker-entrypoint.sh --def ... Restarting
解决办法:
cd etc/mysql
,查看文件权限。最暴力的:rm -r data && mkdir data
解决问题
权限问题
mkdir(): Permission denied
问题,解决办法:sudo chmod -R 777 runtime
ErrorException in File.php line 29 mkdir(): Permission denied
无法权限被拒绝
chmod -R 777 runtime
chmod -R 777 upload
docker-compose.yml
文件格式错误
ERROR: yaml.scanner.ScannerError: while scanning for the next token
found character '\t' that cannot start any token
in "./docker-compose.yml", line 68, column 1
这里的原因是
docker-compose.yml
中最前面用了tab
,改成空格就好了。对yaml文件格式要求严格
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。