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.
Want to help? Learn how to contribute to Fedora Docs ›