Construya un contenedor con un Containerfile

Creando el archivo contenedor

Si aún no existe un contenedor para su aplicación, se puede crear uno para su dispositivo.

Es habitual crear imágenes desde un directorio de trabajo que contiene el archivo contenedor y los archivos de soporte. Este puede ser un directorio con control de versiones para facilitar su uso compartido.

$ mkdir container-demo && cd container-demo

Existen numerosos ejemplos de creación de contenedores mediante un Containerfile. Un Containerfile simple contendrá algunos de los siguientes elementos:

  • La línea FROM indica la base, o inicia , contenedor, tal como una última imagen Fedora. Esta imagen será tirada si no está ya disponible localmente. Especifique detalles para el cual la imagen la misma que haría con una instrucción podman pull.

  • Crea capas con cada comando RUN. Intente minimizar el número de capas con múltiples comandos en la misma línea utilizando && entre comandos. Además incluye cualquiera de las instrucciones de vaciado tales como dnf clean all para reducir el tamaño de la imagen final.

  • Copia el contenido desde el directorio de trabajo en el contenedor.

  • Especifique cualquiera de los puestos para escucha con EXPOSE

  • Inicia su aplicación

    • CMD puede ser sobrescrito con podman ejecutando instrucción

    • ENTRYPOINT a menudo instrucción base y opciones por defecto. Puede ser acoplado con CMD para opciones adicionales.

Ejemplo: Aplicación web

Crea un directorio de trabajo con algún contenido para un servidor web:

$ mkdir demo-httpd && cd demo-httpd && echo 'muestra contenedor' > index.html

Inicia el Containerfile con una instrucción FROM para indicar la imagen base:

$ echo 'FROM fedora:latest' >> Containerfile

Añade un comando RUN para actualizar la imagen y añadir cualquier aplicación y utilidades:

$ echo 'RUN dnf -y update && dnf -y install httpd git  && dnf clean all' >> Containerfile

El ejemplo anterior instala Git. Si su contenido web está alojado en un sistema de control de versiones, puede agregar una instrucción RUN para clonar esos datos en el contenedor. Si su contenido está disponible en el directorio de trabajo de compilación, puede usar el comando COPY para agregarlo al contenedor.

Copie el archivo index.html de muestra en el contenedor:

$ echo 'COPY index.html /var/www/html/index.html' >> Containerfile

La línea EXPOSE especifica que el contenedor enumerados en puertos de red especificada. Es utilizado por la opción --publish-all en la instrucción podman run.

Documento que portes están disponibles para publicar:

$ echo 'EXPOSE 80' >> Containerfile

Especifique la instrucción a ejecutar cuando el contenedor inicie:

$ echo 'ENTRYPOINT /usr/sbin/httpd -DFOREGROUND' >> Containerfile
Vinculación de puerto no está aun soportada por contenedores sin root. Si su contenedor necesita estar disponible en la red, construirlo en el espacio de nombre root. Vinculación de puerto para contenedores sin root están disponibles en pruebas en upstream para podman 1.1.0 con slip4netsns v0.3.0.

Construye la imagen con una etiqueta descriptiva:

$ sudo podman build --tag fedora:myhttpd -f ./Containerfile

La imagen aparecerá en el registro local:

$ sudo podman images
REPOSITORIO                 ETIQ            ID IMAGEN          CREADO         TAMAÑO
localhost/fedora           myhttpd   223534b48a9c   3 minutes ago   474MB
docker.io/library/fedora   latest    8b38e3af7237   4 weeks ago     315MB

Para crear el puerto de la aplicación disponible para el dispositivo hospedaje utiliza la opción --publish o -p con números de`hostPort:containerPort`. Un IP puede además ser especificado tan bien como intervalos de puertos. Consulte la página man para más opciones.

Ejecute el contenedor y publique el puerto:

$ sudo podman run -p 8080:80 --name myhttpd --rm fedora:myhttpd

Ver la información del puerto:

$ sudo podman port myhttpd
80/tcp -> 0.0.0.0:8080

Acceda a la página web desde el dispositivo hospedador:

$ curl localhost:8080

Accede la página web desde un lugar remoto utilizando la dirección IP del dispositivo hospedaje y el número de puerto publicado.

Abra puertos de cortafuegos, servicios, o fuentes como necesita. La imagen Defora IoT por defecto para permitir cualquier fuente en la misma red a través de la opción de interfaces:

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client mdns ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Añade un puerto con:

$ sudo firewall-cmd --add-port 8080/tcp

