Прежде чем начать, убедитесь, что у вас установлен docker и docker-compose, если же нет, то используйте ссылки в конце документа.
Для использования docker в своем проекте, первое, что нужно сделать, это добавить Dockerfile. Этот файл описывает процесс сборки контейнера для вашего проекта. В нем указываются настройки сборки и инструкции для установки зависимостей.
Пример такого файла для простого rails-проекта:
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myappТеперь, нужно добавить файлы зависимостей для rails: Gemfile и Gemfile.lock
Gemfile:
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'Gemfile.lock будет пустой сейчас, поэтому его просто нужно создать:
touch Gemfile.lock
Теперь нужно добавить файл docker-compose.yml, который используется для описания всех связанных с проектом контейнеров, их запуска и взаимодействия между ними.
Пример простого docker-compose.yml файла:
version: '3'
services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- dbТеперь можно заняться сборкой проекта. Так как на данный момент у нас только файлы зависимостей и настроек docker, то воспользуемся командой для создания нового проекта. Если у вас проект уже есть, то сразу переходите к сборке контейнера.
Команда создания нового проекта:
docker-compose run web rails new . --force --database=postgresql
Эта команда создаст проект и синхронизирует его с docker-контейнером.
Если вы используете Linux, то нужно дать доступ к изменению файлов проекта: sudo chown -R $USER:$USER.
Теперь можно собрать контейнер полностью:
docker-compose build <service_name>
<service_name> - это имя сервиса, который будет собран. Он выбирается из docker-compose.yml. Если имя не указывать, то будут собраны все сервисы.
Далее, нужно поправить настройки соединения с базой данных. В config/database.yml добавляются: имя пользователя, пароль и хост (имя хоста нужно взять из docker-compose.yml файла. В нашем случае, это db.)
Пример измененного файла базы данных:
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_testПроект настроен и собран. Теперь можно перейти к запуску проекта и описанию команд.
Для запуска всех контейнеров (сервисов):
docker-compose up -d
Данная команда запустит все контейнеры и вернет управление в терминал.
docker-compose up <service_name>
Данная команда запустит сервис, имя которого указано, а также все связанные с ним сервисы (они указываются в depends_on в docker-compose.yml).
Результат работы можно увидеть в браузере, если открыть 0.0.0.0 с нужным портом. В текущем примере, это - 0.0.0.0:3000.
В разеделе указаны основные команды, которые следует использовать при разработке с использованием docker в development окружении.
| Название команды | Синтаксис команды | Описание команды | Пример команды |
|---|---|---|---|
| Запуск всех контейнеров (сервисов) | docker-compose up -d |
Команда запустит все контейнеры и вернет управление в терминал. | |
| Запуск конкретного контейнера | docker-compose up <service_name> |
Команда запустит указанный контейнер и все контейнеры, которые связаны с ним. Команда не вернет управление в терминал. | docker-compose up web |
| Остановка всех запущенных контейнеров | docker stop $(docker ps -q) |
Команда остановит все запущенные контейнеры. | |
| Отобразить список запущенных контейнеров | docker ps |
Команда отображает в терминале список всех запущенных контейнеров. | |
| Собрать все контейнеры | docker-compose build |
Команда выполняет сборку всех контейнеров. | |
| Собрать конкретный контейнер | docker-compose build <service_name> |
Выполняется сборка только указанного контейнера. | docker-compose build web |
| Удалить все контейнеры. | docker rm $(docker ps -qa) |
Все ранее собранные контейнеры будут удалены. | |
| Удалить конкретный контейнер | docker rm <service_name> |
Будет удален указанный контейнер. Имя контейнера лучше брать из команды, которая отображает все запущенные контейнеры: docker ps. Имя контейнера немного отличается от имени сервиса из compose файла. Также вместо имени, можно использовать UID контейнера. |
docker rm myapp_web_1 |
| Удалить все образы (образы используются в качестве основы для контейнеров) | docker rmi $(docker images -q) |
Будут удалены все загруженные образы. Если использовать эту команду с командой удаления всех контейнеров, то получится полная очистка docker-а. |
|
| Запустить команду внутри контейнера | docker-compose run <service_name> <command_text> |
Указанная команда будет запущена внутри контейнера. | docker-compose run web rake db:create |
Далее будут указаны команды, которые могут использоваться для работы с rails-проектом, в котором используется docker. В качестве примера используется контейнер web из примера выше.
| Синтаксис команды | Описание команды |
|---|---|
docker-compose run web rake db:drop |
Удалить базу данных проекта |
docker-compose run web rake db:create |
Создать базу данных проекта |
docker-compose run web rake db:migrate |
Запустить миграции |
docker-compose run web rake db:seed |
Заполнение базы данных сидами |
docker-compose run web bundle |
Установка gem-ов. Эта команда добавит gem в Gemfile.lock. После этой команды нужно выполнить сборку контейнера |
docker-compose run web rspec spec |
Запуск тестов rspec |
- Установка
docker: https://docs.docker.com/engine/installation/ - Установка
compose: https://docs.docker.com/compose/install/ - Использование
composeсrails: https://docs.docker.com/compose/rails/ - Использование
byebugвrails: https://stackoverflow.com/a/32690885
Все контейнеры собирались и проверялись на Ubuntu Linux 16.04 и macOS Sierra 10.12.5.
Есть инструкция для более новых версий ruby 3+ && rails 6+?