os01 - gpulido-redhat/workshopclaro GitHub Wiki

Red Hat Openshift Container Platform - Contenedores

Meta:
- Entendimiento de la tecnología de contenedores.

Objetivos:
- Conceptos de contenedores y podman (Teórico)

Secciones:
- Introducción a tecnología de contenedores. (Teórico)
- Introducción a la gestión de contenedores con podman. (Teórico)
- Administrando contenedores con podman. (Demostración)

Laboratorios:

Introducción a Contenedores. (Teórico)

¿Qué son los contenedores?


Un contenedor​ es un recipiente de carga para el transporte marítimo o fluvial, transporte terrestre y transporte multimodal

Los contenedores en TI, son tecnologías que le permiten empaquetar y aislar las aplicaciones junto con todo el entorno de tiempo de ejecución, es decir, con todos los archivos que requieren para ejecutarse

  • Namespace: Los espacios de nombres son una característica del kernel de Linux que divide los recursos del kernel de modo que un conjunto de procesos ve un conjunto de recursos mientras que otro conjunto de procesos ve un conjunto diferente de recursos.
  • Seccomp: Es una facilidad del kernel Linux que permite limitar las llamadas al sistema que un proceso puede realizar.​
  • Control Groups (cgroups): CGroups es una característica del kernel de Linux que limita, explica y aísla el uso de recursos de una colección de procesos.
  • Security-Enhanced Linux (SELinux): Es un módulo de seguridad para el kernel Linux, implementado utilizando el framework del núcleo Linux Security Modules, que proporciona el mecanismo para implementar una políticas de control de acceso de tipo Control de acceso obligatorio (MAC) y control de acceso basado en roles.

Algunos repositorios donde podemos encontrar imagenes de contenedores son:

Maquinas Virtuales vs Contenedores

Beneficios:

  • Retorno de la inversión y ahorro de costes
  • Estandarización y productividad
  • Eficiencia de imágenes de contenedor
  • Compatibilidad y mantenimiento más fácil
  • Simplicidad y configuraciones más rápidas
  • Despliegue y escalabilidad rápidos
  • Pruebas continuas
  • Plataformas multi-cloud
  • Aislamiento
  • Seguridad

Introducción a la gestión de contenedores con podman


Podman es una herramienta de código abierto, nativa de Linux sin demonios, diseñada para facilitar la búsqueda, ejecución, compilación, uso compartido e implementación de aplicaciones utilizando contenedores e imágenes de contenedor de la Iniciativa de Contenedores Abiertos (OCI).

Podman proporciona una interfaz de línea de comandos (CLI) familiar para cualquiera que haya utilizado Docker Container Engine. La mayoría de los usuarios pueden simplemente alias Docker a Podman (alias docker = podman) sin ningún problema.

Al igual que otros motores de contenedores comunes (Docker, CRI-O, containerd), Podman se basa en un Container Runtime compatible con OCI (runc, crun, runv, etc.) para interactuar con el sistema operativo y crear los contenedores en ejecución. Esto hace que los contenedores en ejecución creados por Podman sean casi indistinguibles de los creados por cualquier otro motor de contenedores común.


Administración de contenedores con Podman. (Demostración)

Gestión de contenedores con Podman

Pull

[root@podman ~]# podman pull registry.access.redhat.com/ubi8:latest
Trying to pull registry.access.redhat.com/ubi8:latest...
Getting image source signatures
Copying blob 63f9f4c31162 done
Copying blob ce3c6836540f done
Copying config cc06568478 done
Writing manifest to image destination
Storing signatures
cc0656847854310306093b3dc1a7d9e7fc06399da46853e0c921cd5ec1906bfd

IMAGES

[root@podman ~]# podman images
REPOSITORY                       TAG         IMAGE ID      CREATED      SIZE
registry.access.redhat.com/ubi8  latest      cc0656847854  4 weeks ago  235 MB

RUN

[root@podman ~]# podman run --name rhel8 -it -d registry.access.redhat.com/ubi8:latest /bin/bash
527e97212a0fb8fbcdb4b0b622ea1b84f17949e88be3682c143a02e501db4f9a

PS

