Контейнер docker останавливается после «запуска docker»

Как работает Docker

Работа Docker основана на принципах клиент-серверной архитектуры, которая основана на взаимодействии клиента с веб-сервером (хостом). Первый отправляет запросы на получение данных, а второй их предоставляет.

Схема работы

  1. Пользователь отдает команду с помощью клиентского интерфейса Docker-демону, развернутому на Docker-хосте. Например, скачать готовый образ из реестра (хранилища Docker-образов) с помощью команды docker pull. Взаимодействие между клиентом и демоном обеспечивает REST API. Демон может использовать публичный (Docker Hub) или частный реестры.
  2. Исходя из команды, заданной клиентом, демон выполняет различные операции с образами на основе инструкций, прописанных в файле Dockerfile. Например, производит их автоматическую сборку с помощью команды docker build.
  3. Работа образа в контейнере. Например, запуск docker-image, посредством команды docker run или удаление контейнера через команду docker kill.

Как работают образы

Docker-image — шаблон только для чтения (read-only) с набором некоторых инструкций, предназначенных для создания контейнера. Он состоит из слоев, которые Docker комбинирует в один образ при помощи вспомогательной файловой системы UnionFS. Так решается проблема нерационального использования дисковой памяти. Параметры образа определяются в Docker-file.

Для многократного применения Docker-image следует пользоваться реестром образов или Докер-реестром (Docker-registry), позволяющим закачивать готовые образы с внешнего репозитория сервиса и хранить их в реестре Докер-хоста. Рекомендуемый вариант — официальный реестр компании Docker Trusted Registry (DTR).

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

Как работают контейнеры

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

Изоляция рабочей среды осуществляется при помощи технологии namespace. Для каждого изолированного пространства (контейнера) создается уникальное пространство имен, которое и обеспечивает к нему доступ. Любой процесс, выполняемый внутри контейнера, ограничивается namespace.

В ОС Linux посредством Docker Engine используется немного другая технология — контрольные группы (cgroups). При этом приложение ограничивается некоторым набором ресурсов. Сgroups осуществляют обмен доступных аппаратных ресурсов с контейнерами, на которые дополнительно устанавливаются необходимые ограничения (использование памяти, прав доступа к другому ресурсу и т. д.).

Движок Docker объединяет пространство имен (namespace), контрольные группы (cgroups) и файловую систему (UnionFS) в формат контейнера. В будущем планируется поддержка других форматов посредством интеграции технологий BSD Jails или Solaris Zones.

Что происходит при запуске контейнера

  1. Происходит запуск образа (Docker-image). Docker Engine проверяет существование образа.  Если образ уже существует локально, Docker использует его для нового контейнера. При его отсутствии выполняется скачивание с Docker Hub.
  2. Создание контейнера из образа.
  3. Разметка файловой системы и добавление слоя для записи.
  4. Создание сетевого интерфейса.
  5. Поиск и присвоение IP-адреса.
  6. Запуск указанного процесса.
  7. Захват ввода/вывода приложения.

Composer user

Осталось решить проблему с пользователем. и создаются от . Если не указано другое, то в самом контейнере используется тоже root. Это легко проверить:

FROM composer:latest AS composer
FROM php:7.2.3
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt update && apt install -y git
RUN whoami
WORKDIR /app

Соберите контейнер:

docker build -t php-composer:3.1 .
Output:
Step 5/6 : RUN whoami
---> Running in 8707eba18a3b
root
...
Successfully tagged php-composer:3.1

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

Dockerfile USER

Обновите Docker-файл:

FROM composer:latest AS composer
FROM php:7.2.3
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt update && apt install -y git
RUN adduser phpcomposeruser
USER phpcomposeruser
RUN whoami
RUN id
WORKDIR /app

Соберите новый контейнер:

docker build -t php-composer:3.2 .

Удалите каталог и файл :

sudo rm -rf vendor/ && sudo rm composer.lock

Соберите проект, используя версию 3.2:

