目录

 

一、创建lnmp的相关镜像

1.1、dockerfile创建php7.2.16镜像

1. 2、dockerfile创建nginx-1.15.7镜像

1.3、mysql镜像是直接在docker仓库上pull

二、通过dockerpose-compose运行lnmp环境

 2.1、安装docker-compose

 2.2、用docker-compose运行lnmp环境并挂载docker容器数据目录到本地目录

 2.3、用docker-compose运行并管理lnmp环境

dockerfile的lnmp环境大功告成!



       现在说虚拟化技术的话,docker是最火的技术之一了,在生产环境中,越来越多业务需求用到docker去部署环境了!这篇文章讲的就是怎样用dockerfile去创建lnmp的各部件的镜像,docker-compose运行lnmp的环境!

      注意:搞docker的环境时,切记把selinux关了,否则docker很多服务会起不来,比较挂载docker内部的目录到宿主主机时,由于selinux是开启了,就会导致docker的状态是Restarting。所以一般都是把selinux给关了,用以下命令

sed  -i "s/^SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config 
或sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

 

一、创建lnmp的相关镜像

  • 1.1、dockerfile创建php7.2.16镜像

FROM centos:latest
MAINTAINER https://blog.csdn.net/lituxiu
ENV TIME_ZOME Asia/Shanghai
ARG WJ="php-7.2.16"
# wget https://www.php.net/distributions/php-7.2.16.tar.gz

ADD $WJ.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel bison \
    && mkdir -p /usr/php/etc \
    && cd /tmp/$WJ \
    && ./configure --prefix=/usr/php \
        --with-config-file-path=/usr/php/etc \
        --with-gd --with-mysqli \
        --with-openssl --with-zlib --with-curl \
        --with-jpeg-dir --with-png-dir --with-iconv \
        --enable-fpm --enable-zip --enable-mbstring \
    && make -j 4 \   
    && make install \
    && cp /usr/php/etc/php-fpm.conf.default /usr/php/etc/php-fpm.conf \
    && cp /usr/php/etc/php-fpm.d/www.conf.default /usr/php/etc/php-fpm.d/www.conf \
    && sed -i '/;daemonize/a\daemonize = no' /usr/php/etc/php-fpm.conf \
    && sed -i 's/127.0.0.1/0.0.0.0/g' /usr/php/etc/php-fpm.d/www.conf \
    && echo "${TIME_ZOME}" > /etc/timezone \
    && ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \
    && rm -rf /tmp/php* \
    && yum clean all \
    && yum -y remove gcc gcc-c++ make

WORKDIR /usr/php/
EXPOSE 9000
CMD ["sbin/php-fpm","-c","etc/php-fpm.conf"]

文件结构:

[root@dingzhi ~]# tree php7.2.16/
php7.2.16/
├── dockerfile
└── php-7.2.16.tar.gz

创建php镜像php7.2.16:latest

[root@dingzhi ~]# cd php7.2.16/
[root@dingzhi php7.2.16]# docker build -t php7.2.16:latest ./

(注意: docker build创建镜像时,注意文件路径的上下文,一般是在dockerfile的 ./ 当前目录里创建)

说明:

#      cp /tmp/php-7.2.16/php.ini-production /usr/php/etc/php.ini \ 普通源码安装时的php.ini是要复制php.ini-production改名的,这里只安装好php的模块,只修改php-fpm配置文件,启动php-fpm服务。

    make -j 4 是指定4个并行运行的任务数,即4个编译的任务程序同时运行,提高速度(注意cpu瓶颈,如果提供了多个-j,最后一个才是有效的)。

#    echo "${TIME_ZOME}" > /etc/timezone 和 ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime是修改时区为shanghai。

  daemonize = no 是php-fpm服务在前台启动,因为要后台启动容器的话,必须起的容器服务是前台运行,否则启动容器后就会莫名其妙自动退出。

 

  • 1. 2、dockerfile创建nginx-1.15.7镜像

FROM centos:latest
MAINTAINER https://blog.csdn.net/lituxiu
ENV TIME_ZOME Asia/Shanghai
ARG WJ="nginx-1.15.7"
#wget http://nginx.org/download/nginx-1.15.7.tar.gz

#COPY nginx.conf /usr/local/nginx/
ADD $WJ.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel zlib-devel \
        && mkdir -p /usr/local/nginx \
        && cd /tmp/$WJ \
        && ./configure --prefix=/usr/local/nginx  --with-stream --with-http_ssl_module \
        && make -j 4 \
        && make install \
        && echo "${TIME_ZOME}" > /etc/timezone \
        && ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \
        && rm -rf /tmp/nginx* \
        && yum clean all \
        && yum -y remove gcc gcc-c++ make \
        && ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

WORKDIR /usr/local/nginx/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

文件结构:

[root@dingzhi ~]# tree nginx1.15.7/
nginx1.15.7/
├── dockerfile
└── nginx-1.15.7.tar.gz

创建nginx镜像nginx1.15,7:latest

[root@dingzhi ~]# cd nginx1.15.7/
[root@dingzhi nginx1.15.7]# docker build -t nginx1.15.7:latest ./

说明:

#   daemon off表示nginx服务前台启动

#   COPY nginx.conf /usr/local/nginx/这行在nginx的dockerfile里我是注释掉的,用默认的。如果想要用自己修改的nginx.conf,只要把修改好的nginx.conf与dockerfile同一目录路径,COPY那行去注释。

