Docker – это виртуализация на уровне операционной системы, предназначенная в основном для разработчиков и системных администраторов. Docker облегчает создание и развертывание приложений в изолированной среде.
Dockerfile – это сценарий, который содержит наборы команд и инструкций, которые будут автоматически выполняться последовательно в среде Docker для создания нового образа Docker.
Рассмотрим как создать свой собственный образ Docker с помощью Dockerfile.
Будем использовать Ubuntu 20.04 с 1 ГБ ОЗУ, 32ГБ свободного дискового пространства и 2 CPU. Также мы будем использовать Ubuntu 20.04 в качестве базового образа для создания собственного образа Docker.

Команды Dockerfile

Dockerfile – это скрипт, который содержит в себе инструкции, которые будут использоваться для создания образа Docker с помощью команды «docker build».
Для создания Dockerfile нужно знать некоторый его команды.

FROM

Инструкция FROM инициализирует новый этап сборки и должна располагаться в верхней части Dockerfile.

LABEL

С помощью этой инструкции вы можете добавить дополнительную информацию о вашем образе Docker, такую ​​как версия, описание и т.д.

RUN

Эта инструкция используется для выполнения команды в процессе сборки образа Docker. Вы можете установить дополнительные пакеты, необходимые для ваших образов Docker.

ADD

Инструкция ADD используется для копирования файлов, каталогов или файлов из удаленных русурсов в ваши образы Docker. Кроме того, вы можете настроить права на файл по умолчанию.

ENV

Инструкция ENV используется для определения переменной среды, которая может использоваться на этапе сборки.

CMD

CMD используется для определения команды по умолчанию для выполнения при запуске контейнера. Dockerfile должен содержать только одну инструкцию CMD, и, если имеется несколько CMD, будет выполняться последняя инструкция CMD.

EXPOSE

Эта инструкция используется для предоставления порта контейнера на определенных сетевых портах во время выполнения. По умолчанию используется протокол TCP, но вы можете указать, будет ли он TCP или UDP.

ARG

Инструкция ARG используется для определения переменной, которую пользователь может передать сборщику образа. Вы можете использовать эту инструкцию в docker ‘build command’ во время сборки, используя опцию ‘–build-arg variable = value’. Также вы можете использовать несколько ARG в Dockerfile.

ENTRYPOINT

Инструкция ENTRYPOINT используется для определения первой команды и команды по умолчанию, которая будет выполняться при запуске контейнера. Определите команду для запуска приложения с помощью инструкции ENTRYPOINT.

WORKDIR

Инструкция WORKDIR используется для определения рабочего каталога по умолчанию вашего образа Docker. Инструкции RUN, CMD, ENTRYPOINT и ADD следуют за инструкцией WORKDIR. Вы можете добавить несколько инструкций WORKDIR в ваш Dockerfile. Если она не существует, она будет создана автоматически.

USER

Инструкция USER используется для определения пользователя или gid по умолчанию при запуске образа. RUN, CMD и ENTRYPOINT следуют за инструкциям USER в Dockerfile.

VOLUME

Инструкция VOLUME используется для создания точки монтирования между контейнером и базовым хостом.

1. Установка Docker в Ubuntu 20.04

Для начала установим Docker в нашу систему.

Обновите список всех пакетов в репозитории Ubuntu и установите Docker с помощью команды apt ниже.

sudo apt update && sudo apt install docker.io

По окончанию установки запустим службу Docker и добавим ее в автозагрузку.

systemctl start docker && systemctl enable docker

Убедимся что сервис Docker запущен.

systemctl status docker

Для проверки правильности установки запустим тестовый образ.

docker run hello-world

Результатом выполнения команды будет следующее:

Вы получаете сообщение “Hello World” от Docker. Установка Docker в Ubuntu 20.04 была успешно завершена.

2. Создание Dockerfile и других файлов конфигурации.

Теперь рассмотрим как сделать собственный образ Docker для вашего приложения, используя Dockerfile. Мы создадим новый пользовательский образ Docker на основе Ubuntu 20.04 с Nginx и PHP-FPM.

Создадим новый каталог проекта и добавим в него пустой файл Dockerfile.

mkdir -p nginx-image; cd nginx-image/
touch Dockerfile

