30.3.18

Docker на Debian Stretch. Краткий справочник на примере сборки Debian Stretch с Nginx на борту

Устанавливаем чистую операционную систему. Образ можно взять тут.

Обновляем все пакеты:
apt-get update && apt-get upgrade

Ставим дополнительные пакеты:
apt-get install apt-transport-https ca-certificates curl software-properties-common

Добавляем ключь GPG от репозитория Docker:
cd /temp && wget https://download.docker.com/linux/debian/gpg
apt-key add gpg

Добавляем репозиторий:
echo "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee -a /etc/apt/sources.list.d/docker.list

Обновляем базу репозиториев и устанавливаем Docker:
apt-get update && apt-get install docker-ce

Запускаем и прописываем автостарт:
systemctl start docker && systemctl enable docker

Проверяем версию Docker:
docker --version

Удаляем ненужные остатки после установки:
apt-get autoremove && apt-get autoclean && apt-get clean

Очищаем экран консоли:
clear

Очищаем историю консоли:
history -c

***


Запускаем установленную операционную систему и создаем образ из которого будем запускать контейнеры

Образ собирается на основе Dockerfile, в котором описаны все инструкции

Пример Dockerfile для сборки образа сервера Nginx с Lua-модулем на базе Debian Stretch

FROM debian:9.4
MAINTAINER kvvlgua@gmail.com
RUN apt update; apt upgrade; apt clean all
RUN apt remove nginx-common
RUN apt install -y \
        libgdchart-gd2-xpm \
        libgdchart-gd2-xpm-dev \
        libgeoip-dev \
        autoconf \
        automake \
        autotools-dev \
        bsdmainutils \
        build-essential \
        cmake \
        make \
        doxygen \
        git \
        curl \
        wget \
        gcc \
        zlib1g-dev \
        libpcre3-dev \
        libxslt1-dev \
        libboost-all-dev \
        libreadline-dev \
        libperl-dev \
        libssl-dev \
        libtool \
        ncurses-dev \
        supervisor \
    && \
    apt-get clean all && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN mkdir -p /var/log/supervisor
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 \
    && wget http://zlib.net/zlib-1.2.11.tar.gz \
    && tar -zxf zlib-1.2.11.tar.gz \
    && cd zlib-1.2.11 \
    && ./configure \
    && 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.42.tar.gz \
    && tar -xzvf pcre-8.42.tar.gz \
    && cd pcre-8.42 \
    && ./configure --enable-jit \
    && make \
    && make install
RUN cd /usr/local/src \
    && wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz \
    && tar -xzvf openssl-1.1.0h.tar.gz \
    && cd openssl-1.1.0h \
    && ./config \
    && make \
    && make install
ENV LUAJIT_LIB /usr/local/lib/
ENV LUAJIT_INC /usr/local/include/luajit-2.0
RUN groupadd nginx \
    && useradd --no-create-home nginx -g nginx
RUN cd /usr/local/src \
    && wget https://nginx.org/download/nginx-1.13.10.tar.gz \
    && tar -vzxf nginx-1.13.10.tar.gz \
    && cd nginx-1.13.10 \
    && ./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.42 \
        --with-openssl=../openssl-1.1.0h \
        --add-module=/usr/local/src/ngx_devel_kit \
        --add-module=/usr/local/src/lua-nginx-module \
    && make -j2 \
    && make install   
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 conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY conf/nginx/nginx.conf /etc/nginx/nginx.conf
COPY conf/nginx/default.conf /etc/nginx/conf.d/default.conf
RUN echo "NGINX with lua on Debian 9 inside Docker" > /usr/share/nginx/html/index.html
RUN apt clean all
RUN rm -rf /usr/local/src/*.tar.gz
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 22 80 443
CMD ["nginx", "-g", "daemon off;"]






Фактически это набор команд по установке окружения, необходимого для работы сервера Nginx

FROM - указывает на базе какого образа осуществляется сборка
MAINTAINER - указывает автора сборки
ENV PATH - пробрасывает реальное окружение хоста во внутрь контейнера
RUN - фактически выполняет команды консоли в процессе сборки. После каждого RUN состояние образа фиксируется
WORKDIR - устанавливает рабочий каталог для любых инструкций RUN, CMD, ENTRYPOINT, COPY и ADD, которые следуют за ним в Dockerfile
COPY - копирует файлы из файловой системы хоста в файловую систему образа
EXPOSE - порты, доступные в образе
CMD - предоставление значений по умолчанию для исполняющего контейнера. Эти значения по умолчанию могут включать исполняемый файл, или они могут опустить исполняемый файл, и в этом случае вы должны указать инструкцию ENTRYPOINT
 ENTRYPOINT - при запуске контейнера параметры передаются команде, указанной в ENTRYPOINT

В данном примере ENTRYPOINT не используется. Сервер стартует за счет CMD

Создаем папку docker, в ней conf, а в nginx и заходим в каталог docker
mkdir -p docker/conf/nginx/
cd docker


Создаем в каталоге docker файл Dockerfile с указанным выше содержимым
touch Dockerfile
vi Dockerfile

Можно воспользоваться SCP клиентом или tftp сервером и положить уже подготовленный файл

В каталоге docker/conf размещаем supervisord.conf, а в docker/conf/nginx - nginx.conf и default.conf


supervisord.conf:

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D  "daemon off;"

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"



nginx.conf:

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;
}





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
docker build -t deb9-nginx-lua .



Выполняем публикацию образа в Registry
docker push


Выполняем публикацию образа в Docker Hub / Docker Cloud, предварительно зарегистрировавшись там.
Имя аккаунта Docker Hub = user_name
Имя собранного образа = image_name

    docker login
    export DOCKER_ID_USER="user_name"
    docker tag image_name $DOCKER_ID_USER/image_name
    docker push $DOCKER_ID_USER/image_name

Соответственно для нашего образа и пользователя Docker Cloud vintagemen, у нас получится следующее:

    docker login
    export DOCKER_ID_USER="vintagemen"
    docker tag deb9-nginx-lua $DOCKER_ID_USER/deb9-nginx-lua
    docker push $DOCKER_ID_USER/deb9-nginx-lua

Смотрим список образов Docker после завершения сборки
docker container ls

Запускаем созданный контейнер
docker run -d -p 80:80 -p 443:443 deb9-nginx-lua

Или чтобы попасть на машинку
docker run -t -i deb9-nginx-lua /bin/bash

Список доступных образов
docker images

Скачать образ (или весь репозиторий) из официального регистра (хранилища образов)
docker pull user_name/image_name

Посмотреть информацию об образе
docker inspect deb9-nginx-lua

Удалить образ
docker rmi deb9-nginx-lua

Вы должны будете вручную запускать нужные демоны или супервизор после старта контейнера
docker exec CONTAINER_ID bash -c "service ssh start"

Список всех контейнеров (запущенных и остановленных)
docker ps -a

Список запущенных контейнеров
docker ps

Удалить контейнер(ы)
docker rm CONTAINER_ID CONTAINER_ID

Удалить все контейнеры
docker rm $(docker ps -aq)

Общая информация о состоянии Docker
docker info

Комментариев нет:

Отправить комментарий