Як безболісно налаштувати робоче середовище Ruby on Rails за допомогою Docker

Ви, напевно, чули про такі терміни Docker, як контейнери, зображення, послуги, томи, мережа, Dockerfile, файл складання docker, правда? Або ви переглянули кілька відео про те, що це таке, але не знаєте, як це може стосуватися вашого повсякденного життя розробника?

Це те, що я вперше подумав, переглянувши відео про Докера. Docker може не тільки запускати веб-програми, сервери та бази даних, але це також може бути локальним середовищем розробки! Я написав цю статтю не тільки для того, щоб ви могли навчитися це робити, але й для мене, тому я її не забуду. Давайте розпочнемо!

Зміст

  • Чому Docker?
  • Встановлення Docker та Ignorefiles
  • Dockerfile та Docker-Compose
  • Створення та запуск контейнера
  • Створення нової програми rails та запуск сервера
  • Очищення
  • Висновок та репо

Чому Docker?

Навіщо використовувати докер? Чому б просто не встановити його на локальній машині та не встановити Ruby Version Manager (rvm) або Ruby Environment (rbenv)?

Налаштування Ruby On Rails за допомогою цих інструментів є чудовим. Мені знадобилося понад 3 години встановлення, пошуку та усунення несправностей та пошуку документації, щоб він працював. Але нещодавно я переформатував свій mac. Але я не перерахував і не взяв до відома веб-сайти, які я відвідував, щоб це працювало на моїй машині. Я забув, як встановити його знову, і боляче повторювати кроки.

Тут блищить Докер. Встановіть docker, завантажте свої docker-файли, запустіть кілька команд у своєму терміналі, ви вже налаштовані! А також, що якщо ви хочете видалити все, що зробили? Важко відстежити, які кроки скасувати. З Docker це лише кілька команд для очищення.

Коли я дивився онлайн-посібник про докер, викладач Ден Вахлін сказав, що однією з переваг докера є пришвидшення процесу реєстрації розробників. Ден сказав у своєму підручнику:

"Docker може допомогти там, тому що ми можемо створити одне або кілька зображень, які потім можна перетворити на запущені контейнери, і ці контейнери можуть працювати на наших різних розробниках і навіть дизайнерських машинах".

Скажімо, у вас є команда розробників, дизайнерів і тестувальників, і у вас є програма з внутрішнім сервером, сервером баз даних та сервером кешування. У вас є 12 чистих машин, що поєднують комп’ютери Linux і Mac. Ви дійсно хочете перейти до встановлення, усунення несправностей та дотримання різних інструкцій із встановлення, які залежать від машини? Тоді змусьте шматки працювати по черзі на кожній машині, не запевняючи, що вони не зіткнуться з різними помилками на своєму шляху?

Ось чому я витратив час на вивчення Докера. За допомогою кількох команд і декількох рядків конфігураційного файлу ви вже налаштували. У наступному розділі ми забруднимо руки налаштуванням докера.

Встановлення Docker та включення Ignorefiles

1. Встановіть Docker

Я не буду багато говорити про встановлення докера, там багато відео. Але зазвичай це просто завантаження та відкриття програми встановлення, реєстрація облікового запису на dockerhub, і все готово. Перегляньте документи щодо встановлення Docker.

2. Складіть .dockerignoreфайл

Що таке файл dockerignore? Файл Dockerignore просто повідомляє Docker, які файли ігнорувати у своєму контейнері. Прикладом є випадки, коли у вас є мініфіковані ресурси, js, css-файли, які час від часу змінюються, коли ви змінюєте вихідний код. Це також стосується файлів gitignore. Зазвичай список рекомендованих файлів для ігнорування зазвичай можна знайти в Інтернеті. Ви можете скопіювати цю суть самостійно .dockerignore.

А якщо ви використовуєте git, помістіть цей фрагмент коду у свій .gitignore.

Ігнорефіли трохи довгі, тому я просто розміщую посилання.

Файл Docker та файл для створення докера

Тут відбувається більша частина операції. Подумайте про ці два файли як про набір вказівок, яких докер дотримується, як налаштувати віртуальний контейнер. Файл Docker і файл, що складає docker, працюють рука об руку. Ви можете мати кілька файлів Docker для різних служб, а також один файл для складання докерів, щоб зв’язати їх між собою.

3. Створіть файл з іменем Dockerfile

Докер-файл - це файл із набором правил, які ви встановите, і які виконуватиме докер. Існує заздалегідь побудований набір правил, знайдених на концентраторі Docker. Прикладом є попередньо створені інструкції з встановлення MySQL, або PHP, або Node.js. Після створення Dockerfile, розмістіть цей код у своєму Dockerfile. І я розгляну коротке пояснення щодо того, що роблять ці рядки.

FROM ruby WORKDIR /home/app ENV PORT 3000 EXPOSE $PORT RUN gem install rails bundler RUN gem install rails RUN apt-get update -qq && apt-get install -y nodejs ENTRYPOINT [ "/bin/bash" ] 
  • FROM ruby- це означає, що докер витягне заздалегідь побудовану установку за допомогою ruby. Вам не потрібно думати про оновлення або встановлення на вашій машині останньої рубінової версії. Ви побачите список попередньо побудованих зображень Docker на їх Dockerhub. Думайте про це як про npm.
  • WORKDIR /home/app- Робочий каталог. Робочий каталог означає, що це місце розташування папки за замовчуванням під час запуску середовища розробки. Ви можете назвати його як завгодно.
  • ENV PORT 3000- Змінна середовища. Це встановить для змінної з іменем $PORTна терміналі bash значення 3000.
  • EXPOSE $PORT - виставити порт 3000 (який ми встановили раніше) віртуального контейнера на локальній машині.
  • RUN- Команди запуску - це деякі інструкції з налаштування, за якими ви хочете, щоб термінал працював перед тим, як використовувати його. У нашому випадку ми встановили ruby ​​на rails, bundler та node.js ще до того, як ми навіть використовуємо середовище розробки, тому воно все готове, коли ми його використовуємо.
  • ENTRYPOINT ["/bin/bash"]- ця команда повідомляє docker, яку команду виконувати під час запуску контейнера. У нашому випадку нам потрібно запустити bash-термінал, щоб ми мали доступ до рейок.

