Поиск по сайту:

Как создавать образы Docker с файлом Dockerfile в Ubuntu 20.04 LTS


Это руководство существует для этих версий ОС

  • Ubuntu 16.04 (Xenial Xerus)

На этой странице

  1. Введение в команду Dockerfile
  2. Шаг 1. Установите Docker в Ubuntu 20.04
  3. Шаг 2. Создание Dockerfile и других конфигураций
  4. Шаг 3. Создание нового пользовательского интерфейса и запуск нового контейнера
  5. Шаг 4. Тестирование

Docker — это виртуализация на уровне операционной системы, в основном предназначенная для разработчиков и системных администраторов. Docker упрощает создание и развертывание приложений в изолированной среде.

Dockerfile — это скрипт, содержащий наборы команд и инструкций, которые будут автоматически последовательно выполняться в среде Docker для создания нового образа Docker.

В этом руководстве мы покажем вам, как создать собственный образ Docker с помощью Dockerfile. Мы объясним детали, связанные с Dockerfile, чтобы вы могли создать свой собственный образ Docker.

Предпосылки

В этом руководстве мы будем использовать Ubuntu 20.04 с 1 ГБ оперативной памяти, 25 ГБ свободного места на диске и 2 процессорами. Кроме того, мы будем использовать Ubuntu 20.04 в качестве базового образа для создания пользовательского образа Docker.

Введение в команду Dockerfile

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

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

ИЗ

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

ЭТИКЕТКА

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

БЕГ

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

ДОБАВИТЬ

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

ENV

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

CMD

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

РАЗОБЛАЧАТЬ

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

АРГ

Инструкция ARG используется для определения переменной, которую пользователь может передать во время сборки. Вы можете использовать эту инструкцию в команде сборки docker во время сборки, используя параметр --build-arg variable=value, и ее можно передать через файл Dockerfile. Кроме того, вы можете использовать несколько ARG в Dockerfile.

ВХОДНАЯ ТОЧКА

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

РАБОЧИЙКАТАЛОГ

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

ПОЛЬЗОВАТЕЛЬ

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

ОБЪЕМ

Инструкция VOLUME, используемая для включения доступа/связного каталога между контейнером и хост-компьютером.

Теперь давайте начнем создавать первый Dockerfile.

Шаг 1. Установите Docker на Ubuntu 20.04.

Перед созданием Dockerfile мы установим Docker в нашу систему Ubuntu 20.04, которая по умолчанию доступна в репозитории Ubuntu FocalFossa.

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

sudo apt update
sudo apt install docker.io

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

systemctl start docker
systemctl enable docker

Теперь проверьте службу Docker с помощью приведенной ниже команды.

systemctl status docker

Служба Docker запущена и работает на Ubuntu 20.04.

Затем выполните приведенную ниже команду docker, чтобы убедиться, что установка выполнена правильно.

docker run hello-world

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

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Как видно, вы получаете сообщение Hello World от Docker, и установка Docker на Ubuntu 20.04 успешно завершена.

Шаг 2. Создайте Dockerfile и другие конфигурации

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

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

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

Теперь отредактируйте скрипт Dockerfile, используя свой собственный редактор (в этом примере мы использовали vim).

vim Dockerfile

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

#Download base image ubuntu 20.04
FROM ubuntu:20.04

Теперь добавьте подробную информацию о пользовательском изображении с помощью инструкции LABEL.

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

Для установки пакетов apt мы пропустим любой интерактивный шаг после установки, используя переменную среды DEBIAN_FRONTEND=noninteractive.

# Disable Prompt During Packages Installation
ARG DEBIAN_FRONTEND=noninteractive

Затем запустите команду apt update перед установкой каких-либо пакетов.

# Update Ubuntu Software repository
RUN apt update

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

# 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 cgi.fix_pathinfo=1 на cgi.fix_pathinfo=0 в файле конфигурации php.ini, затем добавьте параметр отключения демона в переменную 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}

Создайте новый каталог для sock-файла PHP-FPM, измените владельца корневого веб-каталога /var/www/html и каталога PHP-FPM /run/php на пользовательские www-данные по умолчанию.

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"]

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

# Expose Port for the Application 
EXPOSE 80 443

Сохранить и закрыть.

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

# Download base image ubuntu 20.04
FROM ubuntu:20.04

# LABEL about the custom image
LABEL maintainer=""
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, супервизора и скрипта start.sh.

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

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

vim 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, которая будет запускаться автоматически.

Создайте файл supervisrod.conf с помощью вашего редактора.

vim 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, используя t=ваш редактор, он будет содержать команду supervisord для запуска.

vim start.sh

Вставьте в него следующую конфигурацию.

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

Сохранить и закрыть.

Сделайте скрипт start.sh исполняемым.

chmod +x start.sh

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

tree .

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

Шаг 3. Создайте новый заказ и запустите новый контейнер

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

docker build -t nginx-image .

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

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

docker image ls

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

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

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

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

mkdir -p /webroot

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

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

Примечание:

  • --name test-container nginx-image=Мы создаем новый контейнер с именем test-container на основе образа докера nginx-image.
  • -p 8080:80=контейнер тестового контейнера, работающий на порту 8080 на хост-компьютере.
  • -v /webroot:/var/www/html=каталог /webroot на хост-компьютере переписать каталог /var/www/html в контейнере.

После этого проверьте все запущенные контейнеры в вашей системе с помощью следующей команды.

docker ps

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

В результате новый контейнер с именем test-container на основе образа nginx и портом 8080 запущен и работает.

Шаг 4 — Тестирование

Чтобы убедиться, что контейнер работает правильно, мы создадим новый файл index.html и phpinfo в корневом каталоге /webroot на хост-компьютере. Поскольку каталог /webroot монтируется в каталог контейнера /var/www/html.

Создайте файл index.html в каталоге /webroot, используя следующую команду.

echo '<h1>Nginx and PHP-FPM 7.4 inside Docker Container with Ubuntu 20.04 Base Image</h1>' > /webroot/index.html

Теперь проверьте доступ к вашему контейнеру с помощью команды curl на порту 8080.

curl server-ip:8080
curl -I server-ip:8080

В результате вы получите страницу index.html по умолчанию, которую мы только что создали.

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

Создайте файл info.php с помощью следующей команды.

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

Затем откройте веб-браузер и введите IP-адрес вашего сервера с портом 8080, следуя пути к файлу info.php.

Теперь вы получите страницу phpinfo, как показано ниже.

Как видно, тест-контейнер успешно загружен PHP-скриптом.

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