php7+nginx+redis Docker 镜像制作与项目规划 redis主从建立

php7+nginx+redis Docker 镜像制作与项目规划

Dockerfile常用指令介绍

指令描述
FROM构建的新镜像是基于哪个镜像。例如:FROM centos:6
MAINTAINER镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen
RUN构建镜像时运行的Shell命令。例如:RUN ["yum","install","httpd"]

或者RUN yum install httpd
CMD运行容器时执行的Shell命令(可以被运行时传递的参数覆盖)。例如:CMD ["-c","/start.sh"]

或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D
EXPOSE声明容器运行的服务端口。例如:EXPOSE 80 443
ENV设置容器内环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456
ADD拷贝文件或目录到镜像(可以自动解压缩或者下载)

例如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html

或者:ADD html.tar.gz /var/www/html
COPY拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh
ENTRYPOINT运行容器时执行的Shell命令(不能被运行时传递的参数覆盖)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"]

或者ENTRYPOINT /bin/bash -c "/start.sh"
VOLUME指定容器挂载点到宿主机自动生成的目录或其他容器

例如:VOLUME ["/var/lib/mysql"]
USER为RUN,CMD和ENTRYPOINT执行命令指定运行用户

例如:USER Mr_chen
WORKDIR为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。

例如:WORKDIR /data
HEALTHCHECK健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3

CMD curl -f http://localhost/ || exit 1
ARG在构建镜像时指定一些参数。例如:ARG user

自定义网络环境

docker network create --subnet 192.168.1.0/24 myredis


PHP容器创建:Dockerfile文件

php容器创建说明:

1、yum+remi安装php及扩展,仅能安装php扩展的最新版本,如果需要安装稳定版本则使用编译安装方式

2、php容器中创建的/www目录,在docker run时映射/data/www/html/:/www   (/data/www/html/目录为php文件目录)

FROM centos

# Version
ENV PHPREDIS_VERSION 4.0.0

