Как запустить программу в docker

Содержание

Технология Docker набирает всё большую популярность среди разработчиков и DevOps-специалистов в наши дни, поскольку позволяет без особого труда настроить различные окружения один раз, а затем воспроизводить их на, казалось бы, совсем не совместимом оборудовании. Но начнём мы наш цикл статей о Docker с азов.

В сегодняшней статье мы поговорим о создании контейнеров и, соответственно, об их запуске. В Docker контейнер представляет собой окружение для выполнения какого-либо одного процесса. Это изолированная среда, в которой есть всё необходимое для выполнения нужного процесса, и нет ничего лишнего. Создание контейнера Docker выполняется в момент его запуска, и эти процессы запускаются с помощью команды docker run. Давайте сначала рассмотрим её синтаксис и опции.

Синтаксис и опции docker run

Синтаксис команды docker run похож на синтаксис других команд Linux и выглядит следующим образом:

$ docker run опции образ команда

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

Освоить docker за 10 минут

Например, выполнив /bin/bash, вы можете подключится к самому контейнеру.

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

  • -d — запускает контейнер в фоновом режиме;
  • -t — прикрепляет к контейнеру псевдо-TTY-консоль;
  • -i — выводит в терминал STDIN поток контейнера;
  • —name — имя контейнера, по которому потом можно будет к нему обращаться;
  • —dns — устанавливает DNS-серверы для контейнера;
  • —network — тип сети для контейнера, может принимать такие значения: bridge (используется по умолчанию), none, host. Также можно передать идентификатор сети Docker, к которой надо подключится;
  • —add-host — добавляет строчку в /etc/hosts;
  • —restart — указывает, когда надо перезапускать контейнер. Возможные значения: no, on-failure, always, unless-stopped;
  • —rm — удаляет контейнер после завершения его работы;
  • -m, —memory — количество оперативной памяти, доступное Docker-контейнеру;
  • —memory-swap — объём памяти раздела подкачки, доступный в контейнере;
  • —cpus — количество ядер процессора, доступных в контейнере;
  • —shm-size — размер файла /dev/shm;
  • —device — позволяет монтировать устройства из папки /dev в контейнер;
  • —entrypoint — позволяет переопределить скрипт, который выполняется при запуске контейнера, перед запуском основной команды;
  • —expose — позволяет пробросить несколько портов из контейнера в хост-систему;
  • -P — пробрасывает все порты контейнера в хост-систему;
  • -p — переносит все порты контейнера в хост-систему без смены номера порта;
  • —link — позволяет настроить связь контейнеров Docker;
  • -e — добавляет переменную окружения в контейнер;
  • -v, —volume — позволяет монтировать папки хоста в контейнер;
  • -w — изменяет рабочую директорию контейнера.

Это основные опции, которые мы будем использовать в этой статье, а теперь давайте рассмотрим на примерах, как создать контейнер Docker в Linux.

Docker Запуск первого контейнера урок 1

Создание контейнера Docker

1. Обычный контейнер

Чтобы создать и запустить контейнер с параметрами, заданными в образе по умолчанию, просто запустите команду без параметров. Давайте воспользуемся контейнером hello-world, который как раз для этого и предназначен:

docker run hello-world

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

Для поиска уже готовых образов для контейнеров можно использовать веб-сайт DockerHub. Здесь есть образы для большинства дистрибутивов и системных сервисов, таких, как Nginx, Apache, PHP-FPM, PhpMyAdmin и многих других.

Вверху отображается название контейнера, а чуть ниже — доступные версии. При создании контейнера версия записывается через двоеточие. Например, давайте создадим и запустим контейнер с Ubuntu 18.04. Чтобы к контейнеру было легко получить доступ потом, зададим ему имя с помощью опции —name:

docker run —name Ubuntu1804 ubuntu:18.04

2. Подключение к контейнеру

Образ Ubuntu 18.04, на основе которого мы создали контейнер выше, не содержит команды, которая бы постоянно выполнялась, поэтому если вы попытаетесь подключится к нему с помощью команды docker exec, то получите ошибку: You cannot attach to a stopped container, start it first:

docker attach Ubuntu1804

Так происходит потому, что окружение не может работать без основного процесса, для которого и создан контейнер. Пока работает процесс, будет работать и контейнер. Как только процесс завершён, контейнер завершается, и созданный нами ранее контейнер полностью бесполезен. Вы не сможете к нему подключится, потому что он будет падать сразу же после старта, а к упавшему контейнеру подключится нельзя. Его можно удалить:

