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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章