Устанавливаем чистую операционную систему. Образ можно взять
тут.
Обновляем все пакеты:
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