How good is Podman?

This week I have seen two demos where Docker was replaced by Podman. In one case, the person running the demo had symlinked docker to podman to make us initially think he was running docker. In both demos, Podman ran flawlessly. But I still get the question, but how good is Podman?

As one of the primary developers of Podman, I know where the dirty laundry lays. And without a doubt, Podman is still very much under heavy development. My colleague Matt Heon has become an expert at “pumping the brakes” about Podman; meanwhile, I do the classic engineer dance of trying to explain where we are strong and where we need to make progress.

But these demos really forced us to reflect on where we stand. Frankly, Podman is quite functional and if people are demo’ing it in place of Docker, then clearly it is working. I thought it might worthwhile to put it to the test myself.

$ sudo podman run -t -p 8000:80 nginx
Trying to pull docker.io/nginx:latest...Getting image source signatures
Copying blob sha256:2a72cbf407d67c7a7a76dd48e432091678e297140dce050ad5eccad918a9f8d6
21.45 MB / 21.45 MB [======================================================] 1s
Copying blob sha256:04b2d3302d48e81ac324cdc2d752c7001c8ad85a078126875b6fe2358a617c7a
21.09 MB / 21.09 MB [======================================================] 2s
Copying blob sha256:e7f619103861594f626c38601e5be5c6f70e860ef8cb2d1d49f440fadab423d1
204 B / 204 B [============================================================] 0s
Copying config sha256:b175e7467d666648e836f666d762be92a56938efe16c874a73bab31be5f99a3b
5.89 KB / 5.89 KB [========================================================] 0s
Writing manifest to image destination
Storing signatures
10.88.0.1 - - [20/Apr/2018:18:23:36 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1

And in another terminal window:

$ curl http://localhost:8000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
.... the rest is removed for brevity

Well that work nicely! Let’s try something a little more complex like MariaDB.

Installation was simple:

$ sudo podman run --name some-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb
Trying to pull docker.io/mariadb:latest...Getting image source signatures
Copying blob sha256:f2b6b4884fc8b2f1fcef843f92f7c82c9c149df85ac77e5f0de7a342ae442412
50.17 MB / 50.17 MB [======================================================] 4s
Copying blob sha256:26d8bdca4f3e3d03817be0249f4df6c3ab8e80c95011ca20e25bdfaeca3c3e3c
... // Deleted for brevity
2.04 KB / 2.04 KB
7.43 KB / 7.43 KB [========================================================] 0s
Writing manifest to image destination
Storing signatures
05178eee504947f760f89ee43d36a571d4b0072231dbbc3ccacb14bc679f912d

Once the MariaDB container was running, I grabbed an example data set provided on github and imported it into the database. For the sake of simplicity, I tested the database with the mysql command line utility from my laptop.

$ mysql --user=root --password=my-secret-pw -h 10.88.10.86 -t
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.2.14-MariaDB-10.2.14+maria~jessie mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use employees
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

Now that I have selected the database for use, I’m curious about the makeup of the employees table.

MariaDB [employees]> describe employees;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

Lets list the last few employees in the table.

MariaDB [employees]> select * from employees where emp_no > 499991;
+--------+------------+------------+--------------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+--------------+--------+------------+
| 499992 | 1960-10-12 | Siamak | Salverda | F | 1987-05-10 |
| 499993 | 1963-06-04 | DeForest | Mullainathan | M | 1997-04-07 |
| 499994 | 1952-02-26 | Navin | Argence | F | 1990-04-24 |
| 499995 | 1958-09-24 | Dekang | Lichtner | F | 1993-01-12 |
| 499996 | 1953-03-07 | Zito | Baaz | M | 1990-09-27 |
| 499997 | 1961-08-03 | Berhard | Lenart | M | 1986-04-21 |
| 499998 | 1956-09-05 | Patricia | Breugel | M | 1993-10-13 |
| 499999 | 1958-05-01 | Sachin | Tsukuda | M | 1997-11-30 |
+--------+------------+------------+--------------+--------+------------+
8 rows in set (0.00 sec)

I would say this container is working nicely!

Two tests is hardly a proof point. But it was fun to see what containers are out there that people are running daily.

What do you run in a container and does it work with Podman?