Как добавить в докер приложение
В статье будет рассмотрено виртуальное окружение, используемое на серверах Beget - Docker. Docker на серверах Beget используется для установки однотипного программного обеспечения. Однородное окружение позволяет без каких-либо конфликтов между программами быстро внедрять новое ПО. Различные сервисы запускаются в виртуальных изолированных контейнерах.
Также данная технология используется для установки разнообразных модулей и библиотек для сайта, например, модулей Perl и Python. Для компиляции и установки необходимых библиотек нужно перейти в виртуальное окружение Docker, где для этого доступны все инструменты. Для перехода в окружение Docker достаточно выполнить одну команду в консоли, предварительно подключившись по SSH к Вашему аккаунту.
Если Вы пользуетесь OS Windows, то, скорее всего, Вам подойдет SSH-клиент PuTTy (статью по настройке можно прочитать здесь).
В примере ниже будет рассмотрено подключение пользователя denia0d3 к хостинговому серверу в Linux.
Если вы хотите запустить веб-приложение, но еще не создали сайт - сначала необходимо создать сайт и прикрепить к нему домен в разделе Сайты. Лучше всего имя сайта указывать аналогично желаемому доменному имени - в противном случае в будущем могут возникнуть трудности с пониманием файловой структуры.Если у вас еще нет доменного имени, его можно добавить или зарегистрировать в разделе Домены.
После того, как сайт создан и к нему прикреплён домен, направленный на наши NS сервера, можно приступать к установке.
Сначала необходимо подключиться к серверу по SSH:
Если подключение происходит в первый раз, необходимо принять ключ сервера. После этого нужно ввести пароль для доступа к аккаунту:
Для перехода в виртуальное окружение Docker нужно выполнить следующую команду:
После чего ещё раз ввести пароль для доступа к аккаунту.
В целях безопасности на сервере установлена система разграничения прав доступа между сайтами, основанная на POSIX ACL. Сделано это для того, чтобы файлы одного сайта не могли обращаться к файлам других сайтов. Приложения, которые будут устанавливаться в каталоги .local либо .gem, по умолчанию недоступны при попытке их запуска через сайт. Необходимо настроить общий доступ к этим каталогам через Файловый менеджер (подробная справка по разделу: Файловый менеджер):В примере будет рассмотрена настройка общего доступа к каталогу .gem. Необходимо открыть Файловый менеджер и перейти в нужный каталог:
В верхней части экрана нужно нажать на кнопку "Инструменты" -> "Настроить общий доступ к текущей директории":
И установить переключатели "Чтение и запись" и "Включая вложенные папки", после чего нажать кнопку "Открыть доступ":
Для проверки нужно вернуться в вышестоящий каталог и обновить список файлов, нажав на кнопку "Обновить" на панели инстументов файлового менеджера. Видно, что значок слева от имени каталога .gem изменился. Это значит, что все сделано правильно:
Удачной работы! Если возникнут вопросы - напишите нам, пожалуйста, тикет из Панели управления аккаунта, раздел "Помощь и поддержка".
Технология Docker набирает всё большую популярность среди разработчиков и DevOps-специалистов в наши дни, поскольку позволяет без особого труда настроить различные окружения один раз, а затем воспроизводить их на, казалось бы, совсем не совместимом оборудовании. Но начнём мы наш цикл статей о Docker с азов.
В сегодняшней статье мы поговорим о создании контейнеров и, соответственно, об их запуске. В Docker контейнер представляет собой окружение для выполнения какого-либо одного процесса. Это изолированная среда, в которой есть всё необходимое для выполнения нужного процесса, и нет ничего лишнего. Создание контейнера Docker выполняется в момент его запуска, и эти процессы запускаются с помощью команды docker run. Давайте сначала рассмотрим её синтаксис и опции.
Синтаксис и опции docker run
Синтаксис команды docker run похож на синтаксис других команд Linux и выглядит следующим образом:
$ docker run опции образ команда
Утилите обязательно надо передать образ, на основе которого будет создан контейнер. Образ может быть локальным или указывать на образ, который надо загрузить из сети. Мы рассмотрим это в примерах ниже. Опции позволяют настроить контейнер и параметры его запуска более детально. Сама команда позволяет переопределить программу, которая выполняется после запуска контейнера. Например, выполнив /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. Обычный контейнер
Чтобы создать и запустить контейнер с параметрами, заданными в образе по умолчанию, просто запустите команду без параметров. Давайте воспользуемся контейнером hello-world, который как раз для этого и предназначен:
docker run hello-world
Для поиска уже готовых образов для контейнеров можно использовать веб-сайт 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. Интересно ли вам прочитать об этом инструменте? Напишите в комментариях!
Нет похожих записей
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.
Что такое Docker и почему он полезен?
Docker значительно упрощает управление конфигурацией вашего производственного сервера. Вместо того чтобы настраивать серверы вручную, вы можете автоматизировать весь процесс, который будет запускаться при создании образа контейнера.
Это изображение будет одинаковым для всех в вашей команде, поэтому вы сможете мгновенно запускать свое приложение со всеми необходимыми зависимостями, управляемыми для вас. Это также исправляет классическую проблему «это не работает на моей машине», потому что образы Docker везде будут работать одинаково.
Этот образ также может быть легко распространен и запущен на множестве серверов при минимальном влиянии на производительность. Поскольку Docker не является виртуальной машиной, вам не приходится сталкиваться с накладными расходами на запуск гостевой операционной системы для каждого приложения. Это делает их дешевыми и достаточно масштабируемыми.
Для получения дополнительной информации о том, что делает Docker, и следует ли вам использовать его для своего приложения, вы можете прочитать нашу разбивку о том, стоит ли это головной боли. На данный момент мы предполагаем, что вы готовы начать работу, и углубимся в технические детали.
Создать Dockerfile
Точка входа для сборки вашего контейнера называется Dockerfile. Создайте новый каталог проекта для размещения ваших файлов, затем создайте новый Dockerfile с простым именем Dockerfile без расширения:
Откройте этот файл в вашем любимом текстовом редакторе.
Вы, вероятно, не хотите начинать все с нуля, поэтому вы можете раскошелиться на существующее изображение из Docker Hubтакие как Ubuntu:
Обратите внимание, что даже если вы это сделаете, вам придется сделать это FROM scratch ,
В процессе сборки Docker создает модифицируемый «слой», который вы можете создавать поверх него. Вам разрешено копировать файлы и запускать команды, как если бы они выполнялись на компьютере, аналогично тому, как вы настраивали сервер вручную. В этом файле вы выполните все настройки сервера, по сути, автоматизируя процесс, который вы пройдете, если запустили пустой ящик Linux и получили указание запустить его в производство. Это может занять много времени.
Вы можете выполнить большинство этих команд из командной строки и настроить изображение вручную. Если вы хотите получить оболочку bash в контейнере, вы можете запустить:
И сохраните ваши изменения с:
Тем не менее, вы должны использовать это только для тестирования и делать все ваши фактические настройки в Dockerfile.
Команды Dockerfile
Мы пройдемся по большинству общих команд и объясним их использование и рекомендации по их применению. Для более расширенной справки, вы можете проконсультироваться этот шпаргалкаили обратитесь к «Лучшие практики для написания Dockerfiles» запись документов.
COPY Инструкция довольно проста: она позволяет вам заполнить ваш образ Docker данными и конфигурацией.
Например, если у вас есть папка в каталоге вашего проекта с именем /config/nginx/ это содержало ваш nginx.conf , sites-available/ и другие каталоги, вы можете скопировать это в конфигурационную папку nginx по умолчанию в вашем контейнере:
Таким образом, вы можете хранить все ваши конфигурационные файлы nginx в том же каталоге проекта, что и все остальное, то есть они будут контролироваться версией с git наряду с остальной частью вашего кода.
БЕГАТЬ
RUN Инструкция запускает команду в вашем контейнере и сохраняет изменения в файловой системе контейнера.
каждый команда run создает новый «слой»так что вы, вероятно, захотите выполнить сложную настройку внутри скрипта установки. Вам нужно скопировать этот скрипт на изображение, а затем запустить его:
Внутри этого скрипта вы можете выполнять любые необходимые настройки, включая установку программ из apt ,
Если вы хотите сократить время сборки контейнера, вы можете создать базовый контейнер со всеми уже установленными программами, а затем собрать основной контейнер. FROM этот контейнер, хотя вам нужно будет управлять зависимостями и конфигурацией отдельно.
CMD определяет исполняемый файл, используемый вашим контейнером при запуске, если ничего не указано. Так вы загрузите свое приложение, когда все будет готово.
Только последний CMD Команда вступает в силу. Вы можете переопределить CMD при запуске со следующим синтаксисом:
ВХОДНАЯ ТОЧКА
ENTRYPOINT это специальная версия CMD что позволяет контейнеру работать так как исполняемый файл Например, если все, что делает контейнер, запускается nginx Вы можете указать nginx как ENTRYPOINT :
А затем запустите этот контейнер в командной строке, передав аргументы в качестве аргументов точке входа:
ПОДВЕРГАТЬ
Expose помечает определенные порты контейнера как открытые для работающего хоста. Например, если вы используете веб-сервер, вы, вероятно, захотите
Это не связывает порт автоматически, но сообщает среде выполнения Docker, что порт доступен. Чтобы на самом деле связать это, вы хотите использовать -P флаг (в верхнем регистре) без аргументов для привязки всех открытых портов.
Запуск вашего приложения
Во-первых, вам нужно создать свой имидж:
Вы можете запустить свой контейнер с docker run :
Однако само по себе это не слишком полезно, потому что с ним невозможно взаимодействовать. Для этого вам необходимо привязать порты с помощью флага -p, например так:
« ro ”Flag гарантирует, что это соединение доступно только для чтения, поэтому контейнер Docker не может вносить какие-либо изменения в хост-ОС. Это также можно использовать для предоставления контейнерам Docker доступа к постоянным данным, хранящимся в хост-ОС.
Docker позволяет не только загружать и использовать готовые контейнеры, но создавать свои. В данной инструкции мы пошагово разберем установку Docker на Linux, создание собственного образа и загрузку его на Docker Hub.
Установка Docker
Рассмотрим примеры установки на базе операционных систем Red Hat/CentOS и Debian/Ubuntu.
Red Hat/CentOS
Устанавливаем репозиторий — для этого загружаем файл с настройками репозитория:
* если система вернет ошибку, устанавливаем wget командой yum install wget.
. и переносим его в каталог yum.repos.d:
mv docker-ce.repo /etc/yum.repos.d/
yum install docker-ce docker-ce-cli containerd.io
Если система вернет ошибку Необходимо: container-selinux >= . , переходим на страницу пакетов CentOS, находим нужную версию container-selinux и копируем на него ссылку:
. с помощью данной ссылки выполняем установку:
После повторяем команду на установку докера:
yum install docker-ce docker-ce-cli containerd.io
Debian/Ubuntu
В deb-системе ставится командой:
apt-get install docker docker.io
После установки
Разрешаем запуск сервиса docker:
systemctl enable docker
. и запускаем его:
systemctl start docker
docker run hello-world
. мы должны увидеть:
.
Hello from Docker!
This message shows that your installation appears to be working correctly.
.
Сборка нового образа
Сборка начинается с создания файла Dockerfile — он содержит инструкции того, что должно быть в контейнере. В качестве примера, соберем свой веб-сервер nginx.
И так, чтобы создать свой образ с нуля, создаем каталог для размещения Dockerfile:
mkdir -p /opt/docker/mynginx
* где /opt/docker/mynginx — полный путь до каталога, где будем создавать образ.
. переходим в данный каталог:
. и создаем Dockerfile:
RUN yum install -y epel-release && yum install -y nginx
RUN yum clean all
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN sed -i "0,/nginx/s/nginx/docker-nginx/i" /usr/share/nginx/html/index.html
* в данном файле мы:
- используем базовый образ centos 7;
- в качестве автора образа указываем Dmitriy Mosk;
- задаем временную зону внутри контейнера Europe/Moscow.
- устанавливаем epel-release и nginx;
- чистим систему от метаданных и кэша пакетов после установки;
- указываем nginx запускаться на переднем плане (daemon off);
- в индексном файле меняем первое вхождение nginx на docker-nginx;
- запускаем nginx.
* подробное описание инструкций Dockerfile смотрите ниже.
docker build -t dmosk/nginx:v1 .
* где dmosk — имя автора; nginx — название для сборки; v1 — тег с указанием версии. Точка на конце указывает, что поиск Dockerfile выполняем в текущей директории.
. начнется процесс сборки образа — после его завершения мы должны увидеть что-то на подобие:
Successfully built eae801eaeff2
Successfully tagged dmosk/nginx:v1
Посмотреть список образов можно командой:
Создаем и запускаем контейнер из образа:
docker run -d -p 8080:80 dmosk/nginx:v1
* в данном примере мы запустим контейнер из образа dmosk/nginx:v1 и укажем, что необходимо опубликовать внешний порт 8080, который будет перенаправлять трафик на порт 80 внутри контейнера.
Посмотреть созданные контейнеры можно командой:
Запустить или остановить контейнеры можно командами:
docker stop 5fe78aca2e1d
docker start 5fe78aca2e1d
* где 5fe78aca2e1d — идентификатор контейнера.
Редактирование образа
В примере выше мы рассмотрели создание нового образа с нуля. Также, мы можем взять любой другой образ, отредактировать его и сохранить под своим названием.
Скачаем образ операционной системы CentOS:
docker pull centos:latest
Войдем в скачанный образ для его изменения:
docker run -t -i centos:latest /bin/bash
Внесем небольшие изменения, например, создадим учетную запись:
* в данном примере мы создали пользователя dmosk и задали ему пароль.
docker commit -m "Add user dmosk" -a "Dmitry Mosk" 8f07ef93918f centos:my
* где -m — параметр для указания комментария; -a — указывает автора; 8f07ef93918f — идентификатор контейнера, который был нами изменен (его можно было увидеть в приглашении командной строки); centos:my — название нашего нового образа.
Новый образ создан.
Загрузка образа на Docker Hub
Заходим на Docker Hub страницу регистрации. Создаем пользователя:
Переходим на страницу Repositories и создаем свой репозиторий, например, dmosk. Теперь можно загрузить наши образы в репозиторий.
docker login --username dmosk
Задаем тег для одного из образов и загружаем его в репозиторий:
docker tag centos:my dmosk/dmosk:centos
docker push dmosk/dmosk:centos
Загрузим второй образ:
docker tag dmosk/nginx:v1 dmosk/dmosk:nginx
docker push dmosk/dmosk:nginx
В Docker Hub должны появиться наш образы:
docker login --username dmosk
docker pull dmosk/dmosk:nginx
docker run -d -p 8080:80 dmosk/dmosk:nginx
Описание инструкций Dockerfile
Резервное копирование и восстановление контейнера
Созданный нами контейнер можно сохранить в виде архива и, при необходимости, перенести на другой сервер или оставить как бэкап.
Создание резерва
И так, для создания резервной копии контейнера, смотрим их список:
. и для нужного выполняем команду:
docker save -o /backup/docker/container.tar <container image>
* в данном примере мы создаем архив контейнера <container image> в файл /backup/docker/container.tar.
Чтобы уменьшить размер, занимаемый созданным файлом, раархивиркем его командой:
* в итоге, мы получим файл container.tar.gz.
Восстановление
Сначала распаковываем архив:
После восстанавливаем контейнер:
docker load -i container.tar
Смотрим, что нужный нам контейнер появился:
Дополнительные команды
В данном подразделе приведем примеры команд, которые могут оказаться полезными при работе с образами.
1. Удалить один образ:
docker rmi <название образа или его ID>
docker rmi dmosk/nginx:v1
2. Удалить все образы:
docker rmi $(docker images -q)
Мы можем получить ошибки на подобие:
Error response from daemon: conflict: unable to delete 857594f280c1 (must be forced) - image is being used by stopped container .
Это значит, что для удаляемого образа есть действующие контейнеры — они могут быть как включены, так и находится в отключенном состоянии. Удалить все нерабочие контейнеры можно командой:
docker rm $(docker ps --filter status=exited -q)
Если нужно, можно остановить все действующие контейнеры командой:
docker stop $(docker ps -a -q)
Также мы можем принудительно удалить все образы, даже если они используются для контейнеров в данный момент:
docker rmi -f <название образа или его ID>
* добавлена опция -f.
3. Для выявления проблем при запуске или в работе контейнера очень полезна опция для просмотра логов:
Читайте также: