devops-exercises

Create Images on The Fly

Requirements

Have at least one image locally (run podman image ls to confirm).
If you don’t have images locally, run simply podman pull nginx:alpine.

Objectives

  1. Run a container using a web server image (e.g. httpd, nginx, …)
    • Bind container’s port 80 to local port 80
    • Run it in detached mode
    • Name should nginx_container
  2. Verify the web server runs and accessible
  3. Create an HTML file with the following content and copy it to the container to the container to path where it will be accessed as an index file
<html>
<head>
<title>It's a me</title>
</head>
<body>
<h1>Mario</h1>
</body>
  1. Create an image out of the running container and call it “nginx_mario”
  2. Tag the container with “mario” tag
  3. Remove the original container (container_nginx) and verify it was removed
  4. Create a new container out of the image you’ve created (the same way as the original container)
  5. Run curl 127.0.0.1:80. What do you see?
  6. Run podman diff on the new image. Explain the output

Solution

# Run the container
podman run --name nginx_container -d -p 80:80 nginx:alpine

# Verify web server is running
curl 127.0.0.1:80
    #  <!DOCTYPE html>
    #  <html>
    #  <head>
    #  <title>Welcome to nginx!</title>

# Create index.html file
cat <<EOT >>index.html
<html>
<head>
<title>It's a me</title>
</head>
<body>
<h1>Mario</h1>
</body>
EOT

# Copy index.html to the container
podman cp index.html nginx_container:/usr/share/nginx/html/index.html

# Create a new image out of the running container
podman commit nginx_container nginx_mario

# Tag the image
podman image ls
# localhost/nginx_mario     latest   dc7ed2343521   52 seconds ago   25 MB
podman tag dc7ed2343521 mario

# Remove the container
podman stop nginx_container
podman rm nginx_container
podman ps -a # no container 'nginx_container'

# Create a container out of the image 
podman run -d -p 80:80 nginx_mario

# Check the container created from the new image
curl 127.0.0.1:80
#<html>
#<head>
#<title>It's a me</title>
#</head>
#<body>
#<h1>Mario</h1>
#</body>

# Run diff
podman diff nginx_mario

C /etc
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
A /run/nginx.pid
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /var/cache/nginx
C /var
C /var/cache
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp

# We've set new index.html which explains why it's changed (C)
# We also created the image while the web server is running, which explains all the files created under /var