Начнем создавать Dockerfile.

nano Dockerfile

В верхней части строки добавьте образ Ubuntu 20.04 для базового образа, используя инструкцию FROM, как показано ниже.

#Download base image ubuntu 20.04
FROM ubuntu:20.04

Добавим подробную информацию о пользовательском образе, используя инструкцию LABEL.

# LABEL about the custom image
LABEL maintainer="admin@admin812.ru"
LABEL version="0.1"
LABEL description="This is custom Docker Image for \
the PHP-FPM and Nginx Services."

Используя переменную среды ‘DEBIAN_FRONTEND = noninteractive’ мы предотвратим интерактивные запросы при запуске команды apt.

# Disable Prompt During Packages Installation
ARG DEBIAN_FRONTEND=noninteractive

Перед установкой любых пакетов будем выполнять команду «apt update»

# Update Ubuntu Software repository
RUN apt update

Теперь установим пакеты Nginx, PHP-FPM и supervisor. По завершению установки чтобы уменьшить размер пользовательского образа удалим кэш всех пакетов, .

# Install nginx, php-fpm and supervisord from ubuntu repository
RUN apt install -y nginx php-fpm supervisor && \
rm -rf /var/lib/apt/lists/* && \
apt clean

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

#Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.4/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf

Теперь скопируем конфигурацию Nginx по умолчанию в переменную ‘nginx_vhost’, заменим в файле конфигурации php.ini’cgi.fix_pathinfo = 1′ на ‘cgi.fix_pathinfo = 0’ и добавим опцию ‘daemon off’ в ‘nginx_conf’.

# Enable PHP-fpm on nginx virtualhost configuration
COPY default ${nginx_vhost}
RUN sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' ${php_conf} && \
echo "\ndaemon off;" >> ${nginx_conf}

Скопируем пользовательскую конфигурацию в переменную ‘supervisor_conf’.

#Copy supervisor configuration
COPY supervisord.conf ${supervisor_conf}

Изменим владельца корневого каталога веб-сервера «/var/www/html», создадим новый каталог «/run/php» и назначим права на него пользователю «www-data».

RUN mkdir -p /run/php && \
chown -R www-data:www-data /var/www/html && \
chown -R www-data:www-data /run/php

Определите том для пользовательского образа, чтобы мы могли смонтировать все эти каталоги на хост-машине.

# Volume configuration
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

Теперь добавим скрипт start.sh и определим команду контейнера по умолчанию, используя инструкцию CMD, как показано ниже.

# Copy start.sh script and define default command for the container
COPY start.sh /start.sh
CMD ["./start.sh"]

И, наконец, с помощью команды EXPOSE откроем в контейнере порты HTTP и HTTPS.

# Expose Port for the Application
EXPOSE 80 443

Сохранить (Ctrl+O)и закрыть (Ctrl+X).

Полный текст скрипта Dockerfile, который должен был получится:

# Download base image ubuntu 20.04
FROM ubuntu:20.04

# LABEL about the custom image
LABEL maintainer="admin@admin812.ru"
LABEL version="0.1"
LABEL description="This is custom Docker Image for \
the PHP-FPM and Nginx Services."

# Disable Prompt During Packages Installation
ARG DEBIAN_FRONTEND=noninteractive

# Update Ubuntu Software repository
RUN apt update

# Install nginx, php-fpm and supervisord from ubuntu repository
RUN apt install -y nginx php-fpm supervisor && \
    rm -rf /var/lib/apt/lists/* && \
    apt clean
    
# Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.4/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf

# Enable PHP-fpm on nginx virtualhost configuration
COPY default ${nginx_vhost}
RUN sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' ${php_conf} && \
    echo "\ndaemon off;" >> ${nginx_conf}
    
# Copy supervisor configuration
COPY supervisord.conf ${supervisor_conf}

RUN mkdir -p /run/php && \
    chown -R www-data:www-data /var/www/html && \
    chown -R www-data:www-data /run/php
    
# Volume configuration
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

# Copy start.sh script and define default command for the container
COPY start.sh /start.sh
CMD ["./start.sh"]

# Expose Port for the Application 
EXPOSE 80 443

Далее мы создадим новую дополнительную конфигурацию для Nginx, supervisord и сценария start.sh.

Конфигурация виртуального хоста Nginx по умолчанию будет содержать раздел для PHP-FPM. По сути, вы можете запустить скрипт PHP, используя пользовательский образ без каких-либо изменений.

Создайте новую конфигурацию виртуального хоста Nginx .

nano default

Вставим следующие строки:

server {
    listen 80 default_server;
 
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
 
    server_name _;
 
    location / {
        try_files $uri $uri/ =404;
    }
 
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
}

Далее создадим конфигурацию ‘supervisrod.conf’, которая будет содержать некоторые параметры  Nginx и PHP-FPM.

nano supervisord.conf

Вставим следующее:

[unix_http_server]
file=/dev/shm/supervisor.sock   ; (the path to the socket file)
 
[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)
user=root             ;

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
 
[supervisorctl]
serverurl=unix:///dev/shm/supervisor.sock ; use a unix:// URL  for a unix socket
 
[include]
files = /etc/supervisor/conf.d/*.conf
 
[program:php-fpm7.4]
command=/usr/sbin/php-fpm7.4 -F
numprocs=1
autostart=true
autorestart=true
 
[program:nginx]
command=/usr/sbin/nginx
numprocs=1
autostart=true
autorestart=true

Теперь создадим скрипт ‘start.sh’, он будет содержать команду supervisord для запуска.

nano start.sh

Вставьте в него следующее:

#!/bin/sh
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf

Сохраните и закройте файл.

Сделаем его исполняемым

chmod +x start.sh

В результате была создана вся конфигурация для нашего пользовательского образа Docker.

tree .

Теперь мы готовы создать новый пользовательский образ на основе этих конфигураций.

 

3. Создадим и запустим новый пользовательский контейнер.

Чтобы создать собственный образ Docker, перейдите в каталог проекта ‘nginx-image’ и выполните команду ‘docker build’, как показано ниже.

docker build -t nginx-image

Команда загрузит базовый образ Ubuntu 20.04 и создаст новый пользовательский образ с именем ‘nginx-image.

После завершения всего процесса проверьте список доступных образов Docker в вашей системе, используя следующую команду.

docker image ls

Ниже приведен результат, который вы получите.

Новый пользовательский образ Docker ‘nginx-image’ был создан.

Далее мы запустим новый контейнер Docker на основе ‘nginx-image’.

На вашем локальном компьютере создайте новый каталог с именем «webroot», который будет использоваться для хранения всех файлов веб-сервера.

mkdir -p /webroot

Создадим новый контейнер с именем test-container, используя команду docker run.

docker run -d -v /webroot:/var/www/html -p 8080:80 --name test-container nginx-image

-v /webroot:/var/www/html‘: каталог webroot на хост-компьютере переписать в каталог /var/www/html в контейнере.
-p 8080: 80‘: пробрасываем порт 8080 на хост-компьютере на порт 80 в контейнере
–name test-container nginx-image‘ : Создаем новый контейнер с именем ‘test-container’ на основе образа Docker ‘nginx-image’.

 

Чтобы убедиться, что служба PHP-FPM работает, создадим файл info.php в каталоге /webroot.

echo '<?php phpinfo(); ?>' > /webroot/info.php

Теперь если мы зайдем по адресу http://ip-адрес хост-машины:8080/info.php отобразится файл настроек PHP

В результате мы успешно создали новый пользовательский образ Docker и запустили новый контейнер на его основе.

Как создать образ Docker с помощью Dockerfile в Ubuntu 20.04 LTS
Метки:         

2 мыслей о “Как создать образ Docker с помощью Dockerfile в Ubuntu 20.04 LTS

  • 19.01.2021 в 07:52
    Постоянная ссылка

    Спасибо за материал, все просто и понятно описано.
    Единственный момент заметил, в Dockerfile должено быть
    CMD [“/start.sh”]
    вместо
    CMD [“./start.sh”]

    Ответ
  • 20.11.2021 в 08:14
    Постоянная ссылка

    вместо:
    docker build -t nginx-image
    надо:
    docker build -t proj:nginx-image .
    а ещё точнее, если не под su:
    sudo docker build -t proj:nginx-image .

    Ответ

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

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