docker rm Ubuntu1804

А нам надо создать контейнер с командой, которая будет выполняться. Для этого просто передайте команду после имени образа, например /bin/bash. Чтобы контейнер был доступен интерактивно, создавайте его с опциями -i и -t:

docker run -it —name Ubuntu1804 ubuntu:18.04 /bin/bash

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

3. Переменные окружения

Очень часто для изменения настроек контейнера используются переменные окружения. Вы задаёте какую-нибудь переменную окружения, а затем её значение используется вашей программой в самом контейнере для выполнения различных действий. Для задания переменных окружения используется опция -e. Запуск контейнера Docker:

docker run -it -e «FOO=bar» —name Ubuntu1804_2 ubuntu:18.04 /bin/bash

4. Монтирование папок и хранилищ

Когда вам нужно, чтобы контейнер мог работать с исходными кодами программы или с часто изменяемыми данными, рекомендую сделать специальную настройку — будет неудобно каждый раз копировать информацию в контейнер. Куда проще примонтировать папку хоста в контейнер, и все изменения исходников будут сразу же доступны в контейнере. Это очень удобно. Для монтирования папки следует передать её опции -v. Например, примонтируем папку ~/test_docker в контейнер:

docker run -it -v «~/test_docker:/mnt» —name Ubuntu1804_3 ubuntu:18.04 /bin/bash

Хранилища позволяют монтировать в контейнер виртуальный диск, который не удаляется при удалении контейнера. Такое хранилище будет автоматически создано, если передать не существующую папку, а имя для нового хранилища:

docker run -it -v docker_volume:/mnt —rm —name Ubuntu1804_4 ubuntu:18.04 /bin/bash

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

docker volume list

5. Порты контейнера

Если вам нужно получить доступ к какому-либо сервису контейнера по порту, например к веб-интерфейсу, этот порт надо пробросить в хост-систему. Для этого используется опция -p. Давайте установим Nginx и пробросим его порт в хост-систему:

docker run —name Nginx -p 8080:80 -d nginx

6. Связывание контейнеров

Связывание контейнеров позволяет настроить взаимодействие между ними. Связанный контейнер будет доступен по сети по его имени. Соответствующая строчка будет автоматически добавлена в файл /etc/hosts контейнера. Для связывания используется опция —link. Чтобы закрепить знания, полученные выше, давайте создадим контейнер с базой данных MySQL, а затем свяжем его с PhpMyAdmin.

Сначала создаём контейнер MySQL с постоянным хранилищем в /var/lib/mysql. В переменных окружения ему надо передать пароль суперпользователя. Какие переменные окружения ожидает получить контейнер — эту информацию обычно можно найти на странице контейнера на DockerHub. Используйте опцию -d, чтобы контейнер запустился в фоновом режиме:

docker run -v mysql_volume:/var/lib/mysql —name MySQL -e MYSQL_ROOT_PASSWORD=passwd -d mysql:8.0

Затем создаём контейнер с PhpMyAdmin для доступа к этой базе данных и связываем с ним контейнер MySQL под именем db:

docker run —name PhpMyAdmin -d —link MySQL:db -p 8080:80 phpmyadmin/phpmyadmin

Также здесь мы пробрасываем порт 80 в хост-систему, чтобы получить доступ к веб-интерфейсу. Теперь можно проверять в браузере. Всё работает.

7. Сеть для контейнеров

Контейнеры можно не связывать. Если надо объединить три и больше контейнеров между собой, то куда удобнее сразу связать их в одну общую сеть, чем создавать множество подключений для каждого из этих контейнеров. Все объекты в одной сети будут иметь доступ к друг другу по их имени. Сначала необходимо создать сеть:

Читайте также:
Отключение парковки ядер программа

docker network create -d bridge docker_network

Посмотреть список созданных сетей можно командой:

docker network list

Теперь можно её использовать. Объединим с помощью сети наш MySQL- и PhpMyAdmin-сервера. Для этого надо их остановить и удалить:

docker stop MySQL
docker stop PhpMyAdmin

docker rm MySQL
docker rm PhpMyadmin

docker run -v mysql_volume:/var/lib/mysql —network docker_network —name MySQL -e MYSQL_ROOT_PASSWORD=passwd -d mysql:8.0

