<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>The Ops Community ⚙️: Luis Angel Ortega</title>
    <description>The latest articles on The Ops Community ⚙️ by Luis Angel Ortega (@linksake).</description>
    <link>https://community.ops.io/linksake</link>
    <image>
      <url>https://community.ops.io/images/VSkUyv_OLQKblmTrTChZOjXDplDO9-3Lc1xi4JSqDqw/rs:fill:90:90/g:sm/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL3Vz/ZXIvcHJvZmlsZV9p/bWFnZS8xMzUvYjdk/OTU3OWEtYTY5My00/ZWY5LWE1OTYtZGNj/YjczNmU3MjA5Lmpw/ZWc</url>
      <title>The Ops Community ⚙️: Luis Angel Ortega</title>
      <link>https://community.ops.io/linksake</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://community.ops.io/feed/linksake"/>
    <language>en</language>
    <item>
      <title>Docker + Rails: Una solución para tus dolores de cabeza</title>
      <dc:creator>Luis Angel Ortega</dc:creator>
      <pubDate>Wed, 25 May 2022 21:02:47 +0000</pubDate>
      <link>https://community.ops.io/linksake/docker-rails-una-solucion-para-tus-dolores-de-cabeza-5bfc</link>
      <guid>https://community.ops.io/linksake/docker-rails-una-solucion-para-tus-dolores-de-cabeza-5bfc</guid>
      <description>&lt;p&gt;¿Has llegado a pasar una semana solamente tratando de correr el proyecto al que te acabas de unir? ¿O tu aplicación no corre en producción como corría en local?&lt;br&gt;&lt;br&gt;
Hay una multitud de factores que pueden contribuir esto, por ello &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; nos ofrece una solución con la cual podemos tener un mayor control sobre estas variables a través de las computadoras que sean necesarias.  &lt;/p&gt;

&lt;p&gt;Dicho esto, en este articulo veremos como falicitarnos la vida al tener toda nuestra aplicación de Ruby on Rails corriendo sobre Docker; incluidas las bases de datos que sean necesarias.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisitos
&lt;/h2&gt;

&lt;p&gt;Para poder seguir esta guía necesitaras tener &lt;a href="https://docs.docker.com/get-docker/"&gt;Docker instalado&lt;/a&gt; así como un proyecto el cual quieras &lt;em&gt;dockerizar&lt;/em&gt;, si solamente quieres prácticar puedes usar &lt;a href="https://github.com/LinkSake/docker-rails"&gt;este proyecto de ejemplo&lt;/a&gt; el cual necesita una conexión a &lt;a href="https://es.wikipedia.org/wiki/PostgreSQL"&gt;Postgres&lt;/a&gt; y a &lt;a href="https://es.wikipedia.org/wiki/Redis"&gt;Redis&lt;/a&gt; para funcionar.&lt;/p&gt;

&lt;p&gt;¿Eres impaciente? ¡Puedes clonar &lt;a href="https://github.com/LinkSake/docker-rails/tree/docker"&gt;esta rama&lt;/a&gt; del proyecto donde ya se encuentran los archivos necesarios para correr el projecto dentro de Docker!&lt;/p&gt;
&lt;h2&gt;
  
  
  Primero viene el Dockerfile
&lt;/h2&gt;

