Использование докера во время рабочего процесса разработки

Я использую 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.