А для PhpMyAdmin теперь надо передать хост, на котором расположена база данных в переменной окружения PMA_HOST:

docker run —name PhpMyAdmin -d —network docker_network -e PMA_HOST=MySQL -p 8080:80 phpmyadmin/phpmyadmin

Выводы

В этой статье мы рассмотрели, как запустить контейнер Docker и настроить его параметры. Как видите, Docker может быть очень полезным для быстрого разворачивания рабочих окружений. Но редко для этих целей используют саму команду docker run. Обычно используется инструмент docker-compose. Интересно ли вам прочитать об этом инструменте?

Напишите в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник: losst.pro

Использование Docker для сборки и запуска программ.

Для обычного бытового использования Docker интересен тем, что позволяет собирать программы без смешивания их пакетов с системными и запускать изолированно в контейнере. Это особенно важно при использовании дистрибутивов с длительным сроком поддержки (LTS).

Для новой версии программы могут потребоваться более свежие пакеты, чем есть в репозитории дистрибутива. В процессе решения зависимостей можно изрядно насобирать новых пакетов, что нежелательно для стабильности и безопасности. Бывают случаи, что в более новых версиях пакетов убирается устаревший функционал, который при этом используется какой-нибудь программой, входящей в дистрибутив, что закономерно приведёт к проблемам. Такова плата за длительный срок поддержки, увы. Поэтому программы, требующие более новые пакеты, чем есть в репозитории, лучше собирать и использовать из контейнера, в чём Docker очень удобен.

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

Основы использования Docker.

sudo apt install docker.io

Базовая проверка работоспособности docker:

sudo docker run hello-world

В выводе должно оказаться нечто подобное:

Если демон Docker по какой-то причине не запустился, будет показано предупреждение:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Запуск можно сделать вручную:

sudo service docker start

Образы.

Если упрощённо, то образ — это шаблон, содержащий в себе программные компоненты, из копий которого создаются контейнеры.

Образы делятся на базовые (Base images) и дочерние (Child images).

Базовые образы — как правило, содержат в себе операционную систему. (Ubuntu, Debian и подобные).

Дочерние образы — зависят от базовых.

Существуют официальные и пользовательские образы. Названия пользовательских начинаются с имени пользователя, загрузившего образ.

sudo docker pull

Можно выбрать конкретную версию образа:

sudo docker pull ubuntu:20.04

В данном случае это Ubuntu 20.04.

Поиск образов в реестре. Найти все образы Ubuntu 20.xx:
sudo docker search ubuntu-20

Вывести список всех загруженных образов:

sudo docker images

sudo docker rmi

sudo docker rmi 56def654ec22

Принудительно удалить образ:

sudo docker rmi -f

—f — отфильтровать образы или контейнеры по предоставленному условию. В данном случае по ID образа.

Удалить образы, которые не используются ни одним контейнером:

sudo docker image prune -a -f

Контейнеры.

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

Вывести список всех контейнеров:

sudo docker ps -a

Вывести список только запущенных контейнеров:

sudo docker ps —no-trunc

—no-trunc — не обрезать вывод. К примеру, будут полностью отображены ID, вместо их сокращения.

Место хранения контейнеров: /var/lib/docker/

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

docker run —help

Создание и запуск контейнера на примере busybox (комплект консольных утилит):

sudo docker run busybox echo «hello world»

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

sudo docker start

Остановить работу контейнера:

sudo docker stop

Подключение к запущенному контейнеру:

sudo docker exec -it sh

Контейнеры можно удалить по имени и по ID. Команда:

sudo docker rm 791834eb255d

Принудительное удаление запущенного контейнера:

sudo docker rm -f

Удалить все остановленные контейнеры:

sudo docker container prune -f

Создание и запуск контейнера с желаемым именем (в примере my-busy) с последующим запуском echo, которая выведет строку «hello world»:

sudo docker run —name my-busy busybox echo «hello world»

Создать и запустить контейнер, а затем удалить его по завершению работы (опция —rm).

sudo docker run —rm busybox echo «hello world»

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

Вывести потребляемые контейнером ресурсы:

sudo docker stats

Dockerfile и создание собственных образов.

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

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