Más información en la instrucción firewall-cmd puede encontrarse en firewalld.org.

Ejemplo: Interacción con interfaz GPIO

Para interactuar con el interfaz GPIO, capa del paquete libgpiod-utils en la imagen existente o utiliza con un contenedor.

Para cubrir el paquete:

$ sudo rpm-ostree install libgpiod-utils python3-libgpiod
$ sudo gpiodetect

Para crear un contenedor para una aplicación que funcione con el interfaz GPIO en el espacio de nombre raíz.

Inicia el Containerfile con una instrucción FROM para indicar la imagen base:

$ echo 'FROM fedora:latest' >> Containerfile

Añade un comando RUN para actualizar la imagen y añadir cualquier aplicación y utilidades:

$ echo 'RUN dnf -y update && dnf -y install git libgpiod-utils python3-libgpiod && dnf clean all' >> Containerfile

La última imagen de fedora incluye bash por lo que pude avanzar y compilar el contenedor sin ninguna de las aplicaciones especificadas para iniciar o puertos para exponer. La instrucción puede ser especificada cuando ejecuta el contenedor.

Construye la imagen con una etiqueta descriptiva:

$ sudo podman build --tag fedora:gpio -f ./Containerfile

La imagen aparecerá en el registro del localhost para el espacio de nombre raíz:

$ sudo podman images
REPOSITORY                 TAG      IMAGE ID       CREATED         SIZE
localhost/fedora           gpio     655abf78e6b9   4 minutes ago   542MB
docker.io/library/fedora   latest   8b38e3af7237   4 weeks ago     315MB

Para acceder a la unidad de GPIP host (anfitrión) desde el contenedor, utilice la opción --device cuando comience el contenedor:

$ sudo podman run -it --name demo-gpio --device=/dev/gpiochip0 localhost/fedora:gpio /bin/bash

Verifique que puede ver el dispositivo GPIO:

[root@167f31750fdb /]# gpiodetect
gpiochip0 [pinctrl-bcm2835] (54 lines)

Ahora que el dispositivo está disponible desde el contenedor, continúe a utilizar las herramientas instaladas o añada aplicaciones.

Examples for using gpioset can be found in a 2018 Fedora Magazine article: How to turn on an LED with Fedora IoT

Automatizar pasos adicionales por modificar el Containerfile y construir un contenedor nuevo.

La imagen no tiene que estar compilado desde un contenedor Fedora. Este Containfile utiliza una imagen raspbian y clonea el proyecto lightshowpi:

$ cat Containerfile
FROM raspbian/stretch:latest
RUN apt-get -y update && apt-get -y install git-core && apt-get -y clean
WORKDIR /
RUN git clone https://togiles@bitbucket.org/togiles/lightshowpi.git && \
  cd lightshowpi && git fetch && git checkout stable

La documentación de Docker incluye Mejoras prácticas de Containerfile.

Reutilizar y Compartir Contenedores

Una vez que se crea la imagen del contenedor puede ser desplegada en múltiples dispositivos subiéndolo a un registro.

Muchos de los registros requieren una convención de nombre del 'useraccount/description:tag' y el predeterminado para muchos comandos pull están para parecer un contenedor con una etiqueta de 'último': Una imagen puede tener múltiples etiquetar y estas etiquetas son utilizadas para ayudar a identificar compatibilidad de arquitectura y control de versión.

Para renombrar o añadir una etiqueta a una imagen local:

$ podman tag fedora:myhttpd testuser/fedora-myhttpd:latest
$ podman tag fedora:myhttpd quay.io/testuser/fedora-myhttpd:latest

Ambos nombres aparecerán en el listado de imágenes pero el ID de imagen será el mismo por cada:

$ podman images
REPOSITORY                               TAG       IMAGE ID       CREATED        SIZE
localhost/fedora                         myhttpd   d52cbe4136e8   24 hours ago   428 MB
localhost/testuser/fedora-myhttpd        latest    d52cbe4136e8   24 hours ago   428 MB
quay.io/testuser/fedora-myhttpd          latest    d52cbe4136e8   24 hours ago   428 MB
docker.io/library/fedora                 latest    26ffec5b4a8a   4 weeks ago    283 MB

Entonces puede empujar una imagen a un registro con podman push imageID destination.

Para extraer la imagen a un directorio local en un formato docker:

$ podman push quay.io/testuser/fedora-myhttpd dir:/tmp/fedora-myhttpd

Para más opciones de exportación, consulte la página man podman-push.