[root@podman ~]# podman ps
CONTAINER ID  IMAGE                                   COMMAND    CREATED         STATUS             PORTS  NAMES
527e97212a0f  registry.access.redhat.com/ubi8:latest  /bin/bash  20 seconds ago  Up 20 seconds ago         rhel8

[root@podman ~]# ps -aux | grep 527e97212a0f

STOP

[root@podman ~]# podman stop rhel8
527e97212a0fb8fbcdb4b0b622ea1b84f17949e88be3682c143a02e501db4f9a

START

[root@podman ~]# podman start rhel8
rhel8

RESTART

[root@podman ~]# podman restart rhel8
527e97212a0fb8fbcdb4b0b622ea1b84f17949e88be3682c143a02e501db4f9a

PS -A

[root@podman ~]# podman stop rhel8
527e97212a0fb8fbcdb4b0b622ea1b84f17949e88be3682c143a02e501db4f9a

[root@podman ~]# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

[root@podman ~]# podman ps -a
CONTAINER ID  IMAGE                                   COMMAND               CREATED             STATUS                    PORTS                                                                      NAMES
527e97212a0f  registry.access.redhat.com/ubi8:latest  /bin/bash             About a minute ago  Exited (0) 4 seconds ago                       

[root@podman ~]# podman start rhel8
rhel8                                                      rhel8

[root@podman ~]# podman ps
CONTAINER ID  IMAGE                                   COMMAND    CREATED        STATUS             PORTS  NAMES
527e97212a0f  registry.access.redhat.com/ubi8:latest  /bin/bash  2 minutes ago  Up 10 seconds ago         rhel8

EXEC

[root@podman ~]# podman exec -it rhel8 /bin/bash

[root@527e97212a0f /]# exit
exit

[root@podman ~]# podman exec -it -l /bin/bash

[root@527e97212a0f /]# exit
exit

Para depurar utilizar STOP y RM

[root@podman ~]# podman stop rhel8
527e97212a0fb8fbcdb4b0b622ea1b84f17949e88be3682c143a02e501db4f9a

[root@podman ~]# podman rm rhel8
527e97212a0fb8fbcdb4b0b622ea1b84f17949e88be3682c143a02e501db4f9a

[root@podman ~]# podman ps

[root@podman ~]# podman ps -a

RMI

[root@podman ~]# podman rmi registry.access.redhat.com/ubi8:latest
Untagged: registry.access.redhat.com/ubi8:latest
Deleted: cc0656847854310306093b3dc1a7d9e7fc06399da46853e0c921cd5ec1906bfd

[root@podman ~]# podman images

Si la imagen no se ha puleado inicialmente y se ejecutar un run este proceso la descarga

[root@podman ~]# podman run --name rhel8 -it -d registry.access.redhat.com/ubi8:latest
Trying to pull registry.access.redhat.com/ubi8:latest...
Getting image source signatures
Copying blob 63f9f4c31162 done
Copying blob ce3c6836540f done
Copying config cc06568478 done
Writing manifest to image destination
Storing signatures
593fdfffa935ff7b014cec1e724b104900b5942f0fffb4559ba59a9817955bd5

[root@podman ~]# podman images
REPOSITORY                        TAG      IMAGE ID       CREATED         SIZE
registry.access.redhat.com/ubi8   latest   cc0656847854   2 weeks ago     235 MB

Crear un objeto de tipo usuario, asignarle una contraseña y probar la efimeralidad

[root@podman ~]# podman exec -it -l /bin/bash

[root@527e97212a0f /]# useradd user9
[root@527e97212a0f /]# passwd user9
Changing password for user user9.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

[root@527e97212a0f /]# id user9
uid=1000(user9) gid=1000(user9) groups=1000(user9)

[root@527e97212a0f /]# cat /etc/passwd | grep user9
user9:x:1000:1000::/home/user9:/bin/bash

[root@527e97212a0f /]# cat /etc/shadow | grep user9
user9:$6$ZpD1cIjGEdfLDe5j$7W4PEpIP8ljIG7pbrhakMys4e8iDL1Hj7N/fQvyaLI1W1.cNJcwPKKDql1sgSuN4QqEbKaW4G.CBCoYwXuRAd0:18949:0:99999:7:::

[root@527e97212a0f /]# exit
exit