Собственные образы и контейнеры очень удобно применять для сборки программ. Это особенно актуально при использовании дистрибутивов с длительным сроком поддержки (LTS). Ключевым является то, что не придётся смешивать различные зависимости и самосборные пакеты с системными пакетами. Все они будут изолированы в контейнере, что позитивно скажется на безопасности и стабильности системы.

Наполнение Dockerfile.

Пример содержимого Dockerfile:

# базовый образ FROM ubuntu:20.04 # установка желаемых пакетов и зависимостей RUN apt-get update RUN apt-get install -y wget echo «We installed wget!» # создание каталога /mytest WORKDIR /mytest # создание файла testfile RUN touch testfile # ls и echo будут выполняться при запуске контейнера CMD ls echo «Show me mytest»

Каждая строка с командами является инструкцией. Инструкции выполняются одна за другой.

Примечание: Docker рекомендует использовать именно apt-get.

Основные инструкции.

FROM — указать имя базового образа, из которого будет создан собственный образ. Базовый образ будет загружен, если его нет на локальной машине. Dockerfile всегда должен начинаться с FROM.

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

Команды выполняются последовательно, то есть результат первой порции команд, перечисленных в инструкции RUN, не влияет на команды, перечисленные в следующей RUN. Пример: RUN cd /tmp не будет действовать для RUN ls, то есть ls выведет каталоги корня, а не /tmp.

При выполнении инструкции RUN Docker будет сохранять изменения в файловой системе, накладывая новые изменения поверх старых по слоям. Каждая инструкция RUN создаёт слой. Это используется для ускорения создания образов. Те слои, что не изменились, будут использоваться без повторной обработки.

WORKDIR — создать и/или выбрать рабочий каталог внутри образа, в котором будут выполнены последующие команды, перечисленные в инструкциях RUN и CMD. Особенно полезно при сборке программ.

COPY — копировать указанные файлы и каталоги из каталога контекста сборки в создаваемый образ по пути, указанному в инструкции WORKDIR или напрямую.

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

ENTRYPOINT — запускает указанную программу с желаемыми параметрами при старте контейнера. Команды можно записывать в синтаксисе JSON. Обычно указывается в конце Dockerfile. Пример: ENTRYPOINT [«/bin/sh», «-c»]

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

Пример создания образа.

Команда на создание образа:

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

— это аргумент, указывающий демону контекст сборки, то есть какие файлы и каталоги использовать для сборки образа. Если не планируется добавлять какие-то конкретные файлы и каталоги, то достаточно указать любой пустой каталог. Sending build context to Docker daemon — процесс упаковки и отправки файлов демону для сборки образа.

Образ будет собираться в специальном временном каталоге. Указанные файлы будут скопированы, упакованы (tar-архив) и помещены в специальный каталог для последующей сборки. После сборки скопированные файлы будут удалены, а оригиналы останутся без изменений.

Если в качестве контекста указать . (точку), то демон будет искать файлы для образа в том же каталоге, где выполнена команда на сборку. То есть перед сборкой необходимо перейти в каталог контекста сборки (с файлами и каталогами для сборки образа), а только потом выполнить команду на сборку. Иначе демон посчитает за контекст сборки весь домашний каталог активного пользователя.

Читайте также:
Программа для записи звука с монитора компьютера

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

Альтернативный способ создания образа.

Docker позволяет сохранить изменения, которые были сделаны в контейнере, в отдельный образ. То есть можно настроить содержимое контейнера (установить желаемые пакеты и тому подобное), затем сохранить всё в новый образ, из которого можно будет запускать уже настроенный контейнер.

Пример использования можно найти далее в статье.

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

Пример сохранения образа ubuntu в файл-образ с именем my-exp-ubuntu.tar в каталог ~/Documents/.

sudo docker save —output ~/Documents/ my-exp-ubuntu.tar ubuntu

Чтобы использовать сохранённый образ, его необходимо импортировать:

sudo docker load —input

sudo docker load —input ~/Downloads/my-exp-ubuntu.tar

Примеры использования Docker.

Монтирование каталогов в контейнер Docker.

Docker позволяет монтировать каталоги основной системы в контейнеры, что делает доступным их содержимое для утилит внутри контейнера. К примеру, можно смонтировать в контейнер каталог ~/Video/, чтобы обработать его содержимое с помощью ffmpeg, который находится в контейнере.

Использование на примере busybox.

Создать контейнер из образа busybox, примонтировать каталог ~/Documents/ к контейнеру, запустить утилиту ls внутри контейнера для смонтированного в него каталога, вывести результат и удалить контейнер:

