So richten Sie Ihre Ruby on Rails-Entwicklungsumgebung mit Docker problemlos ein

Sie haben wahrscheinlich schon von Docker-Begriffen wie Containern, Bildern, Diensten, Volumes, Netzwerk, Docker-Datei, Docker-Compose-Datei gehört, oder? Oder Sie haben einige Videos darüber gesehen, was es ist, sind sich aber nicht sicher, wie es sich auf Ihr tägliches Leben als Entwickler auswirken kann?

Das habe ich mir zuerst gedacht, nachdem ich mir Videos über Docker angesehen hatte. Docker kann nicht nur Web-Apps, Server und Datenbanken ausführen, sondern auch eine lokale Entwicklungsumgebung sein! Ich habe diesen Artikel nicht nur geschrieben, damit Sie lernen können, wie es geht, sondern auch für mich, damit ich ihn nicht vergesse. Lass uns anfangen!

Inhaltsverzeichnis

  • Warum Docker?
  • Docker und Ignorefiles installieren
  • Dockerfile und Docker-Compose
  • Erstellen und Ausführen des Containers
  • Neue Rails App erstellen und Server starten
  • Aufräumen
  • Fazit und Repo

Warum Docker?

Warum Docker verwenden? Warum installieren Sie es nicht einfach auf Ihrem lokalen Computer und installieren Ruby Version Manager (rvm) oder Ruby Environment (rbenv)?

Das Einrichten von Ruby On Rails mit diesen Tools ist großartig. Ich habe mehr als 3 Stunden gebraucht, um die Dokumentation zu installieren, Fehler zu beheben und zu durchsuchen, damit sie funktioniert. Aber vor kurzem habe ich meinen Mac neu formatiert. Aber ich habe die von mir besuchten Websites nicht aufgelistet oder zur Kenntnis genommen, damit sie auf meinem Computer funktionieren. Ich habe vergessen, wie man es wieder installiert, und es ist mühsam, die Schritte zu wiederholen.

Hier glänzt Docker. Installieren Sie Docker, laden Sie Ihre Docker-Dateien, führen Sie einige Befehle in Ihrem Terminal aus, Sie sind bereits eingerichtet! Und was ist, wenn Sie alles deinstallieren möchten, was Sie getan haben? Es ist schwer zu verfolgen, welche Schritte rückgängig gemacht werden müssen. Mit Docker sind nur ein paar Befehle zum Bereinigen erforderlich.

Als ich mir ein Online-Tutorial über Docker ansah, sagte Dan Wahlin, der Lehrer, dass einer der Vorteile von Docker darin besteht, das Einbinden von Entwicklern zu beschleunigen. Dan sagte in seinem Tutorial:

"Docker kann dort helfen, da wir ein oder mehrere Images erstellen können, die dann in laufende Container konvertiert werden können, und diese Container können auf unseren verschiedenen Entwicklern und sogar auf Designermaschinen ausgeführt werden."

Angenommen, Sie haben ein Team aus Entwicklern, Designern und Testern und eine App mit einem Back-End-Server, einem Datenbankserver und einem Caching-Server. Sie haben 12 Clean Slate-Maschinen mit einer Kombination aus Linux- und Mac-Computern. Möchten Sie wirklich installieren, Fehler beheben und unterschiedliche Installationsanweisungen befolgen, die von der Maschine abhängen? Lassen Sie die Teile dann einzeln auf jeder Maschine arbeiten, ohne die Gewissheit zu haben, dass sie auf dem Weg keine unterschiedlichen Fehler aufweisen?

Deshalb habe ich mir Zeit genommen, um Docker zu studieren. Mit ein paar Befehlen und ein paar Zeilen einer Konfigurationsdatei sind Sie bereits eingerichtet. Im nächsten Abschnitt werden wir uns mit dem Docker-Setup die Hände schmutzig machen.

Docker installieren und Ignorierdateien einschließen

1. Installieren Sie Docker

Ich werde nicht viel über die Installation von Docker sprechen, es gibt viele Videos da draußen. Aber normalerweise müssen Sie nur das Installationsprogramm herunterladen und öffnen, ein Konto bei Dockerhub registrieren und loslegen. Lesen Sie die Docker-Installationsdokumente.