[root@podman ~]# podman stop rhel8 ; podman rm rhel8
593fdfffa935ff7b014cec1e724b104900b5942f0fffb4559ba59a9817955bd5
593fdfffa935ff7b014cec1e724b104900b5942f0fffb4559ba59a9817955bd5

[root@podman ~]# podman run --name rhel8 -it -d registry.access.redhat.com/ubi8:latest
50861d1d07cb6faa7ec68a6f274469680dfc50d7677ca3eb73992ae4580fdbd4

[root@podman ~]# podman exec -l -it /bin/bash

[root@50861d1d07cb /]# id user9
id: ‘user9’: no such user

[root@50861d1d07cb /]# exit
exit

[root@podman ~]# podman stop rhel8 ; podman rm rhel8
50861d1d07cb6faa7ec68a6f274469680dfc50d7677ca3eb73992ae4580fdbd4
50861d1d07cb6faa7ec68a6f274469680dfc50d7677ca3eb73992ae4580fdbd4

COMMIT

[root@podman ~]# podman run --name rhel8 -it -d registry.access.redhat.com/ubi8:latest
ca0c15e06900db412c703ec0af252c551b4bb590df631c3b7d3e7434cd15e631

[root@podman ~]# podman exec -l -it /bin/bash

[root@ca0c15e06900 /]# useradd user9

[root@ca0c15e06900 /]# echo "redhat" | passwd --stdin user9
Changing password for user user9.
passwd: all authentication tokens updated successfully.

[root@ca0c15e06900 /]# su - user9

[user9@ca0c15e06900 ~]$ id
uid=1000(user9) gid=1000(user9) groups=1000(user9)

[user9@ca0c15e06900 ~]$ exit
logout

[root@ca0c15e06900 /]# exit
exit

[root@podman ~]# podman commit -q -a "Jaime Zamudio" rhel8 custom-rhel8

[root@podman ~]# podman images
REPOSITORY                        TAG      IMAGE ID       CREATED              SIZE
localhost/custom-rhel8            latest   0759772b92eb   About a minute ago   235 MB
registry.access.redhat.com/ubi8   latest   cc0656847854   2 weeks ago          235 MB

[root@podman ~]# podman stop rhel8 ; podman rm rhel8
ca0c15e06900db412c703ec0af252c551b4bb590df631c3b7d3e7434cd15e631
ca0c15e06900db412c703ec0af252c551b4bb590df631c3b7d3e7434cd15e631

[root@podman ~]# podman run --name rhel8 -it -d localhost/custom-rhel8
ca3d137601cf6408394bbdc8c2f6350e615b1bb7c2a92920acdaafcc1d21c094

[root@podman ~]# podman exec -it -l /bin/bash

[root@ca3d137601cf /]# id user9
uid=1000(user9) gid=1000(user9) groups=1000(user9)

[root@ca3d137601cf /]# grep ^user9 /etc/passwd
user9:x:1000:1000::/home/user9:/bin/bash

[root@ca3d137601cf /]# grep ^user9 /etc/shadow
user9:$6$V2Ht3.lE126nwzZx$DFPS/LGrxakLGye56RyhBrH05GTiCLItmfv3ZOLtgj1sVhe9imf/pQe.pHyMsPqUDZ4KQPS24t4Eazp8/Wq0s/:18949:0:99999:7:::

[root@ca0c15e06900 /]# exit
exit

TAG

[root@podman ~]# podman ps

[root@podman ~]# podman tag localhost/custom-rhel8:latest localhost/custom-rhel8:8.5

[root@podman ~]# podman tag localhost/custom-rhel8:latest localhost/custom-rhel8:5

[root@podman ~]# podman images
REPOSITORY                        TAG      IMAGE ID       CREATED              SIZE
localhost/custom-rhel8            5        be3485bdf603   About a minute ago   235 MB
localhost/custom-rhel8            latest   be3485bdf603   About a minute ago   235 MB
localhost/custom-rhel8            8.5      be3485bdf603   About a minute ago   235 MB
registry.access.redhat.com/ubi8   latest   cc0656847854   2 weeks ago          235 MB

[root@podman ~]# podman rmi -f localhost/custom-rhel8:5
Untagged: localhost/custom-rhel8:5