sudo docker run -v ~/Documents/ :/mnt/ —rm busybox ls /mnt/

-v — указывает хранилище, которое будет смонтировано в контейнер. Хранилище представляет собой обычный ранее созданный каталог, в котором могут содержаться другие каталоги и файлы. При монтировании контейнер получит доступ к этому каталогу и всему его содержимому. В примере это каталог ~/Documents/.

/mnt — обозначает точку монтирования. В примере это ~/Documents/. Пример пути: /mnt/каталог/файл, что является аналогичным ~/Documents/каталог/файл.

—rm — удалить контейнер после завершения его работы.

Использование интерпретатора sh из контейнера.

sudo docker run —rm -it busybox sh

-i — интерактивный режим.

-t — проброс терминала в контейнер.

Благодаря опции -it будет выделен псевдо-tty, работающий в интерактивном режиме, а не только на вывод, что позволит выполнять команды внутри контейнера через терминал. Без опции -it утилита sh будет запущена единожды, отобразится вывод и работа контейнера завершится.

Команда ls покажет набор каталогов от корня внутри контейнера:

Пример перехода в каталог /bin и выполнение команды ls:

На иллюстрации показано всё многообразие утилит из комплекта busybox.

Для завершения работы этого контейнера необходимо ввести exit .

Ниже рассмотрен пример установки в контейнер текстового браузера elinks и сохранения изменений в образ.

На базе образа ubuntu будет создан контейнер с именем —name my-base-ubuntu:

sudo docker run -it —name my-base-ubuntu ubuntu sh

При этом с помощью опции -it пробрасывается терминал в интерактивной сессии и запускается утилита sh.

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

Установка браузера elinks:

apt-get install elinks

После завершения установки пакетов можно завершить сессию:

Проверяем наличие контейнера в списке контейнеров:

sudo docker ps -a

Теперь предстоит сохранение изменений, которые были сделаны в контейнере (установлены пакеты для браузера elinks), в образ:

sudo docker commit my-base-ubuntu my-ubuntu-elinks

Сначала указывается имя контейнера (можно указать ID), а потом имя для образа, который будет создан. В данном случае будет создан образ с именем my-ubuntu-elinks.

Проверим наличие образа. Вывести список всех доступных образов:

sudo docker images

Теперь можно удалить контейнер, из которого был создан образ:

sudo docker rm my-base-ubuntu

Создание контейнера из свежесозданного образа и запуск браузера в интерактивной сессии проброшенного терминала:

sudo docker run -it —rm my-ubuntu-elinks elinks

Благодаря опции —rm, контейнер будет удалён после завершения работы.

Использование на примере Cmake-Converter.

Программа предназначена для автоматического преобразования солюшена (.sln) Visual Studio в CmakeLists.txt. Программа написана на Python и доступна из репозитория посредством пакетного менеджера pip.

Установка и использование очень просты, что очень удобно для освоения Docker.

Настройка Dockerfile.

FROM python RUN pip install cmake_converter # Программа располагается здесь: /usr/local/bin/cmake-converter WORKDIR /usr/local/bin

Для примера Dockerfile будет сохранён по следующему пути: ~/Documents/docker/cmake-converter/

Создание образа.

Перейти в каталог с Dockerfile. Пример:

Создать образ с именем my-cmake-converter:

sudo docker build -t my-cmake-converter .

Точка в конце указывает на то, что контекст сборки располагается в том же каталоге, где выполняется команда на сборку. В данном случае это место хранения Dockerfile: ~/Documents/docker/cmake-converter/

Запуск контейнера и использование cmake-converter.

Примечание: В данном примере sln-файл находится в ~/Documents/.

Запустить контейнер my-cmake-converter, смонтировать каталог ~/Documents/ в каталог /mnt/ внутри контейнера, выполнить программу cmake-converter и указать ей путь до sln-файла, который нужно преобразовать в CMakeLists.txt:

sudo docker run -v ~/Documents/:/mnt/ —rm my-cmake-converter cmake-converter -s /mnt/my-project.sln

Использование на примере утилиты untrunc.

Утилита предназначена для исправления следующей проблемы: moov atom not found audio.mp4: Invalid data found when processing input.

То есть позволяет исправить битое видео в формате mov. К примеру, видео может побиться, если некорректно завершить процесс записи. Утилита позволяет подсунуть moov атом из нормального видео в битое, тем самым решая проблему.

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

