1.构建目录
//首先搭建出自己的项目目录结构
mkdir -p -m +x mysql.conf.d //示例 创建其他目录类似
##目录说明
mydocker
|- db_data //mysql数据存放目录
|- log //日志存放目录
|- mysql //mysql日志
|- nginx //nginx日志
|- php //php日志
|- php-fpm //php-fpm日志
|- mysql
|- mysql.conf.d
|- mysqld.cnf //mysql 配置文件
|- Dockerfile //mysql 构建dockerfile
|- nginx
|- conf //nginx vhost配置文件目录
|- default.conf //nginx 默认配置
|- Dockerfile //nginx 构建dockerfile
|- nginx.conf //nginx 配置
|- php-fpm
|- Dockerfile //php 构建dockerfile
|- php.ini //php.ini
|- sources.list //资源列表
|- www //web项目存放路径
|- .env //docker-compose构建镜像时加载的配置
|- docker-compose.yml //yml文件 启动容器
|- README.md //注释文件
2.构建镜像
2.1首先写编写.env文件
#项目所在目录
SOURCE_DIR=./www
# http地址端口
HTTP_HOST=0.0.0.0
HTTP_PORT=80
# NGINX配置
NGINX_VERSION=alpine
NGINX_CONFD_DIR=./nginx/conf
NGINX_CONF_FILE=./nginx/conf
NGINX_LOG_DIR=./log/nginx
# PHP配置
PHP_VERSION=7.0
PHP_CONFIG_FILE=./php/conf/php.ini
PHP_FPM_CONFIG_FILE=./php/conf/php-fpm.conf
PHP_FPM_LOG=./log/php-fpm
PHP_LOG=./log/php
# MYSQL配置
MYSQL_PORT=3306
MYSQL_ROOT_USER=root
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATA_DIR=./db_data
MYSQL_LOG=./log/mysql
# MYSQL_CONF=./mysql/conf
# MYSQL_MY_CNF=./mysql/my.cnf
2.2 编写mysql的配置文件
- 如果你是使用的是8.0版本机以上的需要 修改下链接方式:改为mysql_native_password即可,配置文件里有说明
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
# 时区
default-time_zone = '+8:00'
log_timestamps = SYSTEM
# 是否启用通用查询日志
general-log = on
general_log_file = /var/log/mysql/mysql.log
# 错误日志地址
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#允许连接的ip地址
bind-address = 0.0.0.0
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# 慢查询日志
slow_query_log = 1
long-query-time = 1 #慢查询时间 超过1秒则为慢查询
slow_query_log_file = /var/log/mysql/slow.log
# 默认使用“mysql_native_password”插件认证 登录方式
default_authentication_plugin=mysql_native_password
#default_authentication_plugin=caching_sha2_password
2.3mysql的 Dockerfile文件编写:
- 这里用得5.6版本 登录方式默认为mysql_native_password
# 基础镜像
FROM mysql:5.6
MAINTAINER emal:169408470*.qq.com
#utf8编码
RUN echo "character-set-server=utf8" >> /etc/mysql/mysql.conf.d/mysqld.cnf
# 设置时区
RUN echo "Asia/shanghai" > /etc/timezone;
RUN rm -rf /etc/localtime;
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#容器入口目录
WORKDIR /etc/mysql/mysql.conf.d
# 将本地mysql.conf.d下的文件复制到镜像中
ADD ./mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/
2.4 php-fpm的 Dockerfile
*注意php的版本 php7.2.0 -php7.3.0扩展才可以安装成功
#基础镜像
FROM php:7.2.0-fpm
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 将本地源文件复制到镜像
#ADD sources.list /etc/apt/sources.list
# 更新系统 && 安装依赖库
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
# 安装一些常用扩展
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install bcmath zip opcache iconv pdo pdo_mysql mysqli
# apt-get安装扩展
RUN apt-get install -y libmcrypt-dev \
&& pecl install mcrypt-1.0.1 \
&& docker-php-ext-enable mcrypt
# pecl安装扩展
RUN pecl install redis-4.0.1 \
&& pecl install xdebug-2.6.0 \
&& docker-php-ext-enable redis xdebug
# 将本地php.ini复制到镜像中
#ADD php.ini /usr/local/etc/php/php.ini
3.修改nginx 的配置文件
3.1 default.conf
- 注意root 路径 和添加index.php 解析 和 location ~ .php下的配置
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /var/www;
index index.php index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /var/www;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
3.2 Dockerfile
# 基础镜像
FROM nginx:latest
# 设置时区
RUN echo "Asia/shanghai" > /etc/timezone;
RUN rm -rf /etc/localtime;
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#RUN apt-get -y install vim
#RUN apt-get -y install net-tools
EXPOSE 80
WORKDIR /var/www
#修改配置。站点目录配置和php 请求。
#ADD nginx.conf /etc/nginx/
ADD /conf/default.conf /etc/nginx/conf.d/
3.3 nginx.conf 原生的文件 为了偏于修改容器配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# 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;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
php.ini文件找一份原生的就可以 复制到目录下
4. docker-compose.yml
#版本号
version: "3"
#服务
services:
#mysql服务
db:
#使用mysql目录下的Dockerfile构建镜像
#image: mysql:5.7
build: ./mysql
command: --default-authentication-plugin=mysql_native_password
#磁盘映射。./db_data 是宿主的目录。后者是容器里的目录。
volumes:
- ${MYSQL_DATA_DIR}:/var/lib/mysql
- ${MYSQL_LOG}:/var/log/mysql
restart: always
# 端口映射。前者是宿主的。后者是容器里端口
ports:
- "${MYSQL_PORT}:3306"
#环境变量
environment:
#mysql的root密码
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
#容器会创建的数据库名
MYSQL_DATABASE: swoole_db
#=======================================================
#php-fpm服务
php:
#服务器镜像构建的目录。会在该目录下寻找dockerfile构建镜像。
build: ./php-fpm
#依赖的服务。会在容器里的host文件里添加 一条记录。访问db,即可访问mysql的服务。
depends_on:
- db
#目录映射
volumes:
- ${SOURCE_DIR}:/var/www
- ${PHP_FPM_LOG}:/var/log/php-fpm
- ${PHP_LOG}:/var/log/php
restart: always
#=======================================================
#nginx服务
nginx:
#使用nginx目录下的Dockerfile构建镜像
build: ./nginx
depends_on:
- php
#目录映射
volumes:
- ${SOURCE_DIR}:/var/www
- ${NGINX_LOG_DIR}:/var/log/nginx
- ${NGINX_CONFD_DIR}:/etc/nginx/conf.d
#端口映射
ports:
- "${HTTP_HOST}:80"
restart: always
5.执行构建
docker-compose up -d
小坑:一般项目入口文件是在web目录下,然而现在默认访问的是www根目录下的index.php
所以需要修改配置文件,修改下root 和php的目录,重启nginx容器即可
修改截图
重点是 nginx通过php-fpm去解析文件,所以也要把php的root路径修改下