Здравствуйте,
Есть Rails-проект, который сейчас нужно поднять на серваке в связке nginx + puma, точнее я уже его поднял, все сделал используя докер. Отдельный контейнер для nginx и по контейнеру для staging и production-веток моего rails-приложения. База крутится на отдельном сервере и тоже в докер-контейнере. Все это было поднято и собрано в первый раз. т.е. это мой первый опыт работы с докером. Решил заняться настройкой деплоя, к этому моменту уже нахватался вершков и был уверен, что докер просто замечательно подходил для деплоя. В качестве первого шага наладил свой docker-registry, сделал в него push с dev-машины, а на хостинге из директории production, соответственно сделал pull. Тут реестр отработал не совсем так как я ожидал, я то думал, что он как git развернет всю структуру проекта внутри директории, в которой я делал пул, но он просто стянул image. "Ну и фиг с ним" подумал я, сделаю просто
docker run, но почему-то стартанула dev-версия проекта.
Это было вкратце, теперь попробую сопроводить все вышеизложенное конфигами и командами. :)
Я использую docker-compose, т.к. мне не понравилось городить огромные docker-команды с кучей параметров, примерно так выглядит мой docker-compose.yml:
version: '2'
services:
development:
container_name: app_dev
build: .
expose:
- "3000"
network_mode: host
environment:
PORT: 3000
RACK_ENV: development
RAILS_ENV: development
DATABASE_URL: 'localhost:27017'
production:
container_name: app_prod
image: app_prod
build:
context: .
dockerfile: Dockerfile-prod
restart: always
env_file: prod.env
ports:
- '8080:8080'
volumes:
- /puma
- /puma/log
- /puma/pids
staging:
...
Параметр image использую для добавления образа в registry, если я все правильно понял, то это аналог тега (-t), типа:
docker build -t app_prod.
Поправьте меня, если это не так. Вообще пока я учил все это дело, последние недели две, кроме документации читал всякие тутриалы где советовали создавать docker-compose.yml под каждый env и запускать потом как-то так:
docker-compose -f docker-compose.prod.yml build/up
Мне показалось, это неразумным, поэтому я описал все env в одном конфиге, а потом удобно запускал то, что мне нужно:
docker-compose up production
По-моему красиво, все работало на локальной машине. На хосте тоже работало (до того как попытался работать с registry). С registry алгоритм моих действий был примерно таким:
- смотрю "docker ps", вижу работающий контейнер, у котрого name и image равны app_prod
- docker tag app_prod my_registry:5000/app_prod:latest
- docker push my_registry:5000/app_prod:latest - пуш проходит
- иду на сервер, захожу директорию подготовленную для продакшна
- docker pull my_registry:5000/app_prod:latest - пул успешно выполняется
- делаю ls - удивляюсь тому, что директория пуста (как писал выше, ожидал, что это будет похоже на git-pull)
- ни о каком удобном "docker-compose up production" и речи быть не может.
- пробую сделать "docker run app_prod" - проект стартует но в режиме dev, запустить продакшн у меня не получается.
Вот наверное полный список моего тупления в докер :). Помогите разобраться в своих ошибках, наставьте на путь истинный :). Официальная документация мне, что-то не заходит. Особенно не понятно как используя composer нормально сформировать образ и отослать его в regitry.
После вышеописанного опыта я малость переосмыслил алгоритм, но видимо все-равно не верно. Сейчас я ожидаю такую работу:
- когда я делаю "docker-compose up production", то запускаю контейнер app_prod
- потом командой "tag app_prod" создаю образ на основе контейнера
- а "push" уже реально отправляет образ в мой registry-сервер
- на сервере делаю "pull" и получаю образ, который можно стартануть (start), который не надо ни собирать и настраивать, что-то типа "скомпилированное", но блин "start" не работает, а "run" вроде как делает внутри себя "build + start", т.е. что-то пересобирает.
Голова уже никакая, каша одна. Спасите! :)