#  注意: nginx.conf的location ~ \.php$配置的这一块要修改下。

 location ~ \.php$ {
            root           html;
            fastcgi_pass   php:9000;   #php容器名称和端口号
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  #使用root指定的路径
            include        fastcgi_params;

注意!注意!注意!

        重要的事情要说三遍:这里的nginx连接php-fpm时,在php容器里运行php-fpm的用户为nobody。可能有某些生产环境要求权限较高时,有可能存在nginx容器连接php容器的php-fpm服务实现不了功能的情况,不过简单显示连接mysql数据库是没问题的。

扩展:

        nobody就是一个普通账户,因为默认登录shell是 '/sbin/nologin',所以这个用户是无法直接登录系统的,也就是黑客很难通过漏洞连接到你的服务器来做破坏。此外这个用户的权限也给配置的很低。因此有比较高的安全性。一切都只给最低权限。这就是nobody存在的意义。

  • 1.3、mysql镜像是直接在docker仓库上pull

命令为:

docker pull mysql:5.7
[root@dingzhi ~]# docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ... 
5.7: Pulling from docker.io/library/mysql
27833a3ba0a5: Pull complete 
864c283b3c4b: Pull complete 
cea281b2278b: Pull complete 
8f856c14f5af: Pull complete 
9c4f38c23b6f: Pull complete 
1b810e1751b3: Pull complete 
5479aaef3d30: Pull complete 
1d924ec3d520: Pull complete 
1ab7ae63ac60: Pull complete 
08aa5f3680e9: Pull complete 
a832d0a0972a: Pull complete 
Digest: sha256:dba5fed182e64064b688ccd22b2f9cad4ee88608c82f8cff21e17bab8da72b81
Status: Downloaded newer image for docker.io/mysql:5.7

建议直接使用docker官方mysql镜像,通过dockerfile源码编译安装mysql镜像,最后生成的镜像大小超1G,docker官方mysql5.7镜像才400M不到。

二、通过dockerpose-compose运行lnmp环境

  •  2.1、安装docker-compose

先到Docker-compose官网下载

下载最新版本docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

[root@dingzhi ~]# chmod +x /usr/local/bin/docker-compose
[root@dingzhi ~]# docker-compose -v
docker-compose version 1.24.0, build 0aa59064

说明:

# 添加x执行权限后,docker-compose执行失败,一般是环境变量路径,请执行以下命令ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 如果想删除docker-compose的话,直接在rm -rf /usr/local/bin/docker-compose

# Docker-compose -v  #查看docker-compose版本

# Docker-compose操作容器的命令是基于存放docker-compose.yml文件的目录里输出的,否则,就会以下错误!!!

  •  2.2、用docker-compose运行lnmp环境并挂载docker容器数据目录到本地目录

查看php、nginx和mysql容器id

[root@dingzhi ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx1.15.7         latest              4b05c87dcbec        3 hours ago         302 MB
php7.2.16           latest              3428fd528787        4 hours ago         627 MB
docker.io/mysql     5.7                 98455b9624a9        2 weeks ago         372 MB
docker.io/centos    latest              9f38484d220f        4 weeks ago         202 MB

编辑docker-compose.yml

version: '2'
services:
  nginx:
    image: 4b05c87dcbec
    container_name: 'nginx'
    restart: 'always'
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/data/nginx/html:/usr/local/nginx/html"
      - "/data/nginx/logs/:/usr/local/nginx/logs/"
      - "/data/nginx/conf/:/usr/local/nginx/conf/"
    networks:
      dangjian:
        ipv4_address: 172.19.0.2

  php:
    image: 3428fd528787 
    container_name: 'php'
    restart: 'always'
    ports:
      - "9000:9000"
    volumes:
      - "/data/nginx/html:/usr/local/nginx/html"
    networks:
      dangjian:
        ipv4_address: 172.19.0.3


  mysql:
    image: 98455b9624a9
    container_name: 'mysql'
    restart: 'always'
    ports:
      - "3306:3306"
    volumes:
      - "/data/mysql/data/:/var/lib/mysql/"
      - "/data/mysql/conf/:/etc/mysql/conf.d/"

    environment:
      MYSQL_ROOT_PASSWORD: 123456
    networks:
      dangjian:
        ipv4_address: 172.19.0.4

networks:
   dangjian:
      ipam:   #切记这里的“ipam:”改动就报错
         config:
         - subnet: 172.19.0.0/16
           gateway: 172.19.0.1

创建本地挂载的目录

nginx目录

mkdir -p /data/nginx/{conf,html,logs}

mysql目录

mkdir -p /data/mysql/{conf,data}

由于mysql容器的/etc/mysql/my.cnf里的配置内容为:(注意感叹号

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

#注意!includedir /etc/mysql/conf.d/包含/etc/mysql/conf.d/目录下的*.cnf配置内容

#实现验证为# cat /data/mysql/conf/my.cnf 
[mysqld]
skip-grant-tables
启动mysql容器可以实现在mysql容器内直接用mysql命令登录数据库

#注意  !includedir /etc/mysql/conf.d/包含/etc/mysql/conf.d/目录下的*.cnf配置内容

#注意 本地的/data/nginx/conf/里要有nginx.conf文件,要不启动nginx容器会报错

  •  2.3、用docker-compose运行并管理lnmp环境

docker-compose命令必须在存在docker-compose.yml目录下输入

启动lnmp
~]# docker-compose up -d

常用的docker-compose命令

docker-compose up -d           #后台docker-compose.yml所有容器
docker-compose down            #关闭docker-compose.yml所有容器
docker-compose ps              #查看所有容器的状态
docker-compose restart 容器名   #重启启动某个容器

更多的docker-compose命令的话,请查看docker-compose -h

验证

[root@dingzhi ~]# vi /data/nginx/html/test.php
<?php
    echo "Hello lituxiu<br/>";
    echo "Hello PHP<br/>";
    $conn = mysqli_connect("mysql","test","123456");
    if(!$conn){
        echo "连接数据库失败";
    }else{
        echo "连接数据库成功";
    }
    phpinfo();
?>

浏览器访问:http://192.168.21.140/test.php

dockerfile的lnmp环境大功告成!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