В этой же сессии терминала выполнить команду на создание образа:

sudo docker build -t untrunc .

Создание контейнера и запуск утилиты:

sudo docker run -v ~/Video/:/mnt/ —rm untrunc /mnt/video_good.mp4 /mnt/video_bad.mp4

-v — указать каталог, который следует смонтировать в контейнер. Контейнер получит доступ ко всему содержимому каталога. В данном примере монтируется каталог ~/Video/ в каталог /mnt/ внутри контейнера.

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

untrunc — непосредственно сама утилита, находящаяся в контейнере. Сначала указывается видео-донор, в котором всё в порядке с moov атомом, а следом указывается видео с повреждённым.

Если всё правильно, то пойдёт процесс обработки, который зависит от объёма видео. Обработка видео 1 Гб занимает до 10 минут. Если moov атом не подходит, то будет указана ошибка.

Восстановление видео не гарантировано. Может восстановиться только звук, а видеоряд будет представлен набором графических артефактов.

Использование утилиты alien.

Утилита применяется для конвертации rpm-пакетов в deb-пакеты. Она требует довольно много зависимостей, которые не хочется тащить в систему. Поэтому сделаем собственный Docker-образ на базе Ubuntu.

Настройка Dockerfile.

FROM ubuntu # настройка часовых поясов для tzdata ENV TZ=Europe/Moscow RUN ln -fs /usr/share/zoneinfo/$TZ /etc/localtime RUN apt-get update # установка с автоматическим подтверждением в диалогах RUN apt-get install -y alien # выполнить /usr/bin/alien при старте контейнера ENTRYPOINT [«/usr/bin/alien»]

В данном примере Dockerfile будет сохранён в ~/Documents/docker/alien/.

Создание образа.

Перейти в каталог с Dockerfile:

Создать образ с именем alien:

sudo docker build -t alien .

Создание контейнера и запуск утилиты:

sudo docker run -v ~/Downloads/:/mnt/ —rm alien /mnt/пакет.rpm

В данном примере rpm-пакет находится в каталоге ~/Downloads/, который был смонтирован в каталог /mnt/ внутри контейнера.

deb-пакет будет создан с тем же именем, что и исходный rpm-пакет.

Источник: noostyche.ru

Руководство по Docker. Часть 1: образ, контейнер, сопоставление портов и основные команды

Руководство по Docker. Часть 1: образ, контейнер, сопоставление портов и основные команды

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

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

Содержание:

  1. Образы и контейнеры.
  2. Запуск первой программы в Docker.
  3. Основные команды контейнеров Docker.
  4. Командная строка Docker-контейнера.
  5. Пользовательские образы Docker.
  6. Запуск веб-приложения в Docker.
  7. Docker и сопоставление портов.
  8. Выводы.

1. Образы и контейнеры

Самые важные концепции Docker!

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

docker images

  • Что такое “контейнер”?

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

Количество контейнеров не ограничено, все они работают на общей инфраструктуре хоста и общей операционной системе. Посмотреть на список контейнеров можно с помощью команды:

docker ps -a

2. Запуск первой программы в Docker

Первым делом нужно вывести на экран фразу “Hello, world!”.

В Docker каждому контейнеру нужен образ, поэтому, чтобы запустить hello-world , введите в консоль или терминал команду:

Читайте также:
Видение программы развития это

docker run hello-world

Попытка создания и запуска контейнера. Согласно документации API-клиента Docker, в установленном порядке выполняются следующие действия.

  1. Консоль: выполняет команду docker run hello-world .
  2. Docker client (CLI): получает команду и выполняет действия на ее основе.
  3. Сервер Docker: связывается с CLI, чтобы выдать клиенту из кэша образов (Image Cache) нужный образ с названием hello-world . Если такого образа нет, то сервер Docker связывается с хабом Docker, где скачивает образ с указанным именем.
  4. Docker Hub: хаб Docker получает запрос от сервера Docker на загрузку конкретного файла образа из общедоступного хранилища.
  5. Сервер Docker: снова ищет образ в разделе “Image Cache”, затем создает контейнер — экземпляр образа hello-world .
  6. Контейнер Docker: согласно первоначальным установкам из образа, в контейнере запускается простая программа hello-world .
  7. Консоль: в результате успешного выполнения всех вышеизложенных этапов отобразит информацию со скриншота.

