Использование докера во время рабочего процесса разработки
Я использую boot2docker для OS X и клонировал следующий репо:
https://github.com/enokd/docker-node-hello
В основном это файл Dockerfile и очень простое экспресс-приложение, которое печатает мир привет. Все отлично работает, когда я создаю и запускаю образ, но, конечно, если я внесу какие-либо изменения в index.js на моем Mac, ни один из них не отразится на моем рабочем изображении. Я не могу найти никаких ссылок на то, как я установил докер, чтобы я мог запустить его в своей среде разработки, чтобы автоматически подбирать мои исходные коды, поэтому я чувствую, что я "делаю это неправильно". Любые предложения?
Вот как я его запускаю (я не использую Vagrant и не совсем уверен, что это имеет значение):
$ docker build -t gasi/centos-node-hello .
$ docker run -p 49160:8080 -d gasi/centos-node-hello
$ curl localhost:49160
Обновление: добавлен ответ с тем, что я закончил делать.
Обновление: добавлен новый ответ с помощью boot2docker 1.3+ и рис.
Ответы
Ответ 1
Это то, что я делал, пока что работает, но я все еще копаю в нем:
# script located in bin/run
NS=mycompany
PROJECT=myproject
# kill and remove old container if it exists
docker kill $PROJECT
docker rm $PROJECT
# tag the previously built image
docker tag $NS/$PROJECT $NS/$PROJECT:old
# build the new image
docker build -t $NS/$PROJECT .
# remove the old image
docker rmi $NS/$PROJECT:old
docker run -dP --name=$PROJECT $NS/$PROJECT /sbin/my_init
В корне моего проекта я просто запускаю:
nodemon -x bin/run
Кредит относится к этому источнику .
Обновление для докеров 1.3 и рис
Fig отлично, на самом деле у него была большая сложность из script, который у меня был раньше. Кроме того, boot2docker теперь поддерживает установки томов в Mac OS X, используя общие папки Virtual Box. Это то, что я нахожу для меня сейчас очень хорошо:
Сначала Dockerfile
:
FROM ubuntu:14.04
# Replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
# Set debconf to run non-interactively
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
# Install base dependencies
RUN apt-get update && apt-get install -y -q --no-install-recommends \
build-essential \
ca-certificates \
curl \
git \
libssl-dev \
python \
rsync \
software-properties-common \
wget \
&& rm -rf /var/lib/apt/lists/*
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 0.10.33
# Install nvm with node and npm
RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash \
&& source $NVM_DIR/nvm.sh \
&& nvm install $NODE_VERSION \
&& nvm alias default $NODE_VERSION \
&& nvm use default
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/v$NODE_VERSION/bin:$PATH
CMD ["npm", "start"]
fig.yml
:
app:
image: myNodeImage
working_dir: /home/myProject
volumes_from:
- myvols
Здесь новый bin/run
:
#!/usr/bin/env bash
# This is the the bin/run script
docker run --rm --volumes-from myvols myNodeImage \
rsync \
--delete \
--recursive \
--safe-links \
--exclude .git --exclude node_modules \
/data/myProject/ /home/myProject
fig up
У меня также есть bin/install
script, который устанавливает зависимость node_modules
. Это предполагает, что я уже сделал установку npm на моем хосте, чтобы все частные пакеты работали. Кроме того, это отлично работает с ссылками на npm, вам просто нужно сделать символическую ссылку из /home/linkedProject
в $NODE_PATH/linkedProject
в вашем контейнере.
#!/usr/bin/env bash
# This is the the bin/install script
docker run --rm --volumes-from myvols myNodeImage \
rm -rf /home/myProject && \
rsync \
--delete \
--recursive \
--safe-links \
--exclude .git \
/data/myProject/ /home/myProject && \
cd /home/myProject && \
npm rebuild
Итак, чтобы собрать все это вместе, выполните следующие шаги:
-
Создайте контейнер объема данных:
docker run -v $HOME/data:/data:ro \
-v /home \
-v /path/to/NODE_PATH \
--name myvols myNodeImage echo Creating my volumes
-
Запустите мою установку script: cd ~/data/myProject && ./bin/install
-
Запустите мой запуск script: nodemon -x bin/run
Ответ 2
Ваш вопрос действительно интересный и (частично), не связанный конкретно с Docker.
Позвольте мне сказать, что главная и последняя проблема здесь - использование виртуальной машины.
Отслеживание изменений кода на главном компьютере может быть проблемой при использовании виртуальной машины (голой виртуальной виртуальной машины, виртуальной виртуальной машины, виртуальной машины Docker boot2docker...)
VM - это полный слой абстракции между вашим Mac (где происходят изменения вашего кода) и ваш стек приложений (здесь контейнер Docker работает на крошечной виртуальной машине Linux).
-
Вы должны явно определить общую папку (NFS,...) в Virtualbox, между вашим Mac и boot2docker. Эта общая папка будет корнем вашего репозитория кода. Это первый шаг.
Mac:/Users/You/stuff/approot === > boot2docker: /something
- Затем вам нужно будет указать контейнеру Docker использовать Том (терминальная терминология), связанный с boot2docker, и указать на него приложение Docker:
docker run -v /something:/app/path/inside/docker -p 49160:8080 \
-d gasi/centos-node-hello /usr/bin/node /app/path/inside/docker/index.js
-
У NodeJs обнаружение изменений файлов - еще одна проблема. Вам понадобится дополнительная оболочка, наблюдающая за файловой системой и перезапуск Node при изменении кода (Forever, Nodemon...).
-
И после этого, поскольку изменения не происходят в локальной файловой системе, но в общей папке вам, вероятно, придется сообщить наблюдателю Nodejs (Forever/Nodemon/...) использовать опрос Режим. Он работает (более или менее), но сжигает много процессора.
Ответ 3
Относительно общих папок с VirtualBox, пожалуйста, проверьте:
boot2docker вместе с дополнениями для VirtualBox
Как монтировать/Пользователи в boot2docker
https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c
tl; dr Создайте собственный пользовательский boot2docker.iso с помощью VirtualBox Guest Дополнения (см. ссылка) или загрузите http://static.dockerfiles.io/boot2docker-v1.1.0-virtualbox-guest-additions-v4.3.12.isoи сохраните его в ~/.boot2docker/boot2docker.iso.
EDIT: обновленная ссылка на boot2docker v1.1.0
Ответ 4
Есть несколько сценариев, которые докер может помочь в веб-разработке:
-
быстрое освещение всех различных видов услуг на местном уровне. вам нужен чистый couchdb, запустите docker run -d -p 5984:5984 tutum/couchdb
; mysql, без проблем: docker run -d -p 3306:3306 tutum/mysql
, сервер selenium с firefox? easy: sudo docker run -p 4444:4444 -d lzhang/selenium
, вы получите их немедленно, и их можно будет уничтожить на docker kill
в следующие секунды, когда вы их не захотите. хорошо подходят для локального сценария тестирования, нет необходимости беспокоиться о том, как их настроить.
-
управлять зависимостями программного обеспечения. например, вы хотите запустить приложение node в разных версиях node (0,8, 0,10, 0,10,25 и т.д.), просто найдите изображения докеров-новичков с помощью docker search nodejs
и создайте контейнеры, установив каталог приложений как том, вы можете запускать несколько контейнеров, которые изолированы друг от друга. Взгляните на мой проект keystonejs-example о том, как запустить сложное приложение node с помощью mongodb в секундах с конфигурацией 0. мышление более сложной модели: балансировка нагрузки + приложение + база данных + кеш, в старой школе, есть тонны параметров конфигурации, которые подходят для процедуры установки, но если вы предоставите их в виде отдельных контейнеров и связывать их по именам, каждый компонент может обнаруживать друг друга с помощью локальных переменных окружения, как локальный PaaS.
-
простой способ использования приложения путем поиска docker index. например, есть аккуратный инструмент, называемый Checkble checkble, вы можете быстро загрузить/использовать его в контейнере с готовой конфигурацией с помощью одной команды, даже не нужно думать о конфигурации, загружать язык, настраивать, удалять и т.д.
В boot2docker я предполагаю, что вы находитесь на OSX, поэтому лучше выбрать версию v0.9.2 +, которая поддерживает сетевую конфигурацию, но вы можете получить доступ к контейнерам, которые запускаются внутри виртуальной машины через сеть hostonly.