[root@podman ~]# podman images
REPOSITORY                        TAG      IMAGE ID       CREATED         SIZE
localhost/custom-rhel8            latest   be3485bdf603   3 minutes ago   235 MB
localhost/custom-rhel8            8.5      be3485bdf603   3 minutes ago   235 MB
registry.access.redhat.com/ubi8   latest   cc0656847854   2 weeks ago     235 MB

[root@podman ~]# podman run --name rhel85 -it -d localhost/custom-rhel8:8.5
0f0e0c4760036871671eaeb2dfef03eef64a2d787d208df2829b4d32cf8be375

[root@podman ~]# podman exec -it rhel85 /bin/bash

[root@0f0e0c476003 /]# id user9
uid=1000(user9) gid=1000(user9) groups=1000(user9)

[root@0f0e0c476003 /]# exit
exit

[root@podman ~]# podman stop rhel8 rhel85
0f0e0c4760036871671eaeb2dfef03eef64a2d787d208df2829b4d32cf8be375
ca3d137601cf6408394bbdc8c2f6350e615b1bb7c2a92920acdaafcc1d21c094

[root@podman ~]# podman rm rhel8 rhel85
ca3d137601cf6408394bbdc8c2f6350e615b1bb7c2a92920acdaafcc1d21c094
0f0e0c4760036871671eaeb2dfef03eef64a2d787d208df2829b4d32cf8be375

SAVE

[root@podman ~]# podman images

[root@podman ~]# podman save -q -o ~/custom-rhel8-latest.tar localhost/custom-rhel8:latest
Getting image source signatures
Copying blob 0d3f22d60daf done
Copying blob 0488bd866f64 done
Copying blob 431250c3978c done
Copying config be3485bdf6 done
Writing manifest to image destination
Storing signatures

[root@podman ~]# podman save -q -o ~/custom-rhel8-latest-85.tar localhost/custom-rhel8:8.5
Getting image source signatures
Copying blob 0d3f22d60daf done
Copying blob 0488bd866f64 done
Copying blob 431250c3978c done
Copying config be3485bdf6 done
Writing manifest to image destination
Storing signatures

[root@podman ~]# du -sh custom-rhel8-latest.tar custom-rhel8-latest-85.tar
225M    custom-rhel8-latest.tar
225M    custom-rhel8-latest-85.tar

[root@podman ~]# tar -tf custom-rhel8-latest.tar
[root@podman ~]# tar -tf custom-rhel8-latest-85.tar

[root@podman ~]# podman rmi localhost/custom-rhel8:latest
Untagged: localhost/custom-rhel8:latest

[root@podman ~]# podman rmi localhost/custom-rhel8:8.5
Untagged: localhost/custom-rhel8:8.5
Deleted: be3485bdf6039f8667428656b9ba2923c6e2811ad12b4039907d832c5bd0c46f

[root@podman ~]# images

LOAD

[root@podman ~]# podman load -i ~/custom-rhel8-latest.tar
Getting image source signatures
Copying blob 431250c3978c done
Copying blob 0d3f22d60daf skipped: already exists
Copying blob 0488bd866f64 skipped: already exists
Copying config be3485bdf6 done
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/custom-rhel8:latest

[root@podman ~]# podman load -i ~/custom-rhel8-latest-85.tar
Getting image source signatures
Copying blob 431250c3978c skipped: already exists
Copying blob 0d3f22d60daf [--------------------------------------] 0.0b / 0.0b
Copying blob 0488bd866f64 [--------------------------------------] 0.0b / 0.0b
Copying config be3485bdf6 done
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/custom-rhel8:8.5

[root@podman ~]# podman images
REPOSITORY                       TAG         IMAGE ID      CREATED         SIZE
localhost/custom-rhel8           8.5         4f03b3f031e2  10 minutes ago  235 MB
localhost/custom-rhel8           latest      4f03b3f031e2  10 minutes ago  235 MB
registry.access.redhat.com/ubi8  latest      cc0656847854  4 weeks ago     235 MB

[root@podman ~]# podman run --name rhel8 -it -d localhost/custom-rhel8

EXPORT

[root@podman ~]# podman ps

[root@podman ~]# podman export -o ~/custom-rhel8-export.tar rhel8

IMPORT

