# Containers

Containers allows developers to test and build applications on any computer by putting it in a container bundled with software code, libraries, and config files

Docker

<div id="bkmrk-software-used-to-cre" style="direction: ltr; border-width: 100%;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;">- <span style="font-family: Consolas; font-size: 10.0pt;">software used to create and manage containers</span>
- <span style="font-family: Consolas; font-size: 10.0pt;">can be installed on Linux - daemon can be controlled natively</span>
- <span style="font-family: Consolas; font-size: 10.0pt;">not supported in RHEL 8</span>

</div></div></div>Podman

<div id="bkmrk-developed-by-red-hat" style="direction: ltr; border-width: 100%;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;">- <span style="font-family: Consolas; font-size: 10.0pt;">developed by Red Hat 2018 as an alternative to docker</span>
- <span style="font-family: Consolas; font-size: 10.0pt;">daemon less, open source, linux native tool to develop, manage and run containers</span>

</div></div></div>Red Hat provides a set of CLI tools

<div id="bkmrk-podman---directly-ma" style="direction: ltr; border-width: 100%;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;">- <span style="font-family: Consolas; font-size: 10.0pt;">podman - directly managing pods and container images (run, stop, start, ps attach, etc)</span>
- <span style="font-family: Consolas; font-size: 10.0pt;">buildah - for building, pushing, and signing container images</span>
- <span style="font-family: Consolas; font-size: 10.0pt;">skopeo - copying, inspecting, deleting, signing images</span>
- <span style="font-family: Consolas; font-size: 10.0pt;">runc - providing container run and build features to podman and buildah</span>
- <span style="font-family: Consolas; font-size: 10.0pt;">crun - optional runtime that can be configured and give greater flexibility, control &amp; security for rootless containers</span>

</div></div></div><div id="bkmrk-images---containers-" style="direction: ltr; border-width: 100%;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;">- <span style="font-family: Consolas; font-size: 10.0pt;">images - containers can be created through images and containers can be converted to images</span>
- <span style="font-family: Consolas; font-size: 10.0pt;">pods - groups of containers deployed together on the host</span>

</div></div></div>Basic Commands

<div id="bkmrk-dnf-install-podman--" style="direction: ltr; border-width: 100%;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr;"><table border="1" cellpadding="0" cellspacing="0" style="direction: ltr; border-collapse: collapse; border: 1pt solid #A3A3A3;" summary="" title=""><tbody><tr><td style="vertical-align: top; width: 1.8423in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">dnf install podman -y

</td><td style="vertical-align: top; width: 5.3875in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">install podman

</td></tr><tr><td style="vertical-align: top; width: 1.8229in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">alias docker=podman

</td><td style="vertical-align: top; width: 5.4062in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">used when switching from docker to podman

</td></tr><tr><td style="vertical-align: top; width: 1.8229in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman -v

</td><td style="vertical-align: top; width: 5.4062in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">check podman version

</td></tr><tr><td style="vertical-align: top; width: 1.8229in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman info

</td><td style="vertical-align: top; width: 5.4756in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">check podman environment (see registries)  
if loading an image, looks locally, then to registries by order listed

</td></tr></tbody></table>

</div></div></div></div>Image --&gt; Run Container --&gt; Remove it

<div id="bkmrk-podman-search-httpd-" style="direction: ltr; border-width: 100%;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr;"><table border="1" cellpadding="0" cellspacing="0" style="direction: ltr; border-collapse: collapse; border: 1pt solid #A3A3A3;" summary="" title=""><tbody><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman search httpd

</td><td style="vertical-align: top; width: 3.1784in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">search container registries for an image

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman pull docker.io/library/httpd

</td><td style="vertical-align: top; width: 3.109in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">download image from a registry

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman images

</td><td style="vertical-align: top; width: 3.109in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">list downloaded images

</td></tr><tr><td style="vertical-align: top; width: 4.8208in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman run -d --name web1 -p 8080:80 docker.io/library/httpd

</td><td style="vertical-align: top; width: 3.159in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">create &amp; start a container from an image

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman ps

