Construya un contenedor con un Containerfile

Creando el archivo contenedor

Si para su aplicación aún no existe un contenedor, uno puede ser compilado 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 instrucción RUN. Intente minimizar el número de capas con múltiples instrucciones en la misma línea utilizando && entre instrucciones. 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 interno al 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 del contenedor' > index.html

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

$ echo 'FROM fedora:latest' >> Containerfile

Añade una instrucción 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 la instrucción COPY para agregarlo al contenedor.

Copie el archivo index.html de muestra interna al 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           mihttpd   223534b48a9c   hace 3 min.       474MB
docker.io/library/fedora   últ.    8b38e3af7237     hace 4 sems.     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`. Una 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 huesped:

$ curl localhost:8080

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

Abra puertos de cortafuegos, servicios, u orígenes como necesita. La imagen Fedora IoT por defecto para permitir cualquier origen 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 una instrucción 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' >> Archivocontenedor

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
REPOSITORIO                ETI      ID IMAGE       CREADO                 TAMAÑO
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 líneas)

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

Ejemplos para utilizar `gpioset`puede encontrase en un artículo Fedora Magazine 2018: Como encender un LED con 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 Containerfile 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:mihttpd testusuario/fedora-mihttpd:latest
$ podman tag fedora:mihttpd quay.io/testusuario/fedora-mihttpd:latest

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

$ podman images
REPOSITORIO                               ETIQ       ID IMAGEN      CREADO        TAM
localhost/fedora                         myhttpd   d52cbe4136e8   hace 24 h   428 MB
localhost/testuser/fedora-myhttpd        últ.    d52cbe4136e8   hace 24 h   428 MB
quay.io/testuser/fedora-myhttpd          últ.    d52cbe4136e8   hace 24 h   428 MB
docker.io/library/fedora                 últ.    26ffec5b4a8a   hace 4 sem    283 MB

Entonces puede presionar 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.