#安装常用软件
RUN  yum install -y wget \
                    vim \
                    curl \
                    zip \
                    unzip \
                    gcc gcc-c++ autoconf automake make zlib zlib-devel net-tools openssl* pcre* && \
     yum clean all && \
     rm -rf /var/cache/yum/*
#备份centos7源
RUN  mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup && \
#下载centos7源文件到yum.repos.d文件夹下
     wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

RUN yum install -y epel-release \
    http://rpms.remirepo.net/enterprise/remi-release-7.rpm \
    yum-utils && \
    yum update -y && \
    yum-config-manager --enable remi-php74 && \
    yum clean all && \
    rm -rf /var/cache/yum/*

#安装php7.4
RUN yum install -y php74 && \
#安装php相关扩展
    yum install -y php74-php-fpm php74-php-gd php74-php-json php74-php-mbstring php74-php-mysqlnd php74-php-xml php74-php-xmlrpc php74-php-opcache php74-pdo_mysql php74-php-pcntl php74-php-sysvmsg php74-php-redis php74-php-swoole && \
#清空
    yum clean all && rm -rf /var/cache/yum/*

RUN groupadd www && useradd -g www -M www && mkdir -p /www && chown -R www:www /www

RUN sed -i 's/^daemonize = yes$/daemonize = no/g' /etc/opt/remi/php74/php-fpm.conf && \
    sed -i 's/^listen = 127.0.0.1:9000$/listen = 192.168.1.2:9000/g' /etc/opt/remi/php74/php-fpm.d/www.conf && \
    sed -i 's/^;request_terminate_timeout = 0$/request_terminate_timeout = 0/g' /etc/opt/remi/php74/php-fpm.d/www.conf && \
    sed -i 's/^listen.allowed_clients = 127.0.0.1$/listen.allowed_clients = 192.168.1.3/g' /etc/opt/remi/php74/php-fpm.d/www.conf
#    sed -i 's/^;chdir = \/var\/www$/chdir = \/www/g' /etc/opt/remi/php74/php-fpm.d/www.conf
# docker方式安装PDO extension                                    # 安装扩展
#RUN docker-php-ext-install pdo_mysql && \ 
#    docker-php-ext-install pcntl && \ 
#    docker-php-ext-install sysvmsg

#安装php-pecl
#RUN yum install -y php-devel php-pear httpd-devel

# Redis extension
#RUN wget http://pecl.php.net/get/redis-${PHPREDIS_VERSION}.tgz -O /tmp/redis.tar.tgz \
#    && pecl install /tmp/redis.tar.tgz \
#    && rm -rf /tmp/redis.tar.tgz \
#    && docker-php-ext-enable redis
# 修改php.ini的文件 extension=redis.so

#WORKDIR
EXPOSE 9000
ENTRYPOINT ["/opt/remi/php74/root/usr/sbin/php-fpm","-c","/etc/opt/remi/php74/php-fpm.conf"]

生成docker镜像:

docker build -t php7.4.0 .

运行php容器:

docker run -itd -v /data/www/html/:/www -p 9000:9000 --net myredis --ip 192.168.1.2 --name php php7.4.0


准备nginx配制文件如下(nginx.conf):

user  root;
worker_processes  1;  
events {
    worker_connections  1024;
}
http {
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile        on; 
    keepalive_timeout  65; 
    server {
            listen       80; 
            access_log  /data/nginx/logs/$host  main;
            location / { 
                root   /data/www;
                default_type text/html;
            }   
            location  ~ \.php/?.*  {
                    default_type text/html;
                    #做php-fpm 配置,注意地址
                    root           /www;  #php-fpm容器当中的路径,不是nginx容器路径
                    fastcgi_index  index.php;
                    fastcgi_pass   192.168.1.2:9000; #php容器端口
                    #为php-fpm指定的根目录
                    fastcgi_param  SCRIPT_FILENAME  $DOCUMENT_ROOT$fastcgi_script_name;
                    #注意是容器当中的位置
                    #定义变量 $path_info ,用于存放pathinfo信息
                    set $path_info ""; 
                    if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                            #将文件地址赋值给变量 $real_script_name
                            set $real_script_name $1; 
                                #将文件地址后的参数赋值给变量 $path_info
                            set $path_info $2; 
                        }   
                         #配置fastcgi的一些参数
                        fastcgi_param SCRIPT_NAME $real_script_name;
                        fastcgi_param PATH_INFO $path_info;
                        include        /data/nginx/conf/fastcgi_params;
                        }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                  root   html;
            }
        }
}


nginx容器创建:Dockerfile文件

nginx容器说明:nginx.conf配制文件,web运行目录映射到宿主机磁盘中。

FROM centos

#安装常用软件
RUN  yum update -y && \
     yum install -y wget \
                    vim \
                    gcc gcc-c++ autoconf automake make zlib zlib-devel net-tools openssl* pcre* \
                    epel-release  \
                    centos-release-scl-rh -y && \
     yum clean all && rm -rf /var/cache/yum/*

#备份centos7源
RUN  mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup && \
#下载centos7源文件到yum.repos.d文件夹下
     wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#生成缓存
#     yum makecache


RUN  groupadd -r nginx && useradd -r -g nginx nginx


RUN  mkdir -p /data/nginx && mkdir /data/www && mkdir /data/conf

RUN  wget http://nginx.org/download/nginx-1.16.1.tar.gz && \
     tar vfxz nginx-1.16.1.tar.gz && cd nginx-1.16.1 && \
     ./configure --prefix=/data/nginx --user=nginx --group=nginx && make && make install && \
     ln -s /data/nginx/sbin/* /usr/local/sbin && \
     rm -rf /nginx-1.16.1.tar.gz && rm -rf /nginx-1.16.1
#COPY nginx.conf /data/nginx/conf/

#修改时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

#声明端口
EXPOSE 80

#添加匿名卷
#VOLUME /test

#容器启动时执行,第一个进程,禁止后台运行 CMD命令会被docker run 指命修改
#CMD ["/data/nginx/sbin/nginx","-c","/data/nginx/conf/nginx.conf","-g","daemon off;"]
#运行一个指令
ENTRYPOINT ["/data/nginx/sbin/nginx","-c","/data/conf/nginx.conf","-g","daemon off;"]

创建镜像:

docker build -t nginx1.6 .

运行容器:

docker run -itd --name nginx --net myredis --ip 192.168.1.3 -p 8000:80 -v /data/www/html/:/data/www -v /data/docker-instance/nginx/conf/:/data/conf nginx1.6


Redis主从规划:

容器名称
容器IP地址映射端口号宿主机IP地址
服务器运行模式
redis-master
192.168.1.56380->6379192.168.1.1master
redis-slave192.168.1.6
6381->6379192.168.1.1slave

Redis配制文件修改:

dir:dir "/data/redis/data"  数据持久化存放目录
logfile "/data/redis/log/redis.log"   日志存放目录
daemonize no   禁止后台运行
requirepass xxxx   安全密码

Redis镜像创建:Dockerfile文件

redis数据存放data,配制文件conf

#获取镜像操作系统
FROM centos
RUN yum -y install gcc g++ libc-dev  wget net-tools vim  openssl-dev make  linux-headers && \
    yum -y update && yum -y install epel-release && \
    yum clean all && rm -rf /var/cache/yum/*
#备份centos7
RUN  mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup && \
#下载centos7源文件到yum.repos.d文件夹下
     wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN groupadd -r redis && useradd -r -g redis redis && \
#安装redis
    mkdir -p /data/redis/{conf,data,log} && mkdir -p /var/log/redis && chown -R redis:redis /data/redis
#COPY conf/redis.conf /data/redis/config/
RUN wget http://download.redis.io/releases/redis-4.0.11.tar.gz && \
    tar vfxz redis-4.0.11.tar.gz && \
    rm -rf redis-4.0.11.tar.gz && \
    cd redis-4.0.11 && \
    make && make PREFIX=/data/redis install && \
    ln -s /data/redis/bin/* /usr/local/bin/ && \
    cd ../ && rm -rf redis-4.0.11
#RUN yum clean all && rm -rf /var/cache/yum/*
#设置工作目录
WORKDIR /data
CMD ["/usr/local/bin/redis-server", "/data/redis/conf/redis.conf"]

运行Redis-Master容器:

docker run -itd -v /data/docker-instance/redis/master/conf:/data/redis/conf -v /data/docker-instance/redis/master/data:/data/redis/data -p 6380:6379 --network=myredis --ip=192.168.1.5 --name redis-master redis4.0

运行Redis-Slave容器:

docker run -itd -v /data/docker-instance/redis/slave/conf:/data/redis/conf -v /data/docker-instance/redis/slave/data:/data/redis/data -p 6381:6379 --network=myredis --ip=192.168.1.6 --name redis-slave redis4.0

设置主从服务:

如果主服务有密码,从配制文件中 masterauth 设置密码

1、在slave中进入redis:         redis-cli -a 123456
2、命令模式连接执行              slaveof 192.168.1.5 6379
     (或者配制文件修改 slaveof ip port)
3、查看是否建立成功              info replication

redis info replication

4、master: set shengang ;     slave: keys *


相似文章参考:https://www.cnblogs.com/ywrj/p/9594869.html

猜您喜欢
    0条评论