2. Erstellen Sie eine .dockerignoreDatei

Was ist eine Dockerignore-Datei? Die Dockerignore-Datei teilt Docker lediglich mit, welche Dateien in seinem Container ignoriert werden sollen. Ein Beispiel ist, wenn Sie über minimierte Assets, JS- und CSS-Dateien verfügen, die von Zeit zu Zeit geändert werden, wenn Sie den ursprünglichen Code ändern. Dies gilt auch für Gitignore-Dateien. Normalerweise befindet sich die Liste der empfohlenen zu ignorierenden Dateien im Internet. Sie können dieses Wesentliche selbst kopieren .dockerignore.

Und wenn Sie git verwenden, fügen Sie diesen Codeausschnitt in Ihre ein .gitignore.

Die Ignorierdateien sind etwas lang, deshalb habe ich nur Links eingefügt.

Dockerfile und Docker-Compose-Datei

Hier findet der größte Teil der Operation statt. Stellen Sie sich diese beiden Dateien als Anweisungen vor, die Docker zum Einrichten Ihres virtuellen Containers befolgt. Dockerfile und Docker-Compose-Datei arbeiten Hand in Hand. Sie können mehrere Docker-Dateien für verschiedene Dienste und eine Docker-Compose-Datei haben, um sie miteinander zu verknüpfen.

3. Erstellen Sie eine Datei mit dem Namen Dockerfile

Eine Docker-Datei ist eine Datei mit Regeln, die Docker befolgen wird. Auf dem Docker-Hub befinden sich vorgefertigte Regeln. Ein Beispiel sind vorgefertigte Installationsanweisungen für MySQL, PHP oder Node.js. DockerfileFügen Sie diesen Code nach dem Erstellen in Ihre Docker-Datei ein. Und ich werde eine kurze Erklärung durchgehen, was diese Zeilen tun.

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- Dies bedeutet, dass Docker ein vorgefertigtes Setup von Ruby abruft. Sie müssen nicht daran denken, die neueste Ruby-Version zu aktualisieren oder auf Ihrem Computer zu installieren. Sie sehen die Liste der vorgefertigten Bilder von Docker auf ihrem Dockerhub. Betrachten Sie es als npm.
  • WORKDIR /home/app- Arbeitsverzeichnis. Arbeitsverzeichnis bedeutet, dass dies Ihr Standardordner ist, wenn Sie Ihre Entwicklungsumgebung starten. Sie können es benennen, was Sie wollen.
  • ENV PORT 3000- Umgebungsvariable. Dadurch wird eine Variable mit dem Namen " $PORTBash" auf Ihrem Bash-Terminal auf "3000" gesetzt.
  • EXPOSE $PORT - Stellen Sie Port 3000 (den wir zuvor festgelegt haben) des virtuellen Containers Ihrem lokalen Computer zur Verfügung.
  • RUN- Ausführungsbefehle sind einige Setup-Anweisungen, die das Terminal ausführen soll, bevor Sie es verwenden. In unserem Fall haben wir Ruby auf Rails, Bundler und node.js installiert, bevor wir überhaupt die Entwicklungsumgebung verwenden, damit alles bereit ist, wenn wir es verwenden.
  • ENTRYPOINT ["/bin/bash"]- Dieser Befehl teilt Docker mit, welcher Befehl ausgeführt werden soll, wenn der Container ausgeführt wird. In unserem Fall müssen wir das Bash-Terminal ausführen, damit wir auf Schienen zugreifen können.

Beachten Sie, dass diese Erklärungen nur kurz sind. Sie können weitere Erklärungen sehen oder in Dockerfile-Referenzdokumenten vertiefen.

Mit Dockerfile können Sie coole Sachen machen. In meinem Fall habe ich versucht, zsh und oh-my-zsh auf meinem Container zu installieren, da er einige coole Funktionen zur automatischen Vervollständigung bietet. Aber in unserem Beispiel brauchen wir es nicht wirklich, es erhöht nur unsere Bildgröße, also habe ich es nicht aufgenommen.

4. Erstellen Sie eine Datei mit dem Namen 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