前期准备
一、本地安装
- git
- Docker
- docker-compose 1.7.0+
- dnmp链接 链接文档gitee 与 链接文档github
二、apache安装
注:如果服务器新服务器可以直接用宝塔安装,避免走很多坑
由于服务通过宝塔已经安装nginx,不能于安装apache,所以使用docker安装apache
1. docker 安装apache命令
1)拉取镜像
docker pull httpd
2)创建临时容器
docker run -id --name http-test -p 80:80 httpd
3)创建目录(目录位置根据自己情况去创建)
mkdir -p /home-data-disk/www/wwwroot /home-data-disk/docker/apache/logs /home-data-disk/docker/apache/conf/myconf
wwwroot 目录将映射为apache容器配置的应用程序目录
logs 目录将映射为apache容器的日志目录
conf 目录里的配置文件将映射为apache容器的配置文件
myconf 方便存放自己的配置,后期改apache的配置要用
4)拷贝容器内Apache 默认配置文件到本地当前目录下的 conf 目录,并删除临时容器,主要用它的配置文件
docker ps -a //查看容器id
docker cp [容器ID]:/usr/local/apache2/conf/httpd.conf /home-data-disk/docker/apache/conf
docker rm -f [容器ID]
5)创建自己真正要用的容器
sudo lsof -i :8080 #查看端口是否被占用
docker run -p 8080:80 --name apache-my --network dnmp_dnmp --ip 192.168.0.21 -v /home-data-disk/www/wwwroot/:/www/ -v /home-data-disk/docker/apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v /home-data-disk/docker/apache/conf/myconf/:/usr/local/apache2/conf/myconf/ -v /home-data-disk/docker/apache/logs:/usr/local/apache2/logs/ -d httpd
8080:80 宿主机端口:容器端口
apache-my 容器名字
dnmp_dnmp 自定义的网络段192.168.0.0/24(安装dnmp环境是创建的)
192.168.0.21 自定义网络的ip(方便各容器互通)
-v 宿主机目录:容器目录 (目录映射)
-d httpd 镜像名
- 修改配置文件(大致要修改的地方)
ServerName 0.0.0.0:80
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule rewrite_module modules/mod_rewrite.so
<Directory />
AllowOverride All
Require all denied
</Directory>
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride All
Options None
Require all granted
</Directory>
TraceEnable off
IncludeOptional /usr/local/apache2/conf/myconf/*.conf
IncludeOptional /usr/local/apache2/conf/myconf/*.conf 这个是之前提到要用的目录(每个网站的不同的配置)
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot "/www/enlightv"
ServerName 428a707d.177.177.177.177
ServerAlias 177.177.177.177
#errorDocument 404 /404.html
#DENY FILES
<Files ~ (\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)$>
Order allow,deny
Deny from all
</Files>
#PHP
<FilesMatch \.php$>
SetHandler "proxy:fcgi://192.168.0.10:9000"
</FilesMatch>
#PATH
<Directory "/www/enlightv">
SetOutputFilter DEFLATE
Options FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.php index.html index.htm default.php default.html default.htm
</Directory>
</VirtualHost>
配置好后将上面文件放到myconf目录下,文件名 177.177.177.177.conf
- 每次改完配置重启apache
docker restart apache-my
三、dnmp安装
1.配置文件需要修改部分
- .env文件(一些扩展,账号密码根据自己情况设置)
SOURCE_DIR=/home-data-disk/www #apache应用程序目录要与php应用程序目录一致
- docker-compose.yml文件
php:
build:
context: ./services/php
args:
PHP_VERSION: php:${PHP_VERSION}-fpm-alpine
CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL}
PHP_EXTENSIONS: ${PHP_EXTENSIONS}
TZ: "$TZ"
container_name: php
expose:
- 9501
extra_hosts:
- "www.site1.com:172.17.0.1"
volumes:
- ${SOURCE_DIR}:/www/:rw #注意要改的地方,根据自己情况有可能需要修改
- ${PHP_PHP_CONF_FILE}:/usr/local/etc/php/php.ini:ro
- ${PHP_FPM_CONF_FILE}:/usr/local/etc/php-fpm.d/www.conf:rw
- ${PHP_LOG_DIR}:/var/log/php
- ${DATA_DIR}/composer:/tmp/composer
restart: always
cap_add:
- SYS_PTRACE
networks:
# - default
# 可以把-default 改成下列配置,以固定容器IP
dnmp:
ipv4_address: 192.168.0.10
mysql:
image: mysql/mysql-server:${MYSQL_VERSION}
container_name: mysql
ports:
- "${MYSQL_HOST_PORT}:3306"
volumes:
- ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
- ${MYSQL_CONF_FILE_MY}:/etc/my.cnf:ro
- ${DATA_DIR}/mysql:/var/lib/mysql/:rw
- ${MYSQL_LOG_DIR}:/var/log/mysql/:rw
restart: always
networks:
# - default
# - default
# 可以把-default 改成下列配置,以固定容器IP
dnmp:
ipv4_address: 192.168.0.11
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
MYSQL_ROOT_HOST: "${MYSQL_ROOT_HOST}"
TZ: "$TZ"
networks:
dnmp:
driver: bridge
ipam:
# driver: default
# 解除下面的注释可以设置网段,用于nginx等容器固定容器IP
config:
- subnet: 192.168.0.0/24
2.dnmp安装使用
具体安装使用参考官方文档即可(上述有链接)
3.插件安装
1)rabbitmq安装rabbitmq_delayed_message_exchange延时队列插件
- 根据自己mq版本下载自己对应插件版本,网址https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
我rabbitmq版本是v3.12.4,下载的插件版本是v3.12.0
- 将下载好的插件传到服务器(/dnmp/services/rabbitmq)目录,并复制到rabbitmq容器
cd /dnmp/services/rabbitmq
#复制命令
docker cp rabbitmq_delayed_message_exchange-3.12.0.ez rabbitmq:/opt/rabbitmq/plugins
- 进入容器,可以查看到此插件
docker exec -it rabbitmq bash
cd /opt/rabbitmq/plugins
ls
- 安装消息管理插件(dnmp集成环境默认装了,可以忽略此步骤,可以从/dnmp/services/rabbitmq/dockerfile文件看到)
rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management
- 查看插件
rabbitmq-plugins list
- 启动插件并重启容器
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
exit
docker-compose restart rabbitmq
- 可以看到如下,安装成功了
三、报错处理
- STORAGE_WRITE_ERROR:./Application/Runtime/Cache/Home/2a94b8bda04ff446dcedd42276fc99ee.php
chmod -R 777 Runtime/ #为缓存文件加权限
2.1055:Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column
- 修改mysql配置
由于mysql8使用的真正配置文件是:mysql容器文件位置 /etc/my.cnf,而写官方只把mysql.cnf映射出来了,无论你怎么修改mysql.cnf配置文件都没反应,
先将my.cnf文件复制出来docker cp [容器ID]:/etc/my.cnf /home-data-disk/dnmp/services/mysql
- 修改.dnmp下.env配置文件
#
# MySQL8
#
MYSQL_VERSION=8.0.28
MYSQL_HOST_PORT=13306
MYSQL_ROOT_PASSWORD=f6GbSLJWhR8GPi76
MYSQL_ROOT_HOST=%
MYSQL_CONF_FILE=./services/mysql/mysql.cnf
MYSQL_CONF_FILE_MY=./services/mysql/my.cnf #改动部分
MYSQL_LOG_DIR=./logs/mysql
- 修改dnmp下 docker-compose.yml
mysql:
image: mysql/mysql-server:${MYSQL_VERSION}
container_name: mysql
ports:
- "${MYSQL_HOST_PORT}:3306"
volumes:
- ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
- ${MYSQL_CONF_FILE_MY}:/etc/my.cnf:ro #改动部分
- ${DATA_DIR}/mysql:/var/lib/mysql/:rw
- ${MYSQL_LOG_DIR}:/var/log/mysql/:rw
restart: always
networks:
# - default
# - default
# 可以把-default 改成下列配置,以固定容器IP
dnmp:
ipv4_address: 192.168.0.11
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
MYSQL_ROOT_HOST: "${MYSQL_ROOT_HOST}"
TZ: "$TZ"
- 重新构建mysql
docker-compose up -d mysql
- 修改dnmp/services/mysql下my.cnf文件
!includedir /etc/mysql/conf.d #末尾加上这条语句
- 接下来再修改mysql.cnf配置文件,然后重启容器,mysql就能读到了
注意:一定要给/home-data-disk/dnmp/logs/mysql 目录下文件读写权限
命令: chmod -R 666 /dnmp/logs/mysql
上面这个命令将mysql目录(文件夹)权限也改成666,还要将其改回755:chmod 755 /dnmp/logs/mysql
其中,/dnmp/logs/mysql 是目标目录的路径。使用-R选项表示递归地修改目录及其子内容的权限。
[client]
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysql
port = 3306
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION #主要加入这条
default-storage-engine = InnoDB
default-authentication-plugin = mysql_native_password
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
disable-log-bin
skip-character-set-client-handshake
explicit_defaults_for_timestamp
slow_query_log
long_query_time = 3
slow-query-log-file = /var/log/mysql/mysql.slow.log #上面注意提到的读写权限,相当于给容器内这个文件加的
log-error = /var/log/mysql/mysql.error.log #上面注意提到的读写权限,相当于给容器内这个文件加的
default-time-zone = '+8:00'
[mysql]
default-character-set = utf8mb4
3.宿主机运行 php容器->php脚本
docker exec php php /www/wwwroot/项目目录/index.php admin/My/getNode 一直没成功执行,
于是在宿主机执行(非项目入口目录)php /www/wwwroot/project/index.php admin/My/getNode
报错:PHP Warning: require(./ThinkPHP/ThinkPHP.php): failed to open stream: No such file or directory in /www/wwwroot/project/index.php on line 52
<?php
// 应用入口文件
chdir(__DIR__); #入口文件加入此行代码
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
四、扩展
- 宿主机执行php脚本文件
#先生成一个容器(使用$PWD 要在项目根目录下执行)
docker run --interactive --tty --network=dnmp_dnmp --volume $PWD:/www:rw --workdir /www --name my_php_script --ip 192.168.0.33 dnmp-php
#进入文件
vim .bashrc //在根目录下
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
#不需要先创建容器,每次调用这个函数的时候,都会自动生成 (--rm 容器停止后自动删除)
phpp () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--network=dnmp_dnmp \
--volume $PWD:/www:rw \
--workdir /www \
dnmp-php php "$@"
}
#进入文件加入以下函数 (可以在宿主机任何位置直接运行该项目下php脚本)
php7 () {
tty=
tty -s && tty=--tty
docker exec $tty my_php_script php "$@"
}
#创建好后 运行php脚本
php7 index.php /admin/test/test