[root@podman ~]# podman import ~/custom-rhel8-export.tar localhost/custom-rhel8-export

[root@podman ~]# podman rmi localhost/custom-rhel8-export

INSPECT

[root@podman ~]# podman inspect rhel8

HISTORY

[root@podman ~]# podman history localhost/custom-rhel8:latest
ID            CREATED         CREATED BY  SIZE        COMMENT
4f03b3f031e2  20 minutes ago  /bin/sh     317 kB      FROM registry.access.redhat.com/ubi8:latest
cc0656847854  4 weeks ago                 20.5 kB
<missing>     4 weeks ago                 235 MB      Imported from -

STAT

[root@podman ~]# podman stats rhel8

ID             NAME    CPU %   MEM USAGE / LIMIT   MEM %   NET IO              BLOCK IO            PIDS
6bc4d894b63f   rhel8   --      2.92MB / 16.62GB    0.02%   1.048kB / 4.252kB   8.192kB / 4.096kB   1

TOP

[root@podman ~]# podman top rhel8
USER   PID   PPID   %CPU    ELAPSED          TTY     TIME   COMMAND
root   1     0      0.000   13m2.41896166s   pts/0   0s     /bin/bash

LOGS

[root@podman ~]# podman logs rhel8

EVENTS

[root@podman ~]# podman events --since 30m

PAUSE

[root@podman ~]# podman pause rhel8
6bc4d894b63f925f2b2105bf98bf34698b4042572453825df448a70a38d46dd1

[root@podman ~]# podman ps -a
CONTAINER ID  IMAGE                              COMMAND               CREATED         STATUS                   PORTS                                                                      NAMES
6bc4d894b63f  localhost/custom-rhel8:latest      /bin/bash             15 minutes ago  Paused      

UNPAUSE

[root@podman ~]# podman unpause rhel8
6bc4d894b63f925f2b2105bf98bf34698b4042572453825df448a70a38d46dd1

INFO

[root@podman ~]# podman info

VERSION

[root@podman ~]# podman version
  1. Ejecutar un contenedor httpd como root y analizar
# podman login registry.redhat.io
# username: <user>
# password: <pass>
# podman run --name httpd-root -p 80:8080 -p 443:8443 -d registry.redhat.io/rhel8/httpd-24
# podman port -l
# podman inspect httpd-root | grep -E '(IPAddress|expose)'
# curl -si http://localhost | grep Test
# curl -si -k https://localhost | grep Test
# curl -si http://<container_ip>:8080 | grep Test
# curl -si -k https://<container_ip>:8443 | grep Test

Dentro de la conexión vnc abrir un terminal o navegador y acceder

# firefox http://<hostname>
# firefox https://<hostname>
  1. Ejecutar un contenedor httpd como developer y analizar
$ podman login registry.redhat.io
$ username: <user>
$ password: <pass>
$ podman run --name httpd-dev -p 8080 -p 8443 -d registry.redhat.io/rhel8/httpd-24
$ podman port -l
$ sudo netstat -taunlp | grep -E '(LISTEN|slirp4netns)'
$ curl -si http://localhost:<port_number> | grep Test
$ curl -si -k https://localhost:<port_number> | grep Test
$ firefox http://localhost:<port_number>
$ firefox https://localhost:<port_number>
  1. Ejecutar un contenedor httpd como developer y personalizarlo.