</td><td style="vertical-align: top; width: 3.109in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">list running containers

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">curl localhost:8080 (or web) [http://localhost:8080](http://localhost:8080)

</td><td style="vertical-align: top; width: 3.109in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">verify application is accessible

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman stop web1

</td><td style="vertical-align: top; width: 3.109in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">stop a container gracefully

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman rm -f web1

</td><td style="vertical-align: top; width: 3.109in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">remove a container

</td></tr></tbody></table>

</div></div></div></div>Image --&gt; Create Container --&gt; Start Container

<div id="bkmrk-podman-pull-docker.i" style="direction: ltr; border-width: 100%;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr;"><table border="1" cellpadding="0" cellspacing="0" style="direction: ltr; border-collapse: collapse; border: 1pt solid #A3A3A3;" summary="" title=""><tbody><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman pull docker.io/library/httpd

</td><td style="vertical-align: top; width: 2.6513in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">download image from a registry

</td></tr><tr><td style="vertical-align: top; width: 4.8208in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman create --name web2 -p 8081:80 docker.io/library/httpd

</td><td style="vertical-align: top; width: 2.6319in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">create a container

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman ps -a

</td><td style="vertical-align: top; width: 2.6513in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">verify status is created  
-a all containers

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman start web2

</td><td style="vertical-align: top; width: 2.6513in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">start an existing container

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman ps

</td><td style="vertical-align: top; width: 2.7208in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">verify container status is running

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">curl localhost:8081 (or web) [http://localhost:8081](http://localhost:8081)

</td><td style="vertical-align: top; width: 2.6513in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">verify application is accessible

</td></tr><tr><td style="vertical-align: top; width: 4.8013in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman logs web2

</td><td style="vertical-align: top; width: 2.7208in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">view output generated by container

</td></tr></tbody></table>

</div></div></div></div>Quadlet (Modern RHEL10) systemd container management

<div id="bkmrk-mkdir--p-%2Fetc%2Fcontai" style="direction: ltr; border-width: 100%;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 10.3111in;"><div style="direction: ltr;"><table border="1" cellpadding="0" cellspacing="0" style="direction: ltr; border-collapse: collapse; border: 1pt solid #A3A3A3;" summary="" title=""><tbody><tr><td style="vertical-align: top; width: 4.0375in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">mkdir -p /etc/containers/systemd

</td><td style="vertical-align: top; width: 3.7965in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">create directory for quadlet definitions

</td></tr><tr><td style="vertical-align: top; width: 4.0375in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">nano /etc/containers/systemd/web3.container  
…

\[Unit\]

Description=Apache Web Container

\[Container\]

Image=docker.io/library/httpd

ContainerName=web3

PublishPort=8082:80

\[Service\]

Restart=always

\[Install\]

WantedBy=multi-user.target

</td><td style="vertical-align: top; width: 3.8416in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">create quadlet container definition file  
  
define systemd metadata  
description  
  
define container-specific settings  
specifies container image  
assigns name  
maps host port to container port  
  
defines systemd behaviour  
automatically restart container if it stops  
  
definte boot settings  
allow service to start automatically during boot

</td></tr><tr><td style="vertical-align: top; width: 4.0375in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">systemctl daemon-reload

</td><td style="vertical-align: top; width: 3.7965in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">reload systemd configuration

</td></tr><tr><td style="vertical-align: top; width: 4.0375in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">systemctl enable --now web3.service

</td><td style="vertical-align: top; width: 3.7965in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">enable service at boot and start now

</td></tr><tr><td style="vertical-align: top; width: 4.0375in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">systemctl status web3.service

</td><td style="vertical-align: top; width: 3.7965in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">verify service status

</td></tr><tr><td style="vertical-align: top; width: 4.0375in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">podman ps

</td><td style="vertical-align: top; width: 3.7965in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">verify container status is running

</td></tr><tr><td style="vertical-align: top; width: 4.0569in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">curl localhost:8082 (or web) [http://localhost:8082](http://localhost:8082)

</td><td style="vertical-align: top; width: 3.777in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;">verify application is accessible

</td></tr></tbody></table>

</div></div></div></div>