Dcokerfile构建lnmp镜像和dokcer-compose编排容器

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路径修改下

在这里插入图片描述

发布了31 篇原创文章 · 获赞 6 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章