[developer@podman ~]$ podman pull rhscl/httpd-24-rhel7
[developer@podman ~]$ podman run --name httpd-server -p 8080 -p 8443 -d rhscl/httpd-24-rhel7
[developer@podman ~]$ podman exec -it httpd-server /bin/bash
[developer@podman ~]$ echo "TEST HTTPD SERVER FROM CONTAINERS" > /var/www/html/index.html
[developer@podman ~]$ exit
[developer@podman ~]$ podman inspect httpd-server | grep -E '(IPAddress|expose)'
[developer@podman ~]$ podman port -l
[developer@podman ~]$ curl -si http://localhost:<port_number>
[developer@podman ~]$ curl -si -k https://localhost:<port_number>
[developer@podman ~]$ podman exec -it httpd-server cat /var/www/html/index.html
[developer@podman ~]$ podman exec -it httpd-server /bin/bash -c 'echo "JAIME ZAMUDIO" >> /var/www/html/index.html'
[developer@podman ~]$ podman exec -it httpd-server cat /var/www/html/index.html
[developer@podman ~]$ curl -si http://localhost:<port_number>
[developer@podman ~]$ curl -si -k https://localhost:<port_number>
[developer@podman ~]$ podman kill -s SIGKILL httpd-server
[developer@podman ~]$ podman restart  httpd-server
[developer@podman ~]$ podman ps
[developer@podman ~]$ podman inspect httpd-server | grep -E '(IPAddress|expose)'
[developer@podman ~]$ curl -si http://localhost:<port_number>
[developer@podman ~]$ curl -si -k https://localhost:<port_number>
[developer@podman ~]$ podman commit httpd-server custom-httpd-server
[developer@podman ~]$ podman save > custom-httpd-server.tar custom-httpd-server
[developer@podman ~]$ du -sh ~/custom-httpd-server.tar
[developer@podman ~]$ tar -tf ~/custom-httpd-server.tar
[developer@podman ~]$ podman stop -a
[developer@podman ~]$ podman rm -a 
[developer@podman ~]$ podman rmi -a
[developer@podman ~]$ podman images
[developer@podman ~]$ podman load -i ~/custom-httpd-server.tar
[developer@podman ~]$ podman images
[developer@podman ~]$ podman tag localhost/custom-httpd-server:latest localhost/custom-httpd-server:2.0
[developer@podman ~]$ podman run --name custom-httpd-server-2 -p 8080 -p 8443 -d localhost/custom-httpd-server:2.0
[developer@podman ~]$ podman port -l
[developer@podman ~]$ curl -si http://localhost:<port_number>
[developer@podman ~]$ curl -si -k https://localhost:<port_number>

Opcional Pusharlo a Quay
NOTA: Si sale error revisar en quay.io si se crea la carpeta si se crea como privada hacerla publica, sino se crea crearla como publica

[developer@podman ~]$ podman tag localhost/custom-httpd-server:2.0 quay.io/jaimemarianoz/custom-httpd-server:2.0
[developer@podman ~]$ podman login quay.io
[developer@podman ~]$ username: <user>
[developer@podman ~]$ password: <pass>
[developer@podman ~]$ podman push quay.io/jaimemarianoz/custom-httpd-server:2.0 # < Si falla revisar en la web de quay.io que el repositorio este como publico
[developer@podman ~]$ podman push quay.io/jaimemarianoz/custom-httpd-server:2.0
[developer@podman ~]$ podman stop -a
[developer@podman ~]$ podman rm -a
[developer@podman ~]$ podman rmi -af
[developer@podman ~]$ podman run --name custom-httpd-server -p 8080 -p 8443 -d quay.io/jaimemarianoz/custom-httpd-server:2.0
[developer@podman ~]$ podman port -l
[developer@podman ~]$ curl -si http://localhost:<port_number>
[developer@podman ~]$ curl -si -k https://localhost:<port_number>
  1. Ejecutar un contenedor mysql con contenido efímero.
[developer@podman ~]$ podman run --name mysql-server \
-e MYSQL_USER=user9 -e MYSQL_PASSWORD=redhat \
-e MYSQL_DATABASE=samples -e MYSQL_ROOT_PASSWORD=Password$ \
-d registry.access.redhat.com/rhscl/mysql-57-rhel7
[developer@podman ~]$ podman ps
[developer@podman ~]$ podman exec -it mysql-server /bin/bash

bash-4.2$ env | grep ^MYSQL_
bash-4.2$ mysql -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
mysql> show databases;
mysql> exit
bash-4.2$ exit

[developer@podman ~]$ wget ftp://classroom.opennova.pe/openshift/podman/samples.sql
[developer@podman ~]$ podman cp ~/sample.sql mysql-server:/tmp
[developer@podman ~]$ podman exec -it -l /bin/bash

bash-4.2$ mysql -uuser9 -predhat samples < /tmp/samples.sql
bash-4.2$ mysql -uuser9 -predhat samples
mysql> show databases;
mysql> describe Items;
mysql> select id,name,code from Items;
mysql> exit
bash-4.2$ exit

Para depurar todo ejecutar