Зауважте, що ці пояснення є лише короткими. Ви можете побачити більше пояснень або зробити глибоке занурення у довідкових документах Dockerfile.

Ви можете робити різні цікаві речі за допомогою Dockerfile. У моєму випадку я спробував встановити zsh і oh-my-zsh на мій контейнер, оскільки він має кілька цікавих функцій автозавершення. Але в нашому прикладі нам це насправді не потрібно, це лише збільшить розмір нашого зображення, тому я його не включив.

4. Створіть файл з іменем docker-compose.yml

Docker compose file is a file that ties up different services together. A good example is when you're wiring up your rails app to different servers like MySQL database server, or redis caching server. You can easily make them work with this file. But for our case, we'll stick to the minimum setup for clarity purposes. A YAML file is a type of markdown file with different rules on how to format your file. Just think of it as a JSON file, without the braces. Put this in your docker-compose.yml file.

version: "3.7" services: ruby_dev: build: . container_name: ruby_container ports: - "3000:3000" volumes: - ./:/home/app 

As you can see, it kinda looks like the Dockerfile, but with a little bit of indentation. Let's go through the lines.

  • version - Through time, docker-compose file went through changes. That's why in docker-compose files, they need to specify which version they are using. In our case we just use the latest version as of this time.
  • services - Specify list of services. As I said earlier, you can have many services like a rails server, and a MySQL server on your project. You can name your services any name you want. I named it ruby_dev.
  • build: . - The dot here means a file path where to find the Dockerfile, which is the build instructions.
  • container_name - The name of the container.
  • ports: - these are the ports to expose from the docker container to our host local machine. The pattern here is HOST:CONTAINER. In our case it's "3000:3000". Which means we are letting the default Rails server port (3000) be available in our local machine's "localhost:3000".
  • volumes: - volume means even if we quit or delete Docker, we can specify which files we can keep in our local machine. We put ./:/home/app there because we named in our Dockerfile earlier the workdir to be /home/app.

You can see more explanations on Docker Compose reference docs.

Building and running the container

With all our config files setup, let's build and run the container! After the loads of terms we encountered, building and running the container is way simpler. It will only involve few commands.

5. In your terminal, run docker-compose build

Running this command will get Dockerfile and install all the necessary things to make a rails development environment. Note that the installation may take a while because docker will need to download the necessary packages.

6. In your terminal, run docker-compose run --rm --service-ports ruby_dev

This command will start a bash terminal that will be your rails development environment where the rails commands are available. With only these two commands, and two config files, you already have a rails environment without even going through a log of troubleshooting! Notice that our command has some flags, --rm means remove the container after using it, and --service-ports means use port 3000 in our container so we can see our rails server in action. The name ruby_dev also came from services found at our docker-compose.yml.

Test-run a rails app

Now that we've successfully made our rails development environment, we'll test a sample rails app.

1. Run rails new myapp && cd myapp

This command will create a new rails app in a folder named myapp. After that the terminal will go the folder. You can name it whatever you want.

2. Update and install gems. Run bundle update && bundle install

Just make sure you're in the right folder, in myapp, which contains the rails app files. This command will update and install your dependencies.

3. Test the server by running rails server -p $PORT -b 0.0.0.0

Remember the port we specified in our Dockerfile before? This is where we can use it. In our case, rails will use port 3000 to start the server. Don't forget to put -b 0.0.0.0 because you won't see the app on your local machine without this.

4. Stop the server by pressing ctrl-d on your keyboard.

Cleaning Up

After you're done with everything, you can exit on your container by running exit on your container's bash terminal. The --rm flag you typed before will remove the container, but will you get to keep your ruby on rails files.

Run docker-compose down to cleanup

Cleaning up is when you're done with the project, and you want to remove your dev environment so you can save space. If you're really done, you can use this command. Docker will remove all your setup, and the images you downloaded. This so powerful, because, imagine you followed a lot of steps and a lot of installation on your mac. The only way to remove that setup is to uninstall them one by one. With docker on our side, it's just one command. Aww yeah!

Conclusion

Glad you made this far! Let's look at the big picture. Setting up a dev environment in Docker can be broken down in 2 steps:

  1. List the instructions you need on your Dockerfile and docker-compose file.
  2. Start or stop or cleanup your dev environment with the docker-compose command.

This is a big win for us. You just need to keep the Dockerfile and compose file and whenever you switch machines, you just run two commands! Setup once, and forget.

Repository

You can see the repository on how the setup looks like, and additional commands that you need here by checking out the full github repo here.

If you find the article helpful, or if you have some additional questions, throw it in the comments. I'll be glad to help!

This article was written by Jonathan Cunanan on freeCodeCamp News.

? Twitter - ? freeCodeCamp -  ? Portfolio - ⚛️ Github