Прежде чем начать, убедитесь, что у вас установлен 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 2.7 и rails 6.1, все работает. Конфиги получаются примерно такие же.