[developer@podman ~]$ podman stop -a ; podman rm -a ; podman rmi -af
  1. Ejecutar un contenedor mysql con contenido persistente.
[developer@podman ~]$ mkdir -pv ~/mysql/data
[developer@podman ~]$ sudo semanage fcontext -a -t container_file_t '/home/developer/mysql/data'
[developer@podman ~]$ restorecon -RFvv /home/developer/mysql/data/
Relabeled /home/developer/mysql/data from unconfined_u:object_r:user_home_t:s0 to system_u:object_r:container_file_t:s0

[developer@podman ~]$ ls -ldZ ~/mysql/data/
drwxrwxr-x. 2 developer developer system_u:object_r:container_file_t:s0 6 Dec  1 22:20 /home/developer/mysql/data/

[developer@podman ~]$ podman unshare chown 27:27 ~/mysql/data

[developer@podman ~]$  podman run --name mysql-server-persistent \
-p 13306:3306 \
-v /home/developer/mysql/data:/var/lib/mysql \
-e MYSQL_USER=user9 -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=samples -e MYSQL_ROOT_PASSWORD=Password$ \
-d registry.access.redhat.com/rhscl/mysql-57-rhel7

[developer@podman ~]$ podman ps
[developer@podman ~]$ podman exec -it mysql-server-persistent /bin/bash

bash-4.2$ env | grep ^MYSQL_
bash-4.2$ mysql -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
mysql> show databases;
mysql> exit
bash-4.2$ exit

[developer@podman ~]$ wget ftp://classroom.opennova.pe/openshift/podman/samples.sql
[developer@podman ~]$ netstat -taunlp | grep 13306
[developer@podman ~]$ sudo yum install -y mysql
[developer@podman ~]$ mysql -uuser9 -predhat -h127.0.0.1 -P 13306 samples < ~/samples.sql
[developer@podman ~]$ mysql -uuser9 -predhat -h127.0.0.1 -P 13306 samples -e "use samples; select * from Items;"
[developer@podman ~]$ podman unshare ls -l /home/developer/mysql/data/data/samples

[developer@podman ~]$ podman stop mysql-server-persistent
[developer@podman ~]$ podman rm mysql-server-persistent
[developer@podman ~]$ podman unshare ls -l /home/developer/mysql/data/data/samples

[developer@podman ~]$ podman run --name mysql-server-persistent \
-p 13306:3306 \
-v /home/developer/mysql/data:/var/lib/mysql \
-e MYSQL_USER=user9 -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=samples -e MYSQL_ROOT_PASSWORD=Password$ \
-d registry.access.redhat.com/rhscl/mysql-57-rhel7

[developer@podman ~]$ mysql -uuser9 -predhat -h127.0.0.1 -P 13306 samples -e "use samples; select * from Items;"

Para depurar todo ejecutar

[developer@podman ~]$ podman stop -a ; podman rm -a ; podman rmi -af
[developer@podman ~]$ sudo rm -rf ~/mysql
  1. Construir una imagen de contenedor para httpd utilizando un Containerfile.
[developer@podman ~]$ mkdir custom-apache ; cd custom-apache
[developer@podman ~]$ wget ftp://classroom.opennova.pe/openshift/podman/Containerfile
[developer@podman custom-apache]$ mkdir src ; cd src
[developer@podman src]$ git clone https://github.com/workshopopennova/global.git
[developer@podman src]$ cd ~/custom-apache
[developer@podman src]$ podman build --layers=false -t custom-apache .
[developer@podman src]$ podman images
[developer@podman custom-apache]$ podman run --name custom-apache -d -p 8080:8080 custom-apache
[developer@podman custom-apache]$
[developer@podman custom-httpd]$ curl -si http://localhost:8080 | head -n 20
[developer@podman custom-httpd]$ firefox http://localhost:8080

Laboratorio: Containers with Podman

NOTA:

  • Las tareas a ejecutarse serán en la estación client0X.opennova.pe, donde X es el numero de usuario del 1 al 6 respectivamente.
  • En el caso de solicitar la creación de algún usuario nuevo utilizar userX donde X es el numero de usuario del 1 al 6 respectivamente y la contraseña será redhat.