3. Основные команды контейнеров Docker

Прочитайте перечень команд управления поведением контейнеров без изменения образов.

  • Удалить все неактивные контейнеры Docker:

docker system prune

  • Вывести на экран stderr и stdout от запущенных в контейнере программ, логирование контейнера Docker:

docker logs

  • Индекс активных контейнеров:

docker ps

  • Индекс всех контейнеров, включая неактивные:

docker ps -a

  • Индекс образов, установленных в системе на данный момент:

docker images

  • Деактивировать Docker-контейнер по идентификатору:

docker stop

  • Удалить неактивный контейнер по идентификатору:

docker rm

  • Удалить конкретный образ по его названию:

docker rmi

4. Командная строка Docker-контейнера

Рассмотрим набор самых часто задаваемых вопросов о пользовательском вводе команд с клавиатуры напрямую в контейнеры Docker.

  • Как выполнить команду внутри контейнера Docker?

docker exec -it

Здесь exec позволяет выполнять команды в контейнере, а флаг -it разрешает прием ввода от пользователя к процессу, а также вывод в терминал как результата выполнения процесса, так и сообщений об ошибках.

  • Как получить доступ к командной строке контейнера Docker?

Иногда удобно напрямую взаимодействовать с командной строкой контейнера. Для поиска ошибок и отладки, или вы можете запустить там все команды Linux одновременно. Убедитесь, что нужный контейнер запущен, а потом введите следующую команду:

docker exec -it sh

sh выдаст разрешение на ввод подсказок (prompt), и вы сможете выполнять внутри контейнера различные задачи, например:

  • Как разрешить ввод при запуске контейнера из образа Docker?

Допустим, что вы хотите сразу после скачивания из хаба Docker запустить образ под названием busybox . Что вы сделаете?

docker run busybox

Теперь, чтобы ответить на вышеуказанный вопрос, выполните следующую команду:

docker run -it busybox sh

Теперь все знания о полезных командах из двух пунктов руководства помогут вам подготовиться к следующему шагу.

5. Пользовательские образы Docker

Как добавить файлы в контейнер и какую операционную систему выбрать для образа?

Основной файл, хранящий все инструкции. Каждый dockerfile одинаково структурирован. Чтобы создать dockerfile для пользовательского образа необходимо указать:

  1. Базовый образ.
  2. Все зависимости и условия запуска программы.
  3. Команду для запуска программы при старте контейнера.
  • Docker Client

После создания dockerfile вы сразу попытаетесь собрать образ. Следовательно, Dockerfile отправляется клиенту Docker.

Далее клиент Docker передает все инструкции серверу Docker, который, в свою очередь, выполняет всю грязную работу, а именно все команды внутри dockerfile , и создает образ. Затем образ запускается, в результате чего создается контейнер, экземпляр образа.

  • Как же создать образ Docker?
  1. Сначала напишите dockerfile .
  2. Затем выполните команду docker build .
  3. Теперь запустите образ командой docker run .

Рассмотрим простой dockerfile , в котором установлен сервер базы данных Redis :

Теперь, глядя на Dockerfile, у вас наверняка возникли вопросы! Ответим на них сейчас:

  • Что такое базовый образ?

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

Alpine Linux — это как Windows и macOS, где можно установить почти все, что вам нужно. Alpine занимает мало памяти, что хорошо подходит для установки Redis. Базовый образ загружается через инструкцию FROM .

  • Как установить зависимости?

Посмотрите, в dockerfile написана инструкция ‘RUN’, которая выполняет команды внутри контейнера. APK означает менеджер пакетов Alpine Linux . Команды apk применяются в любой работающей системе на базе Alpine Linux для удаления, установки, обновления программного обеспечения.

  • Как указать команду для запуска приложения в контейнере?

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

Теперь поговорим детальнее о команде docker build . Что происходит перед тем, как результат ее выполнения появляется на экране?

  1. Загружается контейнер с образом alpine .
  2. Файловая система из образа alpine переносится во временный контейнер, в нем и выполняются инструкции по установке базы данных Redis. После завершения установки временный контейнер удаляется, а файловая система переносится обратно в образ alpine , тем самым обновляя его. Теперь в новом образе установлен Redis.
  3. По аналогии создается еще один временный контейнер для установки команды запуска сервера Redis при каждом запуске образа в контейнере. Следом временный контейнер удаляется, а обновленная файловая система устанавливается в конечном пользовательском образе.
  4. Наконец, для запуска контейнера по шаблону пользовательского образа выполняется команда docker run .

