Bienvenidos a una nueva sección del newsletter de La Naturaleza del Software. En este espacio compartiré artículos más técnicos, pero orientados a todos aquellos que se sienten “oxidados” con respecto al desarrollo de software.
Verán, hay cada vez más necesidad de desarrolladores de software, y eso hace que las oportunidades para crecer y avanzar en una carrera en tecnología sean muy atractivas y rentables. Por otro lado, hay muchos profesionales que se están reconvirtiendo a este campo, o que simplemente lo abandonaron hace años para dedicarse a otros campos o avanzar en otras áreas, más comerciales o de gestión. Así que si aspiras a reconvertirte, o estás tomando cursos de programación y desempolvando antiguos conocimientos, este boletín puede serte útil. Si no es tu caso, pero conoces a alguien que calza con lo que describí, te pido que le compartas esta publicación, puede que le resulte útil a tu amigo.
Por último, siempre hay cosas que se pueden aprender, yo mismo en estos últimos años he aprendido muchas nuevas tecnologías. Así que puede que igual termines adquiriendo algo de conocimiento nuevo leyendo estos artículos.
Agrega Docker a tu proyecto
Cuando empecé a usar Docker en mis proyectos no sabía cómo armar los archivos Dockerfile, y eso me llevó a copiar desde sitios como Stack Overflow, o de otros proyectos las plantillas para mis proyectos. Pero en realidad Docker tiene ya la habilidad de construir una configuración adecuada para tu proyecto.
Basta con ejecutar este comando en la carpeta de tu proyecto:
docker init
Veamos un ejemplo
Primero vamos a crear nuestro proyecto, en nuestro caso una simple aplicación en Python con Flask:
$ cat > requirements.txt
flask == 2.3.3
^d
$ cat > hello.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
app.run(host='0.0.0.0', port=8000)
^d
$ ls
hello.py requirements.txt
Luego ejecutamos docker init
Esta imagen muestra cómo interactuamos con Docker para crear el contenedor para nuestro proyecto:
Y para poder ejecutar nuestra aplicación simplemente hacemos
docker compose up —build
Y puedes navegar a la dirección localhost:8000 con tu navegador y verás tu esto
Ahora quiero que reflexiones sobre lo siguiente, al hacer todo esto no has necesitado instalar Flask en tu máquina. Es más, no necesitas tener instalado Python, basta con tener Docker y tienes disponible cualquier versión de Python en tu máquina. Has creado un entorno de trabajo en tu contenedor, que te permite trabajar sin tener que instalar software adicional que podría “ensuciar” tu ambiente.
Pero lo mejor, es que después entregas el archivo Dockerfile junto con tu proyecto y quien lo recibe tiene todo para utilizar tu proyecto.
Esta es la forma moderna de distribuir aplicaciones y estoy seguro que te servirá mucho.
Por último, revisemos el archivo Dockerfile generado:
# syntax=docker/dockerfile:1
# Comments are provided throughout this file to help you get started.
# If you need more help, visit the Dockerfile reference guide at
# https://docs.docker.com/engine/reference/builder/
ARG PYTHON_VERSION=3.11.5
FROM python:${PYTHON_VERSION}-slim as base
# Prevents Python from writing pyc files.
ENV PYTHONDONTWRITEBYTECODE=1
# Keeps Python from buffering stdout and stderr to avoid situations where
# the application crashes without emitting any logs due to buffering.
ENV PYTHONUNBUFFERED=1
WORKDIR /app
# Create a non-privileged user that the app will run under.
# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user
ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser
# Download dependencies as a separate step to take advantage of Docker's caching.
# Leverage a cache mount to /root/.cache/pip to speed up subsequent builds.
# Leverage a bind mount to requirements.txt to avoid having to copy them into
# into this layer.
RUN --mount=type=cache,target=/root/.cache/pip \
--mount=type=bind,source=requirements.txt,target=requirements.txt \
python -m pip install -r requirements.txt
# Switch to the non-privileged user to run the application.
USER appuser
# Copy the source code into the container.
COPY . .
# Expose the port that the application listens on.
EXPOSE 8000
# Run the application.
CMD python hello.py
Si eres más experto en el uso de Docker, notarás que este archivo es muy completo e incluso implementa buenas prácticas de seguridad, como por ejemplo, creando un usuario que no es root
. Así que aunque seas un profesional con experiencia, docker init
es una herramienta muy útil, que te facilita la vida y te ayuda a dar más seguridad a tus aplicaciones.
Y eso ha sido el primer artículo de “El Programador Oxidado”, espero que te haya gustado, y si lo encuentras útil compártelo con aquellos que creas que les pueda servir. Si tienes dudas sobre programación, DevOps y desarrollo de software en general, déjamelas en un comentario y puedo escribir un artículo para responderte.