Requerimientos:
1. Implementar un contenedor de sistema operativo rhel8 con la siguiente información:

  • El nombre del contenedor debe ser: rhel8-server
  • Utilizar la imagen de contenedor: registry.access.redhat.com/ubi8:latest
  • Conectarse al contenedor y crear el usuario userX con contraseña redhat.
  • Grabar los cambios realizados en una imagen llamada: rhel8-server-custom
  • Guardar una copia de la imagen rhel8-server-custom y guardarla en: /home/developer/rhel8-server-custom
  • Depurar el espacio de trabajo con (podman stop -a ; podman rm -a; podman rmi -af)
  • Cargar la imagen ubicada en: /home/developer/rhel8-server-custom
  • Correr la imagen cargada y validar que los últimos cambios estan presentes.

2. Implementar un contendor httpd con la siguiente información:

  • El nombre del contenedor debe ser: httpd-server
  • Utilizar la imagen de contenedor: rhscl/httpd-24-rhel7
  • Correr la imagen de contenedor publicando los puertos 8080:8080 y 8443:8443
  • Con el comando podman exec enviar un comando al contenedor a la ruta /var/www/html y crear un archivo index.html que diga "WORKSHOP CONTAINER USERX"
  • Validar con el comando curl -si http://localhost:8080, curl -si -k https://localhost:8443 que se pueda visualizar el contenido: "WORKSHOP CONTAINER USER X"
  • Grabar los cambios realizados en una imagen llamada: httpd-server-custom
  • Guardar una copia de la imagen httpd-server-custom y guardarla en: /home/developer/httpd-server-custom
  • Depurar el espacio de trabajo con (podman stop httpd-server ; podman rm httpd-server; podman rmi httpd-server)
  • Cargar la imagen ubicada en: /home/developer/httpd-server-custom
  • Correr la imagen cargada publicando los puertos 8080:8080 y 8443:8443 y validar que los últimos cambios estan presentes.

3. Implementar un contenedor mysql efímero con la siguiente información:

  • El nombre del contenedor debe ser: mysql-server
  • Utilizar la imagen de contenedor: registry.access.redhat.com/rhscl/mysql-57-rhel7
  • Usar las variables de ambiente: MYSQL_USER=userX MYSQL_PASSWORD=redhat MYSQL_DATABASE=samples MYSQL_ROOT_PASSWORD=Password$
  • Cargarle la base de datos samples.sql descargarla de: ftp://classroom.opennova.pe/openshift/podman/samples.sql
  • Conectarse al contenedor y validar que las variables de ambiente esten correctas con el comando linux: $ env | grep ^MYSQL_
  • Conectarse a la base de datos con el comando: mysql -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
  • Hacer a la base de datos Samples tabla Items: USE Samples; SELECT * FROM Items;

4. Implementar un contenedor mysql persistente con la siguiente información:

  • Crear un directorio en: /home/developer/db/datos
  • Configurar el contexto container_file_t al directorio /home/developer/db/datos
  • Aplicar el contexto con restorecon -RFvv /home/developer/db/datos
  • Utilizar el comando: podman unshare chown 27:27 /home/developer/db/datos
  • El nombre del contenedor debe ser: mysql-server-persistent
  • Utilizar la imagen de contenedor: registry.access.redhat.com/rhscl/mysql-57-rhel7
  • Publicar el puerto 13306 del host al puerto 3306 del contenedor
  • Montar la carpeta /home/developer/db/datos del host a /var/lib/mysql del contenedor
  • Usar las variables de ambiente: MYSQL_USER=userX MYSQL_PASSWORD=redhat MYSQL_DATABASE=samples MYSQL_ROOT_PASSWORD=Password$
  • Cargarle la base de datos samples.sql descargarla de: ftp://classroom.opennova.pe/openshift/podman/samples.sql
  • Conectarse al contenedor y validar que las variables de ambiente estén correctas con el comando linux: $ env | grep ^MYSQL_
  • Conectarse a la base de datos con el comando: mysql -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
  • Hacer a la base de datos Samples tabla Items: USE Samples; SELECT * FROM Items;
  • Validar que pueda ver el contenido del almacenamiento en el host ejecutando: podman unshare ls -l /home/developer/db/datos/*

5. Construir una imagen de contenedor con la siguiente información:

⚠️ **GitHub.com Fallback** ⚠️