&lt;p&gt;Lo primero que haremos será hacer una &lt;a href="https://docs.docker.com/get-started/overview/#docker-objects"&gt;imagen&lt;/a&gt; personalizada para nuestro proyecto, así que crearemos un archivo en la raíz del mismo llamado &lt;code&gt;Dockerfile&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La primer linea de nuestro archivo definirá la imagen de la cual nos basaremos, en este caso será la &lt;a href="https://hub.docker.com/_/ruby"&gt;imagen oficial de Ruby&lt;/a&gt;, pero usaremos la versión de &lt;a href="https://es.wikipedia.org/wiki/Alpine_Linux"&gt;Alpine&lt;/a&gt; para tener una imagen más ligera como resultado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ruby:3.0.1-alpine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Asegurate que la version de Ruby (ruby:X.X.X-alpine) sea la misma que en tu proyecto, o tendrás errores a la hora de tratar de construir la imagen. Puedes encontrar la versión que usa tu proyecto en tu Gemfile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Después sigue la parte más dificil de este Dockerfile, instalar la dependendencias necesarias para que funcione el proyecto; las que se muestran aquí son las que funcionan para nuestro &lt;a href="https://github.com/LinkSake/docker-rails"&gt;proyecto de ejemplo&lt;/a&gt;, que incluyen las necesarias para realizar una conexión con Postgres, pero tendrás que descubrir cuales son necesarias para tu proyecto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ruby:3.0.1-alpine&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="nt"&gt;--no-cache&lt;/span&gt; &lt;span class="nt"&gt;--virtual&lt;/span&gt; run-dependencies &lt;span class="se"&gt;\
&lt;/span&gt;build-base &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-client &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-dev &lt;span class="se"&gt;\
&lt;/span&gt;yarn &lt;span class="se"&gt;\
&lt;/span&gt;git &lt;span class="se"&gt;\
&lt;/span&gt;tzdata &lt;span class="se"&gt;\
&lt;/span&gt;libpq &lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/cache/apk/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Puedes esperar a construir la imagen (&lt;code&gt;docker build .&lt;/code&gt;) para revisar el error que imprima Docker, con eso podrás ir averiguando que depenencias hacen falta 😉  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La última linea (&lt;code&gt;rm -rf /var/cache/apk/*&lt;/code&gt;) borra los paquetes de las dependencias que acabamos de instalar, esto ahorrará espacio en la imagen.  &lt;/p&gt;

&lt;p&gt;Lo siguiente que debemos de realizar es crear un directorio dentro del contenedor donde podamos copiar el código de nuestra aplicación para su ejecución, eso lo haremos con el siguente comando dentro de nuestro Dockerfile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ruby:3.0.1-alpine&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="nt"&gt;--no-cache&lt;/span&gt;  &lt;span class="nt"&gt;--virtual&lt;/span&gt; run-dependencies &lt;span class="se"&gt;\
&lt;/span&gt;build-base &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-client &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-dev &lt;span class="se"&gt;\
&lt;/span&gt;yarn &lt;span class="se"&gt;\
&lt;/span&gt;git &lt;span class="se"&gt;\
&lt;/span&gt;tzdata &lt;span class="se"&gt;\
&lt;/span&gt;libpq &lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/cache/apk/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /docker-rails&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;¡Recuerda cambiar el &lt;code&gt;docker-rails&lt;/code&gt; por el nombre de tu proyecto!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Así como le dimos un hogar a tu proyecto dentro del contenedor que crearemos, las gemas del mismo necesitan una carpeta también. Por ello, le informaremos a &lt;a href="https://bundler.io/es/"&gt;bundler&lt;/a&gt; donde colocarlas a través de una variable de ambiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ruby:3.0.1-alpine&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="nt"&gt;--no-cache&lt;/span&gt;  &lt;span class="nt"&gt;--virtual&lt;/span&gt; run-dependencies &lt;span class="se"&gt;\
&lt;/span&gt;build-base &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-client &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-dev &lt;span class="se"&gt;\
&lt;/span&gt;yarn &lt;span class="se"&gt;\
&lt;/span&gt;git &lt;span class="se"&gt;\
&lt;/span&gt;tzdata &lt;span class="se"&gt;\
&lt;/span&gt;libpq &lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/cache/apk/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /docker-rails&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; BUNDLE_PATH /gems&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y aunque ya instalamos las dependencias necesarias para correr Rails dentro del contenedor, tu proyecto necesitará algunas gemas y algunos paquetes de JavaScript para funcionar de manera correcta, vamos a encargarnos de eso de la siguiente manera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ruby:3.0.1-alpine&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="nt"&gt;--no-cache&lt;/span&gt;  &lt;span class="nt"&gt;--virtual&lt;/span&gt; run-dependencies &lt;span class="se"&gt;\
&lt;/span&gt;build-base &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-client &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-dev &lt;span class="se"&gt;\
&lt;/span&gt;yarn &lt;span class="se"&gt;\
&lt;/span&gt;git &lt;span class="se"&gt;\
&lt;/span&gt;tzdata &lt;span class="se"&gt;\
&lt;/span&gt;libpq &lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/cache/apk/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /docker-rails&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; BUNDLE_PATH /gems&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json yarn.lock /docker-rails/&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;yarn &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; Gemfile Gemfile.lock /docker-rails/&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora que ya tenemos todo lo necesario para que funcione tu proyecto, vamos a copiar el código al contenedor dentro de la que carpeta que creamos con el comando &lt;code&gt;WORKDIR&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ruby:3.0.1-alpine&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="nt"&gt;--no-cache&lt;/span&gt;  &lt;span class="nt"&gt;--virtual&lt;/span&gt; run-dependencies &lt;span class="se"&gt;\
&lt;/span&gt;build-base &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-client &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-dev &lt;span class="se"&gt;\
&lt;/span&gt;yarn &lt;span class="se"&gt;\
&lt;/span&gt;git &lt;span class="se"&gt;\
&lt;/span&gt;tzdata &lt;span class="se"&gt;\
&lt;/span&gt;libpq &lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/cache/apk/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /docker-rails&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; BUNDLE_PATH /gems&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json yarn.lock /docker-rails/&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;yarn &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; Gemfile Gemfile.lock /docker-rails/&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /docker-rails/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;¿Por qué copiamos primero los manifiestos (package.json, Gemfile, etc.) y después el resto del proyecto? Esto nos evita tener que reinstalar las dependencias (dado a que se quedan en caché) después de cambiar el código base y reconstruir la imagen; de esta manera solo cuando cambien los manifiestos se volverá a correr sus comandos de instalación.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finalmente le diremos a Docker que comando correr cuando iniciemos nuestro contenedor (&lt;code&gt;rails&lt;/code&gt;), así como los argumentos de este (&lt;code&gt;s -b 0.0.0.0&lt;/code&gt;) y que puerto exponer para que nosotros podamos accesar a nuestra aplicación.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ruby:3.0.1-alpine&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--update&lt;/span&gt; &lt;span class="nt"&gt;--no-cache&lt;/span&gt;  &lt;span class="nt"&gt;--virtual&lt;/span&gt; run-dependencies &lt;span class="se"&gt;\
&lt;/span&gt;build-base &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-client &lt;span class="se"&gt;\
&lt;/span&gt;postgresql-dev &lt;span class="se"&gt;\
&lt;/span&gt;yarn &lt;span class="se"&gt;\
&lt;/span&gt;git &lt;span class="se"&gt;\
&lt;/span&gt;tzdata &lt;span class="se"&gt;\
&lt;/span&gt;libpq &lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/cache/apk/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /docker-rails&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; BUNDLE_PATH /gems&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json yarn.lock /docker-rails/&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;yarn &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; Gemfile Gemfile.lock /docker-rails/&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /docker-rails/&lt;/span&gt;

&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["bin/rails"]&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["s", "-b", "0.0.0.0"]&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;El puerto default sobre el que Rails corre es el 3000, pero si has designado otro puerto dentro de tu aplicación asegurarte de exponerlo de manera correcta.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y con esto tenemos listo nuestro Dockerfile, aunque estamos lejos de tener nuestra aplicación lista. Si construyeramos nuestra imagen con &lt;code&gt;docker build .&lt;/code&gt; y trataramos de correrla con &lt;code&gt;docker start docker-rails&lt;/code&gt; nos encontraríamos con un error, ya que Rails no encuentra las bases de datos que necesita para iniciar de manera correcta; pero pronto nos encargaremos de ello.&lt;/p&gt;

&lt;h2&gt;
  
  
  Luego el docker-compose.yml
&lt;/h2&gt;

&lt;p&gt;Para poder coordinar todos los servicios que necesitamos para el correcto funcionamiento de nuestra aplicación (en este caso 2 bases de datos: Posgres y Redis) usaremos &lt;a href="https://docs.docker.com/compose/"&gt;docker-compose&lt;/a&gt;, esta útilidad de Docker nos ayudará a crear multimples contenedores de diferentes imagenes, &lt;a href="https://docs.docker.com/compose/networking/"&gt;conectarlos&lt;/a&gt;, darles &lt;a href="https://docs.docker.com/compose/environment-variables/"&gt;variables de ambiente&lt;/a&gt; e incluso &lt;a href="https://docs.docker.com/storage/volumes/"&gt;volumenes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Empezaremos creando un archivo llamado &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y en su primera linea especificaremos que &lt;a href="https://docs.docker.com/compose/compose-file/#compose-and-docker-compatibility-matrix"&gt;versión&lt;/a&gt; de la herramienta queremos usar, en este caso usaremos la más reciente a la redacción de este articulo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después indicaremos los servicios que queremos que corra docker-compose, esto lo haremos dentro de la etiqueta &lt;code&gt;services&lt;/code&gt;. A cada servicio le daremos un nombre el cual será importante cuando estemos configurando nuestra imagen así que asegurate de nombrarlo de una manera que haga sentido para ti. Vamos como primer ejemplo servicio de Posgres, al cual llamaremos &lt;em&gt;db&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-db&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=docker-rails-dev&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dbdata:/var/lib/postgresql/data'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Los archivos YAML son sensibles a la identación, así que asegurate de tener todo en orden y andidado de forma correcta.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La etiqueta &lt;code&gt;db&lt;/code&gt; es el nombre que le dimos al servicio y dentro de la cual especificaremos toda la configuración del mismo.&lt;/p&gt;

&lt;p&gt;Lo primero con lo que nos encontramos es &lt;code&gt;image&lt;/code&gt; que tal como su nombre lo indica es el nombre de la imagen que queremos usar para ese servicio, en este caso es la imagen oficial de Posgres en su última versión (puedes especificar una versión remplazando el &lt;code&gt;latest&lt;/code&gt; por alguna otra versión válida).&lt;/p&gt;

&lt;p&gt;Después nos encontramos con &lt;code&gt;container_name&lt;/code&gt;, que también es autodescriptivo y el cual vendra útil a la hora de checar nuestros contendores con &lt;code&gt;docker ps&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;enviroment&lt;/code&gt; se refiere a las variables de ambiente, y si nos referimos a la documentación de la imagen de &lt;a href="https://hub.docker.com/_/postgres"&gt;Docker de Posgres&lt;/a&gt; podemos ver que la única variable obligatoria es &lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt; pero nosotros también definiremos &lt;code&gt;POSTGRES_DB&lt;/code&gt; para darle un nombre personalizado a la base de datos que crea la imagen por defecto.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ ¡Asegurate de elegir una contraseña segura para la base de datos!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;ports&lt;/code&gt; son los puertos que necesitaremos pasar de dentro del contenedor a nuestra maquina, los indicados en el archivo son los que por defecto usa Posgres.&lt;/p&gt;

&lt;p&gt;Finalmente los &lt;code&gt;volumes&lt;/code&gt; son la infomación persistente que necesitaremos para no correr las migraciones cada vez que encendamos el contenedor, esto porque Docker borra todos los datos una vez que damos de baja la información, si quieres aprender más sobre este tema te recomiendo &lt;a href="https://docs.docker.com/storage/volumes/"&gt;esta&lt;/a&gt; sección de la documentación.&lt;/p&gt;

&lt;p&gt;Ahora, el siguiente servicio es el de Redis pero no ahondaremos mucho en el pues cuenta solo con un par de etiquetas las cuales ya hemos revisado, para más información puedes visitar &lt;a href="https://hub.docker.com/_/redis"&gt;la imagen oficial.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-db&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=docker-rails-dev&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dbdata:/var/lib/postgresql/data'&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-redis&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;6379:6379&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nuestro último servicio lo llamaremos &lt;code&gt;web&lt;/code&gt; y será la imagen que hemos construido con nuestro &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-db&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=docker-rails-dev&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dbdata:/var/lib/postgresql/data'&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-redis&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;6379:6379&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-web&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;3000:3000&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_HOST=db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;REDIS_URL=redis://redis:6379&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La primer etiqueta nueva con la que nos topamos es &lt;code&gt;build&lt;/code&gt;, la cual indica el directorio donde se encuentra nuestro Dockerfile; dado a que nuestro Dockerfile está en la raíz solamente pondremos &lt;code&gt;.&lt;/code&gt;; si tu Dockerfile no está en la raíz o tiene otro nombre es recomendable que leas &lt;a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#build"&gt;esta&lt;/a&gt; sección de la documentación para asegurarte que Compose lo encuentre.&lt;/p&gt;

&lt;p&gt;La etiqueta &lt;code&gt;image&lt;/code&gt; en este caso servirá para nombrar la imagen que construirá Compose, ya que al estar presente &lt;code&gt;build&lt;/code&gt; no irá al repositorio a buscar una imagen preconstruida.&lt;/p&gt;

&lt;p&gt;Por último, la etiqueta &lt;code&gt;depends_on&lt;/code&gt; informará a Compose que no se debe de tratar de iniciar el contenedor hasta que estén creados los servicios &lt;code&gt;db&lt;/code&gt; y &lt;code&gt;redis&lt;/code&gt;, así como los conectará de manera interna para que nosotros podamos accesar a ellos mediante un URL (como se puede observar en la variable de ambiente de Redis) o por sus respectivas credenciales (como es el caso de Postgres), si quieres aprender como Docker maneja eso puedes leer sobre &lt;a href="https://docs.docker.com/compose/networking/"&gt;Docker Network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ahora que ya terminamos con los servicios, lo unico que debemos es listar los volumenes que usaremos y a los cuales &lt;a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes"&gt;nombramos&lt;/a&gt; de la siguiente manera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-db&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=docker-rails-dev&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dbdata:/var/lib/postgresql/data'&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-redis&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;6379:6379&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-rails-web&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;3000:3000&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_HOST=db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;REDIS_URL=redis://redis:6379&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dbdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Y listo! Nuestro &lt;code&gt;docker-compose.yml&lt;/code&gt; está listo, ahora solo falta un paso para empezar a crear nuestra aplicación contenida en Docker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ojos que no ven, .dockerignore que no siente
&lt;/h2&gt;

&lt;p&gt;Muchas veces no queremos que ciertos archivos estén en nuestra imagen de Docker pues estos no son necesarios para su contrucción (o se generan en la misma) y solo terminan haciendo el proyecto más grande de lo que necesita ser, como puede ser el caso de los &lt;code&gt;node_modules&lt;/code&gt; y la carpeta &lt;code&gt;.git&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Para ahorrarnos este espacio crearemos un archivo llamado &lt;code&gt;.dockerignore&lt;/code&gt; en la raíz de nuestro proyecto y añadiremos estas dos carpetas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;".git &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt; node_modules"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .dockerignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para más información sobre lo que puede contenener un archivo &lt;code&gt;.dockerignore&lt;/code&gt; puedes consultar la &lt;a href="https://docs.docker.com/engine/reference/builder/#dockerignore-file"&gt;documentación oficial de Docker&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Unas bases de datos para llevar
&lt;/h2&gt;

&lt;p&gt;Antes de correr el proyecto será necesario crear la base de datos que Rails espera, y crearla es tan sencillo que se puede hacer en un solo comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose run web db:create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando le dice a Docker que use la imagen (que construirá) para correr un comando, en este caso &lt;code&gt;db:create&lt;/code&gt;. Docker, con lo especificado en el &lt;code&gt;docker-compose.yml&lt;/code&gt; sabe que como &lt;em&gt;web&lt;/em&gt; depende de &lt;em&gt;db&lt;/em&gt; tendrá que correr primero la instancia de Postgres, por lo que la base de datos se creará en este contenedor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Por qué solamente &lt;code&gt;db:create&lt;/code&gt; y no &lt;code&gt;rails db:create&lt;/code&gt; o &lt;code&gt;rake db:create&lt;/code&gt;? En nuestro &lt;code&gt;Dockerfile&lt;/code&gt; dimos como punto de entrada el comando &lt;code&gt;rails&lt;/code&gt;, por ello solo es necesario pasar los parametros. Si quisieramos efectuar otro comando dentro del contenedor esto tendría que ser a través de &lt;a href="https://docs.docker.com/engine/reference/commandline/exec/"&gt;docker exec&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Nuestra aplicación en un contenedor
&lt;/h2&gt;

&lt;p&gt;Con la base de datos creada, solo queda un comando que corra los contenedores en &lt;a href="https://docs.docker.com/compose/reference/up/"&gt;modo separado&lt;/a&gt; y podremos ver el fruto de nuestro trabajo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Y listo! Ya podrás accesar a traves de tu navegador a &lt;a href="http://localhost:3000/"&gt;localhost:3000&lt;/a&gt; y ver la página de bienvenida de Rails.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/AGsGb-CDJpASDUShYFHvLZTWX2zf7vofNjwma_kUajc/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvZmlz/Y2F0MWx4cjkxcW8x/am5iYWoucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/AGsGb-CDJpASDUShYFHvLZTWX2zf7vofNjwma_kUajc/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvZmlz/Y2F0MWx4cjkxcW8x/am5iYWoucG5n" alt="Welcome to Rails!" width="880" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Puede que todo este proceso sea algo intimidante al principio, en especial si no sabes Docker, pero su resultado es un ambiente de desarrollo mucho más sencillo para todos los involucrados en el proyecto, pues ahora solo con tener Docker instalado podrán iniciar a programar; sin mencionar los beneficios que esta tecnología puede traer a tu ambiente de producción cuando se combina con Kubernetes o Docker Swarm.&lt;/p&gt;

&lt;p&gt;Espero que te haya sido útil, cualquier cosa puedes &lt;a href="https://luisangel.me/about#contacto"&gt;contactarme&lt;/a&gt; y responderé lo más pronto posible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bibliografía
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/samples/rails/"&gt;Docker Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gorails.com/episodes/docker-basics-for-gorails"&gt;Go Rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorials</category>
      <category>devops</category>
      <category>rails</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