docker run -ti --volume $(pwd)/:/app php-composer:3.2 composer install

Проверьте файлы:

ls -l
Output:
-rw-r--r-- 1 sample sample  142 Dec 13 15:21 composer.json
-rw-r--r-- 1 sample sample 8286 Dec 13 15:21 composer.lock
-rw-r--r-- 1 sample sample  222 Dec 13 15:18 Dockerfile
drwxr-xr-x 6 sample sample 4096 Dec 13 15:21 vendor

Здесь может быть неверно определено имя пользователя. Если это так, вернитесь к логам сборки

Обратите внимание на. Там указан UID пользователя

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

Запуск контейнера от пользователя

Второй способ — запускать контейнер от конкретного пользователя с помощью.

Уберите из Docker-файла . Верните первоначальный вид:

FROM composer:latest AS composer
FROM php:7.2.3
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt update && apt install -y git
WORKDIR /app

Соберите версию 3.3:

docker build -t php-composer:3.3 .

Удалите каталог vendor и файл :

sudo rm -rf vendor/ && sudo rm composer.lock

Соберите проект, добавив :

docker run --user phpcomposeruser -ti --volume $(pwd)/:/app php-composer:3.3 composer install

В терминале отобразится ошибка:

docker: Error response from daemon: linux spec user: unable to find user phpcomposeruser: no matching entries in passwd file.

Это связано с тем, что вы не создали пользователя с таким именем в образе . Чтобы устранить эту проблему, можно передать в контейнер UID и GID вместо имени пользователя.

Поменяйте владельца на :

sudo chown phpcomposeruser composer.json

Соберите проект:

docker run --user $(id -u phpcomposeruser):$(id -g phpcomposeruser) -ti --volume $(pwd)/:/app php-composer:3.3 composer install

Проверьте, что все работает:

ls -l
total 24
-rw-r--r-- 1 phpcomposeruser sample  142 Dec 13 14:54 composer.json
-rw-r--r-- 1 phpcomposeruser phpcomposeruser 8286 Dec 13 14:59 composer.lock
-rw-r--r-- 1 sample sample 155 Dec 13 14:44 Dockerfile
drwxr-xr-x 6 phpcomposeruser phpcomposeruser 4096 Dec 13 14:59 vendor

Готово, теперь образ собирается не от root, а от имени нового пользователя.

2 ответа

Лучший ответ

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

Ваш Dockerfile должен выглядеть так:

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

В наборе артефактов и команд, которые вы показываете, есть несколько ключевых проблем:

и являются отдельными командами. В показанной вами команде он запускает образ как есть со своей командой по умолчанию, без томов монтируется и без опубликованных портов. не знает о файле , поэтому любые указанные здесь параметры не будут иметь эффекта. Вы можете иметь в виду , который также запустит базу данных. (В вашем приложении не забудьте попробовать несколько раз, чтобы оно появилось, часто это может занять 30-60 секунд.)

Если вы планируете нажать на изображение, вам нужно включить исходный код. По сути, вы создаете два отдельных артефакта в этой настройке: образ Docker с Node и некоторыми библиотеками, а также Javascript приложение на вашем хосте. Если вы изображение, оно не будет включать приложение (потому что вы не его не в него), поэтому вам также придется раздельно распространять исходный код. На этом этапе использование Docker не приносит большой пользы; конечный пользователь может также установить Node, клонировать ваш репозиторий и запустить самостоятельно.

Вы запрещаете Docker видеть обновления библиотеки. Размещение в анонимном томе представляется популярной установкой, и Docker будет копировать содержимое из изображения в этот каталог при первом запуске приложение. Во второй раз, когда вы запускаете приложение, Docker видит, что каталог уже существует, предполагает, что он содержит ценные пользовательские данные, и отказывается обновлять его. Это приводит к таким вопросам, как «я обновил свой файл, но мой контейнер не обновляется».

1

David Maze
9 Фев 2020 в 20:03

Ваш файл docker-compose.yaml имеет две службы:

  1. Адонис — MySQL
  2. Адонис — апи

Только второй элемент использует текущий файл Docker. Как видно из следующего раздела:

Команда будет создавать изображение только в текущем файле Docker, также известном как adonis-api. И тогда он запускается.

Так что, скорее всего, это может быть отсутствующий сервис mysql, который выдает ошибку. Вы можете проверить, запустив

Проверить, запущен ли контейнер sql. Надеюсь, поможет.

Вывод: используйте docker-compose.

1

Syed Affan Hamdani
9 Фев 2020 в 21:58

5 ответов

Лучший ответ

Контейнер Docker распределяется по категориям следующим образом.

  1. Задача: при запуске контейнера он начнет обработку и завершит процесс, а затем завершится.

  2. Фоновый контейнер: он будет ждать некоторого запроса.

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

Ваше утверждение сборки создает изображение с именем pm.

  1. Теперь ты бежишь докер запустить вечера Он запустит контейнер и остановится, так как вы не указали точку входа.

  2. Теперь попробуй это Это одна командная строка или терминал.

    Откройте другой терминал или командную строку.

  3. Если вы хотите увидеть контейнер, который постоянно работает, используйте следующее изображение. (Это всего лишь пример)

Над строкой запустите один контейнер с изображением Nginx, и когда вы откроете браузер http: // localhost: 8099, вы увидите ответ ,

dotnetstep
24 Окт 2018 в 02:20

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

вернет вывод, значит ваш контейнер в порядке.

1

Mahattam
24 Окт 2018 в 01:09

Контейнеры Docker тесно связаны с процессом, который они выполняют. Этот процесс определяется частью «CMD» в Dockerfile. Этот процесс имеет PID «1». Если вы убьете его, ваш контейнер будет убит. Если у вас его нет, ваш контейнер немедленно остановится. В вашем случае вы должны «переопределить» свой CMD. Вы можете сделать это с помощью простой команды: «Docker Run -it Ubuntu: 18.04 Bash». «-it» является обязательным, поскольку позволяет подключить stdin к вашему контейнеру.

Веселитесь с докером.

1

Jonathan Schoreels
23 Окт 2018 в 21:08

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

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

2

Ntwobike
23 Окт 2018 в 19:42

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

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

Ваш контейнер в основном ничего не делает: у него есть образ Ubuntu, но у него нет команды ENTRYPOINT или CMD для запуска чего-то. Контейнеры эфемерны при запуске: они запускают одну команду и выходят после ее завершения.

2

MrE
24 Окт 2018 в 00:41

Что такое Docker

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

Разработка Docker была начата в 2008 году, а в 2013 году он был опубликован как свободно распространяемое ПО под лицензией Apache 2.0. В качестве тестового приложения Docker был включен в дистрибутив Red Hat Enterprise Linux 6.5. В 2017 году была выпущена коммерческая версия Docker с расширенными возможностями.

Docker работает в Linux, ядро которых поддерживает cgroups, а также изоляцию пространства имен. Для инсталляции и использования на платформах, отличных от Linux, существуют специальные утилиты Kitematic или Docker Machine.

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

Docker-контейнеры работают в разных средах: локальном центре обработки информации, облаке, персональных компьютерах и т. д.

Что делать, если носитель не может быть загружен, потому что формат не поддерживается

  1. Обновите свой веб-браузер
  2. Отключите Adblock в вашем браузере
  3. Переключиться на браузер UR

1. Обновите свой веб-браузер

Чаще всего, когда вы получаете Носитель не может быть загружен, потому что формат не поддерживается ошибка, реальной причиной может быть то, что вы используете устаревший браузер.

В этом случае окончательным решением будет обновить ваш веб-браузер до последней версии, после чего вы сможете загружать и просматривать затронутые медиа / видео.

Чтобы обновить Google Chrome , выполните следующие действия:

  1. Откройте браузер Chrome на вашем компьютере.
  2. В окне меню (домашняя страница) перейдите в верхний правый угол и найдите «Параметры» (показано 3 точками).
  3. Нажмите на значок меню, а затем нажмите на Настройки .
  4. В левой части страницы настроек нажмите на значок гамбургера.
  5. Выберите О Google Chrome из меню.
  6. Отсюда браузер автоматически проверит наличие доступных обновлений и установит их напрямую.

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

2. Отключите Adblock в вашем браузере

Иногда некоторые сайты используют эту ошибку как дымовую завесу, чтобы обманным путем заставить вас отключить любую функцию блокировки рекламы в вашем браузере. В большинстве случаев видео, которое вы пытаетесь просмотреть, содержит некоторые объявления, и ваш браузер (с блокировщиком рекламы) не сможет воспроизвести это видео. Это приведет к тому, что носитель не может быть загружен, потому что формат не поддерживается ошибка .

Существуют различные способы включения / выключения AdBlock, в зависимости от браузера. А для удобства мы покажем вам, как отключить его в Google Chrome.

Вы можете просто отключить AdBlock на хост-сайте соответствующего видео, чтобы получить доступ к видео. Для этого следуйте инструкциям ниже:

  1. Откройте Chrome и перейдите на веб-сайт, на котором появляется это сообщение об ошибке.
  2. Нажмите на значок Параметры.
  3. Найдите и нажмите на значок ABP (AdBlock) .
  4. Отключите AdBlock, нажав на значок блокировки рекламы .
  5. Обновите страницу.

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

Однако, если вы используете веб-сервер, который не поддерживает определенные форматы видео (такие как MP4, OGG, WebM и т. Д.), Вам, возможно, придется перенастроить свой сервер, чтобы предложить поддержку этих форматов видео.

3. Переключитесь на UR Browser

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

Если вы не знаете, какой браузер загрузить на свой компьютер, мы рекомендуем UR Browser . Это браузерное решение основано на архитектуре Chromium. Это означает, что UR Browser может воспроизводить практически все доступные мультимедийные форматы.

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

Вывод

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

  • Как исправить Windows Media Player не может воспроизвести ошибку файла
  • Исправлено: Opera не отвечает в Windows 10, 8.1 или 7
  • Исправлено: потоковая передача мультимедиа не работает в Windows 10

Репозитории в composer.json

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

Обновите файл . Добавьте в него ссылку на репозиторий, из которого можно скачать библиотеку .

{
    "require": {
        "geoip2/geoip2": "~2.0"
    }, 
    "repositories": :antimattr/GoogleBundle.git"}
    ]
}

Затем обновите . Добавьте в него и укажите каталог, в котором Composer найдет файл :

FROM composer:latest AS composer
FROM php:7.2.3
COPY --from=composer /usr/bin/composer /usr/bin/composer
WORKDIR /app

Соберите вторую версию образа:

docker build -t php-composer:2.0 .

Проверьте версию Composer, чтобы убедиться, что сборка прошла успешно:

docker run -ti --volume $(pwd)/:/app php-composer:2.0 composer --version

Удалите файл , который остался от установки фреймворка Slim:

rm composer.lock

Запустите контейнер, передав команду :

docker run -ti --volume $(pwd)/:/app php-composer:2.0 composer install

Сборка должна быть успешной за исключением того, что нет Git. Просто скопировать исполняемый файл гита нельзя из-за зависимостей библиотек. Нужно добавить его в установку.

Снова обновите Dockerfile:

FROM composer:latest AS composer
FROM php:7.2.3
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt update && apt install -y git
WORKDIR /app

Соберите третью версию образа:

docker build -t php-composer:3.0 .

Запустите composer :

docker run -ti --volume $(pwd)/:/app php-composer:3.0 composer install

Теперь ошибок быть не должно.

Docker multi-stage билд

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

Схема развертывания будет такой:

  1. Запускаете контейнер с Composer.
  2. Запускаете контейнер с нужной версией PHP.
  3. Копируете из контейнера с Composer -файл.
  4. Создаете новый контейнер, из которого собираете образ.

Внутри Dockerfile должно быть так:

FROM composer:latest AS composer
FROM php:7.2.3
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN composer --version && php --v

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

Соберите образ:

docker build -t php-composer:1.0 .

Чтобы убедиться, что все работает, проверьте версию:

docker run -ti php-composer:1.0 --version

Терминология – что нужно знать

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

Особое значение новичкам необходимо уделить внимание следующим терминам и понятиям:

  1. Демон. Сервер контейнерного типа, который включен в состав программных средств Docker. Является неким «центром управления» объектами – хранилищами, контейнерами, сетями, образами.
  2. Клиент. Пользовательский интерфейс, при помощи которого юзер может взаимодействовать с Daemon. Поддерживает работу одновременно с несколькими демонами.
  3. Образ – своеобразный файл, который содержит конфигурацию, зависимости, а также сведения, необходимые для обеспечения инициализации и развертки containers.
  4. DockerFile – документ, который программерам приходится часто использовать. Содержит правила и принципы сборки образа. Первая строка отвечает за так называемый базовый Image. Остальные команды ответственны за копирование файлов и инициализацию контента для создания среды разработки.
  5. Контейнер – исполняемый пакет рассматриваемого программного обеспечения. Работает без проблем на разных устройствах. Его можно назвать автономным. Содержит в себе все, что может потребоваться при работе с приложениями. Обработка кода возможна, когда присутствует исходный код, среда обработки, системные инструменты и библиотеки с настройками.
  6. Тома – процедуры эмуляции файловых систем. Носят название Volume. Создаются автоматически совместно с Docker контейнерами.
  7. Docker Hub – репозиторий, своеобразное хранилище электронных материалов. Задействуется для хранения образов с разным программным обеспечением.
  8. Реестры – созданные когда-то и зарегистрированные серверы. Нужны для хранения Docker Images.
  9. Host – виртуальная машина (среда), которая используется для запуска контейнеров с программным обеспечением.
  10. Сети – компоненты, применяемые для организации большого количества сетевых интерфейсов в программах контейнерного типа.

Существуют различные Docker-registry. Вот несколько примеров:

  1. Докер Центр – реестр подгрузки образов. Отвечает в полной мере за обеспечение и размещение соответствующих элементов с интеграцией GitHub и BitBucket.
  2. Azure. Изолированные области, задействованные при работе с Images и их элементами в директории Azure.
  3. DTR (доверенные реестры) – службы Докер-реестров. После выполнения оных происходит установка софта на локальных компьютерах и в корпорационных сетках.

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

Docker Swarm

При преобразовании хостов в кластер нужно воспользоваться утилитой кластеризации Docker Swarm. Хост, находящийся в его составе, называется «узлом» (node), который бывает управляющим или рабочим. Один кластер содержит только один управляющий «узел».

Некоторые возможности утилиты

  1. Управление нагрузочными характеристиками — осуществляется оптимизация рассылки запросов между хостами, обеспечивая на них равномерную нагрузку.
  2. Динамическое управление — допускается добавление элементов в swarm-кластер без дальнейшего его перезапуска.
  3. Возможность масштабирования — позволяет добавлять или удалять docker-образ для автоматического создания контейнера.
  4. Восстановление «узла» после сбоя — работоспособность каждого хоста постоянно контролируется управляющим «узлом». При сбое кластера происходит его восстановление и перезапуск.
  5. Rolling-update — выполняет обновление контейнеров. Процедура может выполняться в определенной последовательности и с временной задержкой для запуска другого контейнера. Параметр указывается в настройках. Если произойдет сбой обновления, то Docker Swarm выдаст ошибку и процесс повторится заново.

Заключение

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

Докер характеризуется достаточно простым синтаксисом. Поэтому он довольно прост в освоении как для  опытных IT-специалистов, так и для новичков. Программное обеспечение совместимо со всеми версиями операционных систем Linux и Windows, поэтому область применения Docker практически не ограничена.

Оцените материал:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: