2017-02-21 12 views
0

Я работаю над настройкой на основе Docker для простого веб-приложения, работающего в Nginx + php-fpm. Общее предположение, которое я видел для хранения фактического кода PHP, заключается в том, чтобы сохранить его на хосте, а затем смонтировать его только для чтения в контейнерах Nginx и PHP.Общий, эфемерный только для чтения Объем докеров

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

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

ответ

1

Изображения докеров могут содержать тома, которые предварительно заполнены данными. Для этого в Dockerfile сначала заполните каталог (например, используя COPY или RUN), а затем объявите его как том. Это позволяет создать образ, который содержит код приложения внутри тома:

FROM php:7-fpm 

COPY ./app /var/www/html 
VOLUME /var/www/html 

Создание нового контейнера из этого образа будет создать новый том, инициализировать его с данными /var/www/html каталога на изображение и установить его в ваш новый контейнер в том же месте.

Сравнить the documentation для получения дополнительной информации: команда

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

FROM ubuntu 
RUN mkdir /myvol 
RUN echo "hello world" > /myvol/greeting 
VOLUME /myvol 

результаты Это Dockerfile в изображении, которое вызывает docker run, чтобы создать новую точку монтирования на /myvol и скопируйте файл greeting в недавно созданного тома.

Это позволяет просто запустить приложение изображение с docker run:

docker run -d --name app my_application_image 

Затем вы можете запустить свой контейнер Nginx и настроить его, чтобы использовать одни и те же объемы в качестве контейнера приложения с помощью --volumes-from флага:

docker run -d --name web --link app:app --volumes-from app my_nginx_image 

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

+0

Но это покрывает «эфемерную» часть моего вопроса? По моему мнению, этот метод оставил бы осиротые тома после того, как мои контейнеры прекратятся, чего я надеялся избежать. – phu

+0

Объемы контейнера должны быть удалены вместе с контейнером, по крайней мере, при использовании флага ['--volumes' или' -v'] (https://docs.docker.com/engine/reference/commandline/rm/# /опции). – helmbert