Примечание: если вы обновите dockerfile образа и попытаетесь пересобрать его, то Docker получит кэш из предыдущего образа, чтобы пропустить тот же процесс. Он обновит только вновь добавленный раздел в Dockerfile. Порядок в Dockerfile также важен. Если вы измените порядок команд, то кэш обнулится!

  • Как установить специфическое имя для образа?

6. Запуск веб-приложения в Docker

В этом разделе создадим и докеризируем простое приложение на Node.js на основе пользовательского образа. Не беспокойтесь, вам не нужны знания о Node.js для выполнения пунктов руководства.

  • Шаг 1
    Напишите файл package.json , ведь Express.js — это бэкенд-фреймворк для веб-приложений на Node.js. Укажите в нем последнюю версию при помощи символа звездочки * , а затем укажите запуск по умолчанию для команды node index.js , где index.js — это основной веб-файл.

  • Шаг 2
    Напишите простой файл index.json . Планируется, что фреймворк Express.js через / получает запросы и отправляет обратно ответ. Чтобы получить запрос и ответ, необходимо установить порт для прослушивания.

  • Шаг 3
    Напишите dockerfile . Помните все ключевые шаги? Если забыли, то поднимитесь вверх по разделам и освежите знания. Тем не менее совершенно очевидно, что для запуска приложения понадобятся установленные, готовые к работе Node.js и NPM.

  • Шаг 4
    Постройте пользовательский образ, присвойте ему теги.

  • Шаг 5
    Запустите контейнер с приложением, запомните прослушиваемый порт.

  • Шаг 5
    Проверьте, можно ли получить доступ к приложению из браузера, действительно ли оно работает?
    О, нет! Что-то пошло не так? Пришло время выяснить.

Возможно, у вас сейчас на уме один вопрос: зачем в dockerfile написана команда WORKDIR /usr/app ?

Основная цель — разделение рабочих файлов, чтобы строго необходимые для работы приложения файлы не смешивались с другими директориями, а легко отделялись от остальных при необходимости, если возникнут проблемы. Следовательно, внутри контейнера файлы веб-приложения сохраняются в каталоге /usr/app .

7. Docker и сопоставление портов

Рассмотрим, как разобраться в настройках и правильно установить сопоставление портов!

При отправке запроса на порт 8080 вашей локальной машины, он не перенаправляется автоматически на контейнер, так как у контейнера собственное сетевое отображение.

Сопоставление портов позволит запросу на порт 8080 с локальной машины перенаправить запрос на порт 8080 Docker-контейнера, только для входящих запросов.

Однако по умолчанию Docker также позволяет исходящие запросы. Интересно, как это сделать? Проверьте зависимости в dockerfile , где NPM из контейнера напрямую обращается к интернету.

  • В команде запуска контейнера первый порт — это порт хост-машины или локальной машины, а второй порт — это порт контейнера:

docker run -p 8080:8080 mahedi/simpleweb

Выводы

Веб-приложение запущено и доступно при обращении к порту 8080 локальной машины.

Несмотря на успех, стоит упомянуть три распространенные ошибки, допускаемые в процессе работы с Docker Server и Docker Client.

  1. Неправильный выбор базового образа.
  2. Отсутствие в dockerfile команд ADD или COPY для переноса файлов хост-машины в контейнер.
  3. Неправильное сопоставление портов при создании контейнера.

Далее прилагаются скриншоты правильно запущенного в Docker веб-приложения Node.js, чтобы вы могли с ними свериться.

Самостоятельно ознакомьтесь с файлом dockerfile для построения пользовательского образа и запуска веб-приложения на Node.js.

Проанализируйте изображенный на скриншоте файл index.js с простым примером веб-приложения на Node.js. Данный файл запускается внутри контейнера Docker при помощи соответствующей команды из dockerfile .

На сегодня все! В следующей части руководства пойдет речь о последовательном создании нескольких контейнеров и докеризации сложных веб-систем со множеством зависимостей.

  • Среда разработки Entity Framework в Docker
  • Перенос сценариев CI в docker build
  • Тенденции в области программного обеспечения в 2022 году: 22 прогноза

Источник: nuancesprog.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru