Docker+Nginx+PHP+MySQL部署

通过网盘分享的文件:docker-images
链接: https://pan.baidu.com/s/1qyidkCeGg0O_3odSG5jstA 提取码: sduq

1、在对应的目录下创建目录,用于保存docker相关的配置文件,如~/www/

cd ~/www
mkdir -p nginx/conf/ nginx/conf.d nginx/logs nginx/cert project mysql/data mysql/logs mysql/conf mysql/db

2、配置对应的文件

nginx/nginx.conf

用于配置nginx

worker_processes  1;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server_tokens off;

    # 开启gzip
    gzip  on;
    # 低于1kb的资源不压缩
    gzip_min_length 1k;
    # 设置压缩所需要的缓冲区大小
    gzip_buffers 4 16k;
    # 压缩级别【1-9】,越大压缩率越高,同时消耗cpu资源也越多,建议设置在4左右。
    gzip_comp_level 4;
    # 需要压缩哪些响应类型的资源,缺少的类型自己补。
    gzip_types text/css text/javascript application/javascript;
    # 配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
    gzip_disable "MSIE [1-6]\.";
    # 是否添加“Vary: Accept-Encoding”响应头,
    gzip_vary on;
    # 设置gzip压缩针对的HTTP协议版本,没做负载的可以不用
    # gzip_http_version 1.0;

    upstream gdstats {
       server gdstats-gateway:8082;
    }
    
    upstream storage {
       server gdstats-file:9300;
    }

    include /etc/nginx/conf.d/*.conf;

}

nginx/conf.d/hostname-vhost.conf

用于配置vhost虚拟机(域名)

server {
    listen 80;
    server_name test.kunyuan.tech;
    root /www/prject/website/public; #注意,此处应该为docker容器的目录,可以run的时候做关联
    
    client_max_body_size 20m;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }


    gzip on;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    location ~ .*\.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm)$
    {
        expires 30d;
    }

    location ~ .*\.(?:js|css)$
    {
        expires 30d;
    }

    location ~ .*\.(?:htm|html)$
    {
        add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
    }
    
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

nginx/logs 用于保存nginx运行日志

nginx/cert 用于保存https/443端口相关证书文件

project 用于存放项目文件,里面可建多个子目录,需要注意nginx和php容器映射目录一致

mysql/data 用于存放mysql数据库文件

mysql/logs 用于存放mysql日志文件

mysql/db 用于存放**.sql文件,在mysql容器运行时会进行初始化

mysql/conf 用于存放mysql配置文件,如 my.cnf

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
init_connect='SET NAMES utf8'


#binlog格式
binlog_format = mixed
#存放地址,注意这个地址是docker容器里面的地址,不是宿主机里面的地址
log-bin=/var/lib/mysql/mysql-bin
server-id=33
#存放时间
expire_logs_days=30
#最大文件大小
max_binlog_size=50m
#缓存大小
binlog_cache_size=10m
#最大缓存大小
max_binlog_cache_size=512m

#主从设置-开始
#log-bin=mysql-bin
#server-id=37
#主从设置-结束

#慢查询
slow_query_log=1
slow_query_log_file=/logs/test-slow.log



[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

3、启动docker

# 创建虚拟网络
docker network create --subnet=172.25.0.0/24 tech.ky-network

# 运行 redis
docker run -itd --name tech.ky-redis --restart=always --net tech.ky-network --ip 172.25.0.11 -p 6379:6379 redis --requirepass mypassword  

# 运行 mysql
docker run --name tech.ky-mysql --restart=always --net tech.ky-network --privileged=true \
--ip 172.25.0.12 -p 3306:3306 \
-v ~/www/mysql/conf:/etc/mysql/conf.d \
-v ~/www/mysql/logs:/logs \
-v ~/www/mysql/data:/var/lib/mysql \
-v ~/www/mysql/db:/docker-entrypoint-initdb.d \
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

# 运行php-fpm, 注意-v project项目目录,必须与nginx项目目录一致,否则会产生404 not found的问题
docker run -itd --name tech.ky-php-v1 \
-v ~/www/project:/www/project \
--restart=always \
--net tech.ky-network \
--ip 172.25.0.13 \
-p 9000:9000 php:7.4-fpm

# 运行nginx 注意-v project项目目录,必须与php 项目目录一致,否则会产生404 not found的问题
docker run -itd --name tech.ky-nginx --net tech.ky-network \
--ip 172.25.0.14 -p 80:80 -p 443:443 --restart=always \
-v ~/www/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v ~/www/nginx/conf.d:/etc/nginx/conf.d \
-v ~/www/nginx/logs:/var/log/nginx \
-v ~/www/nginx/cert:/etc/nginx/cert \
-v ~/www/project:/www/project \
--link tech.ky-php-v1:php nginx

4、已知问题

4.1 可能会存在mysql_connect函数不存在的问题,进入php容器,执行以下命令,然后重启容器。

cd /usr/local/bin
./docker-php-ext-install pdo_mysql
./docker-php-ext-install mysql
./docker-php-ext-install mysqli

#安装gd
apt-get install libzip-dev
apt-get install libonig-dev
apt-get install libpng-dev
./docker-php-ext-install mbstring
./docker-php-ext-install zip
./docker-php-ext-install gd

4.2 运行php文件提示 page not found,这是可能因为php的docker容器目录与nginx配置的项目文件路径不致产生的,删除容器重建。注意php和nginx中的 -v ~/www/project:/www/project

4.3 如果使用docker-compose 安装,Dockerfile 文件参考

FROM php-fpm:7.4

RUN docker-php-ext-install mysql mysqli pdo_mysql

RUN apt-get update -y && apt-get install -y libonig-dev libzip-dev libpng-dev 

RUN docker-php-ext-install mbstring

RUN docker-php-ext-install zip

RUN docker-php-ext-install gd
This entry was posted in 应用. Bookmark the permalink.

发表评论