DNMP (Docker + Nginx/Openresty + MySQL5,8 + PHP5,7,8 + Redis + ElasticSearch + MongoDB + RabbitMQ) เป็น โปรแกรมติดตั้ง LNMP แบบคลิกเดียวที่มีคุณสมบัติครบถ้วน ซึ่งรองรับ Arm CPU
มีคำแนะนำเกี่ยวกับโอกาสในการทำงานในต่างประเทศ เพื่อนๆ ที่สนใจสามารถเข้าไปดูได้
100%100%pdo_mysql , mysqli , mbstring , gd , curl , opcache ฯลฯ และสามารถกำหนดค่าได้อย่างยืดหยุ่นตามสภาพแวดล้อม100%install-php-extensions apcu /
├── data 数据库数据目录
│ ├── esdata ElasticSearch 数据目录
│ ├── mongo MongoDB 数据目录
│ ├── mysql MySQL8 数据目录
│ └── mysql5 MySQL5 数据目录
├── services 服务构建文件和配置文件目录
│ ├── elasticsearch ElasticSearch 配置文件目录
│ ├── mysql MySQL8 配置文件目录
│ ├── mysql5 MySQL5 配置文件目录
│ ├── nginx Nginx 配置文件目录
│ ├── php PHP5.6 - PHP7.4 配置目录
│ ├── php54 PHP5.4 配置目录
│ └── redis Redis 配置目录
├── logs 日志目录
├── docker-compose.sample.yml Docker 服务配置示例文件
├── env.smaple 环境配置示例文件
└── www PHP 代码目录
- `git`
- `Docker`(系统需为Linux,Windows 10 Build 15063+,或MacOS 10.12+,且必须要`64`位)
- `docker-compose 1.7.0+`
clone : ```
$ git clone https://github.com/yeszao/dnmp.git
```
root คุณจะต้องเพิ่มผู้ใช้ปัจจุบันในกลุ่มผู้ใช้ docker ด้วย: ```
$ sudo gpasswd -a ${USER} docker
```
copy ) และเริ่มต้น: ```
$ cd dnmp # 进入项目目录
$ cp env.sample .env # 复制环境变量文件。note:安装php扩展请查看文档中的3.2小节
$ cp docker-compose.sample.yml docker-compose.yml # 复制 docker-compose 配置文件。默认启动3个服务:
# Nginx、PHP7和MySQL8。要开启更多其他服务,如Redis、
# PHP5.6、PHP5.4、MongoDB,ElasticSearch等,请删
# 除服务块前的注释
$ docker-compose up # 启动
```
http://localhost หรือ https://localhost (สาธิต HTTPS ด้วยตนเอง) เพื่อดูเอฟเฟกต์ โค้ด PHP อยู่ในไฟล์ . ./www/localhost/index.php ขั้นแรก คุณต้องเริ่ม PHP เวอร์ชันอื่นๆ เช่น PHP5.4 จากนั้นลบความคิดเห็นที่อยู่หน้า PHP5.4 ในไฟล์ docker-compose.yml จากนั้นจึงเริ่มคอนเทนเนอร์ PHP5.4
หลังจากเริ่มต้น PHP5.4 แล้ว ให้เปิดการกำหนดค่า Nginx และแก้ไขที่อยู่โฮสต์ของ fastcgi_pass จาก php เป็น php54 ดังนี้:
fastcgi_pass php:9000;
สำหรับ:
fastcgi_pass php54:9000;
โดยที่ php และ php54 เป็นชื่อของเซิร์ฟเวอร์ในไฟล์ docker-compose.yml
สุดท้าย รีสตาร์ท Nginx เพื่อให้มีผล
$ docker exec -it nginx nginx -s reload มีสอง nginx ที่นี่ อันแรกคือชื่อคอนเทนเนอร์ และอันที่สองคือโปรแกรม nginx ในคอนเทนเนอร์
ฟังก์ชั่นหลายอย่างของ PHP ถูกนำมาใช้ผ่านส่วนขยาย และการติดตั้งส่วนขยายนั้นใช้เวลานานเล็กน้อย ดังนั้น นอกเหนือจากส่วนขยายในตัวของ PHP แล้ว เรายังติดตั้งส่วนขยายเพียงไม่กี่รายการตามค่าเริ่มต้นในไฟล์ env.sample ติดตั้งส่วนขยายเพิ่มเติม โปรดเปิดไฟล์ .env ของคุณและแก้ไขการกำหนดค่า PHP ต่อไปนี้ โดยเพิ่มส่วนขยาย PHP ที่จำเป็น:
PHP_EXTENSIONS=pdo_mysql,opcache,redis # PHP 要安装的扩展列表,英文逗号隔开
PHP54_EXTENSIONS=opcache,redis # PHP 5.4要安装的扩展列表,英文逗号隔开จากนั้นสร้างอิมเมจ PHP ใหม่
docker-compose build php สำหรับส่วนขยายที่ใช้ได้ โปรดดูคำอธิบายที่บล็อกความคิดเห็น env.sample ในไฟล์เดียวกัน
1. ใส่ภาชนะ:
docker exec -it php /bin/sh
install-php-extensions apcu 2. รองรับการติดตั้งรายการส่วนขยายอย่างรวดเร็ว
| ส่วนขยาย | พีเอชพี 8.4 | พีเอชพี 8.3 | พีเอชพี 8.2 | พีเอชพี 8.1 | พีพี 8.0 | พีเอชพี 7.4 | พีเอชพี 7.3 | พีเอชพี 7.2 | พีเอชพี 7.1 | PHP 7.0 | พีเอชพี 5.6 | พีเอชพี 5.5 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| แอมคิวพี | ||||||||||||
| แอพคิว | ||||||||||||
| apcu_bc | ||||||||||||
| เหมือนเดิม | ||||||||||||
| bcmath | ||||||||||||
| บิตเซ็ต | ||||||||||||
| แบล็คไฟร์ | ||||||||||||
| bz2 | ||||||||||||
| ปฏิทิน | ||||||||||||
| คาสซานดรา* | ||||||||||||
| ซีมาร์ค | ||||||||||||
| CSV | ||||||||||||
| ดีบีเอ | ||||||||||||
| ddtrace* | ||||||||||||
| ทศนิยม | ||||||||||||
| ดีเอส | ||||||||||||
| ecma_intl* | ||||||||||||
| เสน่ห์ | ||||||||||||
| ev | ||||||||||||
| เหตุการณ์ | ||||||||||||
| สารออกฤทธิ์ | ||||||||||||
| exif | ||||||||||||
| ffi | ||||||||||||
| ftp | ||||||||||||
| จีดี | ||||||||||||
| คนเกียร์ | ||||||||||||
| ภูมิศาสตร์ | ||||||||||||
| ภูมิศาสตร์* | ||||||||||||
| ภูมิสารสนเทศ | ||||||||||||
| รับข้อความ | ||||||||||||
| แกรมจิก | ||||||||||||
| จีเอ็มพี | ||||||||||||
| gnupg | ||||||||||||
| จีพีซี | ||||||||||||
| http | ||||||||||||
| อิกไบนารี | ||||||||||||
| จินตนาการ | ||||||||||||
| ไอแมป | ||||||||||||
| ไม่แจ้งให้ทราบ | ||||||||||||
| อินเตอร์เบส | ||||||||||||
| นานาชาติ | ||||||||||||
| ไอออน | ||||||||||||
| ioncube_loader | ||||||||||||
| เจสมิน | ||||||||||||
| json_post | ||||||||||||
| jsonpath | ||||||||||||
| ลาป | ||||||||||||
| luasandbox | ||||||||||||
| lz4* | ||||||||||||
| แซฟ | ||||||||||||
| แยกวิเคราะห์จดหมาย | ||||||||||||
| maxminddb | ||||||||||||
| เอ็มคริปโต | ||||||||||||
| เมมแคช | ||||||||||||
| เมคแคช | ||||||||||||
| เมพรอฟ* | ||||||||||||
| มองโก | ||||||||||||
| mongodb | ||||||||||||
| ยุง | ||||||||||||
| แพ็คข้อความ | ||||||||||||
| mssql | ||||||||||||
| mysql | ||||||||||||
| mysqli | ||||||||||||
| นิวเรลิก | ||||||||||||
| คำสาบาน | ||||||||||||
| oci8 | ||||||||||||
| odbc | ||||||||||||
| ออปแคช | ||||||||||||
| การสำรวจสำมะโนประชากร | ||||||||||||
| openswoole | ||||||||||||
| การวัดแบบเปิด | ||||||||||||
| ขนาน* | ||||||||||||
| พาร์เล* | ||||||||||||
| pcntl | ||||||||||||
| พีซีอฟ | ||||||||||||
| pdo_dblib | ||||||||||||
| pdo_firebird | ||||||||||||
| pdo_mysql | ||||||||||||
| pdo_oci | ||||||||||||
| pdo_odbc | ||||||||||||
| pdo_pgsql | ||||||||||||
| pdo_sqlsrv | ||||||||||||
| pgsql | ||||||||||||
| นกเหยี่ยว | ||||||||||||
| php_trie.php | ||||||||||||
| phpy* | ||||||||||||
| pkcs11 | ||||||||||||
| หน้า | ||||||||||||
| เหมาะสม | ||||||||||||
| โปรโตบุฟ | ||||||||||||
| สะกด | ||||||||||||
| ปล | ||||||||||||
| pthreads* | ||||||||||||
| ราฟฟ | ||||||||||||
| rdkafka | ||||||||||||
| เข้ารหัสใหม่ | ||||||||||||
| ทำซ้ำ | ||||||||||||
| รีเลย์ | ||||||||||||
| แซกซอน* | ||||||||||||
| ซีคลิก | ||||||||||||
| บันทึกทะเล | ||||||||||||
| ชมอป | ||||||||||||
| ซิมเจสัน* | ||||||||||||
| smbclient | ||||||||||||
| เร็ว | ||||||||||||
| snmp | ||||||||||||
| Snuffleupagus | ||||||||||||
| สบู่ | ||||||||||||
| ซ็อกเก็ต | ||||||||||||
| โซเดียม* | ||||||||||||
| โซล่าร์ | ||||||||||||
| ผู้พิทักษ์แหล่งที่มา | ||||||||||||
| เอสพีเอ็กซ์ | ||||||||||||
| sqlsrv* | ||||||||||||
| ssh2 | ||||||||||||
| เหยียบ | ||||||||||||
| ผ้าวูล | ||||||||||||
| sybase_ct | ||||||||||||
| ซิงค์ | ||||||||||||
| sysvmsg | ||||||||||||
| ระบบ | ||||||||||||
| ระบบ | ||||||||||||
| เทนเซอร์ | ||||||||||||
| กระแสน้ำ | ||||||||||||
| เรียบร้อย | ||||||||||||
| เขตเวลาdb | ||||||||||||
| uopz | ||||||||||||
| ความคืบหน้าการอัปโหลด | ||||||||||||
| อุ๊ย | ||||||||||||
| ยูวี | ||||||||||||
| วีไอพี* | ||||||||||||
| vld | ||||||||||||
| xx | ||||||||||||
| วิกิดิฟ2* | ||||||||||||
| xdebug | ||||||||||||
| xdiff | ||||||||||||
| xhpr | ||||||||||||
| xlswriter | ||||||||||||
| xmldiff | ||||||||||||
| xmlrpc | ||||||||||||
| xpass* | ||||||||||||
| xsl | ||||||||||||
| ใช่แล้ว | ||||||||||||
| yaml | ||||||||||||
| ใช่แล้ว | ||||||||||||
| zephir_parser | ||||||||||||
| ซิป | ||||||||||||
| ซคิว | ||||||||||||
| ผู้ดูแลสวนสัตว์ | ||||||||||||
| zstd |
จำนวนส่วนขยายที่รองรับ: 150
ส่วนขยายนี้มาจาก https://github.com/mlocati/docker-php-extension-installer ไฟล์ตัวอย่างอ้างอิง
~/.bashrc ของโฮสต์ source ~ /.bashrc ~ php -v
PHP 7.2.13 (cli) (built: Dec 21 2018 02:22:47) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.13, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.6.1, Copyright (c) 2002-2018, by Derick Rethansวิธีที่ 1: ใช้คำสั่งผู้แต่งบนโฮสต์
~/dnmp พาธแคชของผู้แต่งจะเป็น ~/dnmp/data/composer~/.bashrc ของโฮสต์สิ่งที่ต้องสังเกตที่นี่คือไดเร็กทอรี
~/dnmp/data/composerในไฟล์ตัวอย่างจะต้องเป็นไดเร็กทอรีที่กำหนดในขั้นตอนแรก
source ~ /.bashrc cd ~ /dnmp/www/
composer create-project yeszao/fastphp project --no-dev~/dnmp/data/composer คุณสามารถระบุคลังข้อมูลภายในประเทศในไฟล์นี้ได้ เช่น: {
"config" : {},
"repositories" : {
"packagist" : {
"type" : " composer " ,
"url" : " https://mirrors.aliyun.com/composer/ "
}
}
}
วิธีที่ 2: ใช้คำสั่งผู้แต่งในคอนเทนเนอร์
มีอีกวิธีหนึ่งคือการเข้าสู่คอนเทนเนอร์แล้วดำเนินการคำสั่ง composer คอนเทนเนอร์ PHP7 เป็นตัวอย่าง:
docker exec -it php /bin/sh
cd /www/localhost
composer updateในการจัดการบริการ ให้เพิ่มชื่อเซิร์ฟเวอร์หลังคำสั่ง เช่น:
$ docker-compose up # 创建并且启动所有容器
$ docker-compose up -d # 创建并且后台运行方式启动所有容器
$ docker-compose up nginx php mysql # 创建并且启动nginx、php、mysql的多个容器
$ docker-compose up -d nginx php mysql # 创建并且已后台运行的方式启动nginx、php、mysql容器
$ docker-compose start php # 启动服务
$ docker-compose stop php # 停止服务
$ docker-compose restart php # 重启服务
$ docker-compose build php # 构建或者重新构建服务
$ docker-compose rm php # 删除并且停止php容器
$ docker-compose down # 停止并删除容器,网络,图像和挂载卷 ในระหว่างการพัฒนา เราอาจใช้ docker exec -it เพื่อเข้าสู่คอนเทนเนอร์ ซึ่งเป็นวิธีที่ไม่มีปัญหาในการสร้างนามแฝงคำสั่งที่ใช้กันทั่วไป
ขั้นแรก ให้ตรวจสอบคอนเทนเนอร์ที่มีอยู่ในโฮสต์:
$ docker ps # 查看所有运行中的容器
$ docker ps -a # 所有容器คอลัมน์ NAMES ที่เป็นเอาต์พุตคือชื่อของคอนเทนเนอร์ หากใช้การกำหนดค่าเริ่มต้น ชื่อจะเป็น nginx , php , php56 , mysql ฯลฯ
จากนั้นเปิดไฟล์ ~/.bashrc หรือ ~/.zshrc และเพิ่ม:
alias dnginx= ' docker exec -it nginx /bin/sh '
alias dphp= ' docker exec -it php /bin/sh '
alias dphp56= ' docker exec -it php56 /bin/sh '
alias dphp54= ' docker exec -it php54 /bin/sh '
alias dmysql= ' docker exec -it mysql /bin/bash '
alias dredis= ' docker exec -it redis /bin/sh 'การเข้าสู่คอนเทนเนอร์ในครั้งต่อไปจะรวดเร็วมาก ตัวอย่างเช่น ป้อนคอนเทนเนอร์ php:
$ dphpifconfig docker0 ใช้เพื่อกรอกที่อยู่ hosts ของคอนเทนเนอร์ extra_hosts เพื่อเข้าถึงเครื่องโฮสต์
ตำแหน่งที่สร้างไฟล์บันทึกจะขึ้นอยู่กับค่าของการกำหนดค่าบันทึกแต่ละรายการภายใต้ Conf
บันทึก Nginx เป็นบันทึกที่เราใช้บ่อยที่สุด ดังนั้นเราจึงแยกมันออกจากกันใน log ไดเรกทอรีราก
ไดเร็กทอรี log จะแมปไดเร็กทอรี /var/log/nginx ของคอนเทนเนอร์ Nginx ดังนั้นในไฟล์การกำหนดค่า Nginx ซึ่งจำเป็นต้องส่งออกบันทึก เราจำเป็นต้องกำหนดค่าให้กับไดเร็กทอรี /var/log/nginx เช่น:
error_log /var/log/nginx/nginx.localhost.error.log warn;
ในกรณีส่วนใหญ่ บันทึกของ PHP-FPM จะถูกส่งออกไปยังบันทึกของ Nginx ดังนั้นจึงไม่จำเป็นต้องกำหนดค่าเพิ่มเติม
นอกจากนี้ ขอแนะนำให้เปิดบันทึกข้อผิดพลาดโดยตรงใน PHP:
error_reporting ( E_ALL );
ini_set ( ' error_reporting ' , ' on ' );
ini_set ( ' display_errors ' , ' on ' );หากต้องการจริงๆ ให้ทำตามขั้นตอนเพื่อเปิด (ในคอนเทนเนอร์)
$ docker exec -it php /bin/sh
$ mkdir /var/log/php
$ cd /var/log/php
$ touch php-fpm.error.log
$ chmod a+w php-fpm.error.logconf/php-fpm.conf บนโฮสต์ ค้นหาบรรทัดต่อไปนี้ ลบความคิดเห็น และเปลี่ยนค่าเป็น: php_admin_value[error_log] = /var/log/php/php-fpm.error.log
เนื่องจาก MySQL ในคอนเทนเนอร์ MySQL เริ่มต้นโดยผู้ใช้ mysql จึงไม่สามารถเพิ่มไฟล์บันทึกภายใต้ /var/log ด้วยตัวเอง ดังนั้นเราจึงใส่บันทึก MySQL ไว้ในไดเร็กทอรีเดียวกันกับข้อมูล ซึ่งก็คือ อยู่ภายใต้ไดเร็กทอรี mysql ของโปรเจ็กต์ ซึ่งสอดคล้องกับไดเร็กทอรี /var/log/mysql/ ในคอนเทนเนอร์
slow-query-log-file = /var/log/mysql/mysql.slow.log
log-error = /var/log/mysql/mysql.error.logด้านบนคือการกำหนดค่าของไฟล์บันทึกใน mysql.conf
ตามค่าเริ่มต้น โปรเจ็กต์นี้ไม่ได้เปิดใช้งาน phpMyAdmin สำหรับการจัดการออนไลน์ MySQL และ phpRedisAdmin สำหรับการจัดการออนไลน์ redis ใน docker-compose.yml ซึ่งสามารถแก้ไขหรือลบได้ตามต้องการ
ที่อยู่พอร์ตที่แมปโดยคอนเทนเนอร์ phpMyAdmin กับโฮสต์คือ: 8080 ดังนั้นที่อยู่ในการเข้าถึง phpMyAdmin บนโฮสต์คือ:
http://localhost:8080
ข้อมูลการเชื่อมต่อ MySQL:
3306 ที่อยู่พอร์ตที่แมปโดยคอนเทนเนอร์ phpRedisAdmin กับโฮสต์คือ: 8081 ดังนั้นที่อยู่ในการเข้าถึง phpMyAdmin บนโฮสต์คือ:
http://localhost:8081
ข้อมูลการเชื่อมต่อ Redis เป็นดังนี้:
6379 สำหรับใช้ในสภาพแวดล้อมการผลิต:
อ้างถึงปัญหานี้: #91
นักเทียบท่าใช้งานที่กำหนดเวลาไว้ของ cron
เวลาคอนเทนเนอร์ได้รับการกำหนดค่าด้วยตัวแปร TZ ในไฟล์ .env สำหรับโซนเวลาที่รองรับทั้งหมด โปรดดูรายการโซนเวลา·วิกิพีเดีย หรือรายการโซนเวลาที่เว็บไซต์อย่างเป็นทางการของ PHP·PHP รองรับ
นี้สามารถแบ่งออกเป็นสองสถานการณ์คือ
กรณีแรก ในโค้ด PHP
// 连接MySQL
$ dbh = new PDO ( ' mysql:host=mysql;dbname=mysql ' , ' root ' , ' 123456 ' );
// 连接Redis
$ redis = new Redis ();
$ redis -> connect ( ' redis ' , 6379 ); เนื่องจากคอนเทนเนอร์และคอนเทนเนอร์เชื่อมต่อผ่านพอร์ต expose และอยู่ใน networks เดียวกัน พารามิเตอร์ host ของการเชื่อมต่อจึงใช้ชื่อคอนเทนเนอร์โดยตรง และพารามิเตอร์ port คือพอร์ตภายในคอนเทนเนอร์ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ "ความแตกต่างระหว่างพอร์ตเขียน Docker และ Expose"
ในกรณีที่สอง ให้เชื่อมต่อผ่าน บรรทัดคำสั่ง หรือ Navicat และเครื่องมืออื่นๆ บนโฮสต์ หากโฮสต์ต้องการเชื่อมต่อ mysql และ redis คอนเทนเนอร์จะต้องแมปพอร์ตกับโฮสต์ผ่าน ports ยกตัวอย่าง mysql มีการกำหนด ports ดังกล่าวในไฟล์ docker-compose.yml : 3306:3306 ซึ่งหมายความว่าพอร์ต 3306 ของโฮสต์และพอร์ต 3306 ของคอนเทนเนอร์สร้างการแมป เพื่อให้เราสามารถเชื่อมต่อได้เช่น นี้:
$ mysql -h127.0.0.1 -uroot -p123456 -P3306
$ redis-cli -h127.0.0.1 พารามิเตอร์ host ไม่สามารถใช้ localhost ที่นี่ได้เนื่องจากจะสื่อสารกับ mysql ผ่านไฟล์ sock ตามค่าเริ่มต้น และคอนเทนเนอร์และระบบไฟล์โฮสต์ได้ถูกแยกออกจากกัน ดังนั้นจึงจำเป็นต้องเชื่อมต่อผ่าน TCP ดังนั้นจึงต้องระบุ IP
1. โฮสต์ดำเนินการ ifconfig docker0 เพื่อรับ inet ซึ่งเป็นที่อยู่ ip ที่จะเชื่อมต่อ
$ ifconfig docker0
docker0: flags= 4099< UP,BROADCAST,MULTICAST > mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
...2. เรียกใช้บรรทัดคำสั่งโฮสต์ Mysql
mysql > GRANT ALL PRIVILEGES ON * . * TO ' root ' @ ' % ' IDENTIFIED BY ' 123456 ' WITH GRANT OPTION;
mysql > flush privileges;
// 其中各字符的含义:
// * . * 对任意数据库任意表有效
// " root " " 123456 " 是数据库用户名和密码
// ' % ' 允许访问数据库的IP地址,%意思是任意IP,也可以指定IP
// flush privileges 刷新权限信息3. จากนั้นเชื่อมต่อโดยตรงกับคอนเทนเนอร์ php โดยใช้ 172.0.17.1:3306
8.0.28 ขึ้นไป เวอร์ชัน PHP ต้องใช้ 7.4.7 ขึ้นไปในการเชื่อมต่อวิธีสร้างชื่อคอนเทนเนอร์เมื่อไม่ได้ระบุชื่อคอนเทนเนอร์
เอ็มไอที