Создание docker с nginx + lua на CentOS7

Создание docker с nginx + lua на CentOS7

Понадобелось мне собрать docker контейнер nginx (самой последней версией) с поддрежкой lua. Я видел много готовых образов на Debian/Ubuntu и несколько для CentOS. Но мне было интересно создать свой образ на CentOS. По этому, я решил написать «Создание docker с nginx + lua на CentOS7» и рассказать как я это смог сделать.

Мой Dockerfile выглядит:

$ cat Dockerfile

А само содержание:

# get image from...
FROM centos:7
# maintainer
MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com"
# updates
RUN yum -y update; yum clean all
# install some utilites 
RUN yum install -y \
		epel-release \
		git \
		curl \
		wget \
        gcc \
        gcc-c++ \
        gd-devel \
        gettext \
        GeoIP-devel \
        libxslt-devel \
        make \
        perl \
        perl-ExtUtils-Embed \
        readline-devel \
        unzip \
        zlib-devel \
        pcre-devel
# modules
RUN cd /usr/local/src && git clone http://luajit.org/git/luajit-2.0.git && cd luajit-2.0 && make && make install
RUN cd /usr/local/src && curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz && tar zxf lua-5.3.4.tar.gz && cd lua-5.3.4 && make linux test 
RUN cd /usr/local/src && git clone https://github.com/simpl/ngx_devel_kit.git 
RUN cd /usr/local/src && git clone https://github.com/openresty/lua-nginx-module.git

RUN cd /usr/local/src && wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz && tar -xzvf pcre-8.41.tar.gz && cd pcre-8.41 && ./configure --enable-jit && make && make install
RUN cd /usr/local/src && wget https://www.openssl.org/source/openssl-1.0.2m.tar.gz && tar -xzvf openssl-1.0.2m.tar.gz && cd openssl-1.0.2m && ./config && make && make install

# tell nginx's build system where to find LuaJIT 2.0:
ENV LUAJIT_LIB /usr/local/lib/
ENV LUAJIT_INC /usr/local/include/luajit-2.0

# create group and user for nginx
RUN groupadd nginx && useradd --no-create-home nginx -g nginx

# nginx 
RUN cd /usr/local/src && wget https://nginx.org/download/nginx-1.13.7.tar.gz && tar -vzxf nginx-1.13.7.tar.gz && cd nginx-1.13.7 \

&& ./configure \
		--with-ld-opt="-Wl,-rpath,/usr/local/lib/" \
		--prefix=/etc/nginx \
		--sbin-path=/usr/sbin/nginx \
		--modules-path=/usr/lib/nginx/modules \
		--conf-path=/etc/nginx/nginx.conf \
		--error-log-path=/var/log/nginx/error.log \
		--http-log-path=/var/log/nginx/access.log \
		--pid-path=/var/run/nginx.pid \
		--lock-path=/var/run/nginx.lock \
		--http-client-body-temp-path=/var/cache/nginx/client_temp \
		--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
		--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
		--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
		--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
		--user=nginx \
		--group=nginx \
		--with-http_ssl_module \
		--with-http_realip_module \
		--with-http_addition_module \
		--with-http_sub_module \
		--with-http_dav_module \
		--with-http_flv_module \
		--with-http_mp4_module \
		--with-http_gunzip_module \
		--with-http_gzip_static_module \
		--with-http_random_index_module \
		--with-http_secure_link_module \
		--with-http_stub_status_module \
		--with-http_auth_request_module \
		--with-http_xslt_module=dynamic \
		--with-http_image_filter_module=dynamic \
		--with-http_geoip_module \
		--with-http_perl_module=dynamic \
		--with-threads \
		--with-stream \
		--with-stream_ssl_module \
		--with-stream_geoip_module=dynamic \
		--with-http_slice_module \
		--with-mail \
		--with-mail_ssl_module \
		--with-file-aio \
		--with-http_v2_module \
		--with-pcre-jit \
		--with-pcre=../pcre-8.41 \
		--with-openssl=../openssl-1.0.2m \
		--add-module=/usr/local/src/ngx_devel_kit \
		--add-module=/usr/local/src/lua-nginx-module \

&& make -j2 && make install
# Add additional binaries into PATH for convenience
ENV PATH=$PATH:/usr/local/bin/:/usr/local/sbin/:/usr/bin/:/usr/sbin/

RUN mkdir -p /var/cache/nginx/client_temp && mkdir -p /etc/nginx/conf.d

WORKDIR /usr/share/nginx/html
# Copy nginx configuration files
COPY nginx/nginx.conf /etc/nginx/nginx.conf
COPY nginx/default.conf /etc/nginx/conf.d/default.conf 

RUN echo "NGINX with lua on CentOS 7 inside Docker" > /usr/share/nginx/html/index.html 

#RUN rm -rf /usr/local/src/* \
#	&& yum clean all
RUN rm -rf /usr/local/src/*.tar.gz

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
	&& ln -sf /dev/stderr /var/log/nginx/error.log

# allow port(s) 
EXPOSE 22 80 443
#
#STOPSIGNAL SIGTERM

# This is the default CMD used by nginx:1.9.2 image
CMD ["nginx", "-g", "daemon off;"]

Создам папку «nginx» для хранения конфигов:

# mkdir nginx

И так, 1-й конфиг выглядит:

$ cat nginx/nginx.conf


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    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"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

2-й конфиг:

# cat nginx/default.conf

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /hellolua {
            content_by_lua '
                ngx.header["Content-Type"] = "text/plain";
                ngx.say("hello world");
            ';
        }

    #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/local/openresty/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           /usr/local/openresty/nginx/html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$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;
    #}
}

Собираем контейнер:

# docker build -t centos7/nginx_lua .

Я засек сколько по времени соберется образ данного Dockerfile, — и это вышло в среднем 10-11 минут.

Запускаем созданный контейнер:

$ docker run -d -p 80:80 -p 443:443 centos7/nginx_lua

Или чтобы попасть на машинку:

# docker run -t -i centos7/nginx_lua /bin/bash

Смотрим что вышло (для начала — запущен ли контейнер):

# docker container ls

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                              NAMES
aa6c96285757        centos7/nginx_lua   "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp, 22/tcp, 0.0.0.0:443->443/tcp   stoic_golick

Как видно — все огонь и можно открывать IP/domain чтобы проверить работу nginx + lua.

Чтобы остановить все контейнеры:

$ docker stop $(docker ps -a -q)

Удалить имейджи:

$ docker rmi $(docker images -a | grep -iv "REPOSITORY" | awk '{print $3}')

В процессе сборки контейнера, я столкнулся с некоторыми ошибками, первую что я получил:

getpwnam(“www”) failed in /etc/nginx/nginx.conf

Решением служило — создание группы и юзера для nginx.

А на этом, у меня все и тема «Создание docker с nginx + lua на CentOS7» завершена.

One thought on “Создание docker с nginx + lua на CentOS7

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.