He was an exiled program within the Matrix who figuratively appeared as one of the kingpin figures.
Choice is an illusion created between those with power and those without.
-- The Merovingian
The project demonstrates using various containers for SQL and NoSQL databases from within and outside Docker.
All are configured to be accessible via the windows command line and store their data in a data subfolder.
Although not tested, the project should also work as-is on a UNIX platform with docker installed or
using the docker-compose module for Podman.
- Install Docker Desktop on Linux
- How to use docker-compose with Podman on Linux
podman kube generateGenerate Kubernetes YAML based on containers, pods or volumes
PS1> docker volume create dbgate-data
PS1> docker compose up -d
PS1> docker ps --format '{{.Names}}\t{{.ID}}\t{{.Image}}'
postgres cbf27b757154 postgres:latest
mariadb 4a99944e6574 mariadb:latest
alpine 8a03414d413b merovingian-alpine
mongodb bb5d5857eb78 mongo
valkey bb8163502e5d merovingian-valkey
mongo-express a77d231c2bf0 mongo-express
adminerevo 748112fa6cdb ghcr.io/shyim/adminerevo:latest
dbgate 0588e3cc9e01 dbgate/dbgate:alpine
PS1> $ docker container ls --format '{{.Names}}\t{{.ID}}\t{{.Image}}'For containers based on Alpine Linux, there is no bash so use ash
PS1> docker exec -it postgres /bin/bash
PS1> docker exec -it mariadb /bin/bash
PS1> docker exec -it alpine /bin/ash
PS1> docker exec -it mongodb mongosh
PS1> docker exec -it valkey /bin/ashDatabase Management Web Interfaces
PS1> start http://localhost:8080 # adminerevo
PS1> start http://localhost:8081 # mongo-express
PS1> start http://localhost:3000 # dbgateShutdown Merovingian containers
PS1> docker compose downClean up if finished with the project
PS1> docker compose down
# Clean-up images
PS1> docker image rm mariadb:latest
PS1> docker image rm merovingian-alpine
PS1> docker image rm mongo
PS1> docker image rm merovingian-valkey
PS1> docker image rm mongo-express
PS1> docker image rm ghcr.io/shyim/adminerevo:latest
PS1> docker image rm dbgate/dbgate:alpine
# Optionally prune danglining images
PS1> docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
# Remove DBgate volume
PS1> docker volume rm dbgate-dataIt is a port of 'redis', so 'redis' tutorials should be usable.
Reference documentation
- Valkey: official docker containers
- Valkey: Tutorial
- Documentation: Valkey configuration
- Valkey: Documentation by topic
- Valkey: Command Reference
- valkey-py - Core Commands
- How to Use the Redis Docker Official Image
Use docker compose to start, stop the container.
valkeyservice builds the container, copying a configuration template, into/usr/localvalkey-vanilla, which is commented-out, deploys the one from DockerHub, with a default configuration
Both mount valkey\data so the files are stored locally on Windows
Like the other containers it is configured on dev_net to isolate it from any other containers.
# Start the container
PS1> docker compose up -d valkey
# Login to container
PS1> docker exec -it valkey sh # interactive UNIX Shell
# Start the valkey-cli
PS1> docker exec -it valkey valkey-cli # valkey-cli
127.0.0.1:6379> SET mynumber 42
OK
127.0.0.1:6379> GET mynumber
"42"
127.0.0.1:6379> TYPE mynumber
string
127.0.0.1:6379> OBJECT ENCODING mynumber
"int"
127.0.0.1:6379> INCR mynumber
(integer) 43
127.0.0.1:6379> DECR mynumber
(integer) 42
127.0.0.1:6379> exit
# Checking for protected mode
PS1> docker exec -it valkey valkey-cli
127.0.0.1:6379> config get *protect*
1) "protected-mode"
2) "no"
3) "enable-protected-configs"
4) "no"
127.0.0.1:6379> config get *bind*
1) "bind"
2) "* -::*"
3) "bind-source-addr"
4) ""
127.0.0.1:6379> exit
PS1> docker compose down valkeyThe MariaDB root password is admin, set in the compose.yaml file.
PS1> docker exec -it mariadb bash
# mariadb -u root -p
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.013 sec)
MariaDB [mysql]> use mysql;
MariaDB [mysql]> select host,user,password_expired from user limit 6;
+-----------+-------------+------------------+
| Host | User | password_expired |
+-----------+-------------+------------------+
| localhost | mariadb.sys | Y |
| localhost | root | N |
| % | root | N |
| 127.0.0.1 | healthcheck | N |
| ::1 | healthcheck | N |
| localhost | healthcheck | N |
+-----------+-------------+------------------+
6 rows in set (0.001 sec)
MariaDB [mysql]> exit;
root@3f69733aef31:/# exitNOTE: SQLAlchemy distinguishes between MySQL and MariaDB.
- How to Create User With Grant Privileges in MariaDB
- MySQL Cheatsheet
- MySQL® Notes for Professionals book
Example of how to create a user, set a password and grant access to the database test.
PS1> docker exec -it mariadb bash
root@3f69733aef31:/# mariadb -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 11.6.2-MariaDB-ubu2404 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)]>
MariaDB [(none)]>
MariaDB [(none)]> CREATE DATABASE test;
Query OK, 1 row affected (0.007 sec)
# Need all IP's hence '%' (Docker Network is 192.168.65.0/24)
MariaDB [(none)]> CREATE USER 'user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.004 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON test.* TO 'user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.004 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> SHOW GRANTS FOR 'user'@'%';
+-------------------------------------------------------------------------------------------------------------+
| Grants for user@localhost |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user`@`localhost` IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT ALL PRIVILEGES ON `test`.* TO `user`@`localhost` |
+-------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
MariaDB [(none)]> exit
Bye
root@3f69733aef31:/# mariadb -u user -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 11.6.2-MariaDB-ubu2404 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 test
Database changed
MariaDB [test]> show tables;
Empty set (0.004 sec)
MariaDB [test]> exitThere is a test script in the src folder called mariadb-test.py
The Python versions of psycopg2 and psycopg2-binary DO NOT install on Windows.
The pure python driver pg8000 works with Python on Windows.
- Python drivers for PostgreSQL
- PyPi pg8000 1.31.2
- GitHub tlocke/pg8000
- PostgreSQL® Notes for Professionals book
Use docker compose (up -d|stop) postgres to start, stop the container.
Like the other containers it is configured on dev_net to isolate it from any other containers.
PS1> docker compose up -d postgres
## Login to container and Test `psql` interface:
PS1> docker exec -it postgres sh
#
# psql -U admin -W postgres
Password:
psql (17.2 (Debian 17.2-1.pgdg120+1))
Type "help" for help.
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------------------
PostgreSQL 17.2 (Debian 17.2-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
(1 row)
postgres=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
-----------+-------+----------+-----------------+------------+------------+--------+-----------+-------------------
postgres | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/admin +
| | | | | | | | admin=CTc/admin
template1 | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/admin +
| | | | | | | | admin=CTc/admin
(3 rows)
postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
-----------+-------+----------+-----------------+------------+------------+--------+-----------+-------------------
postgres | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/admin +
| | | | | | | | admin=CTc/admin
template1 | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/admin +
| | | | | | | | admin=CTc/admin
test | admin | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
(4 rows)Create example database using either the localhost or from the alpine container.
PS1> cd src
PS1> .\venv\Scripts\activate
PS1> python .\postgres-test.py
Author: Ashley
PS1>
# Alpine Container
PS1> docker exec -it alpine /bin/ash
~ $ cd repo
~/repo $ python postgres-test.py
Author: Ashley
~/repo $ exit
PS1>PS1> docker exec it posgres sh
# psql -U admin -W test
test=# \dt
List of relations
Schema | Name | Type | Owner
--------+---------+-------+-------
public | example | table | admin
(1 row)
test=# \d example
Table "public.example"
Column | Type | Collation | Nullable | Default
--------+-----------------------+-----------+----------+-------------------------------------
id | integer | | not null | nextval('example_id_seq'::regclass)
name | character varying(20) | | not null |
Indexes:
"example_pkey" PRIMARY KEY, btree (id)
test=# select * from example;
id | name
----+-----------
1 | Ashley
2 | Barry
3 | Christina
(3 rows)
test=# exit
# exit
PS1> docker compose down postgresThere is a test script in the src folder called postgres-test.py
Use docker compose to start, stop the container.
Like the other containers it is configured on dev_net to isolate it from any other containers.
Like the other databases, User admin, with Password admin
- MongoDB
- TutorialsPoint: MongoDB - Overview
- TecAdmin: MongoDB Tutorials
- W3Schools: MongoDB Overview
- Welcome to MongoDB Shell (mongosh)
- Python MongoDB
- GitHub mongo-express / mongo-express
PS1> docker compose up -d mongodb
PS1> docker exec -it mongodb sh # Interactive Shell
PS1> docker exec -it mongodb bash # Interactive Bash Shell
PS1> docker exec -it mongodb mongosh # Mongosh
docker exec -it mongodb mongosh
Current Mongosh Log ID: 67585e6ed11efa7bb4e94969
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.4
Using MongoDB: 8.0.3
Using Mongosh: 2.3.4
For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/
test> db
test
test> exit
PS1> docker compose down mongodbWarning
For
MongoDBto search thedatafolder, it will create an automaticdocker volumeinto which it mounts Windowsmongodb\datafolder.The
docker volumeis not removed when theserviceis stopped, so periodically rundocker volume pruneto remove any unuseddocker volumes.
There is a test script in the src folder called mongodb-test.py
AdminerEvo is a fork of Adminer, but it's better maintained and has more features.
It's a full-featured database management tool written in PHP, which supports
MySQL,MariaDB,PostgreSQL,SQLite,MS SQL,Oracle,ElasticsearchandMongoDB.
Useful references
Adminerevo is normally installed alongside the database in the same container but here it uses a standalone container.
Note: MongoDB was not working when this documentation as written.
PS1> docker compose up -d adminrevo
PS1> start "http://127.0.1.1:8080"
PS1> docker compose down adminrevoThe WebUI Login details are as follows:
| System | Server | Username | Password | Database |
|---|---|---|---|---|
| MySQL | mariadb | user | password | |
| PostgreSQL | postgres | admin | admin |
A sophisticated WebUI for managing the databases, see the compose.yaml for the configuration details.
Like the other databases, User admin, with Password admin
- DbGate is cross-platform SQL+noSQL database client
- Use storage database and administration for settings (Premium)
- DbGate - Environment Variables
Unlike other containers DbGate is not configured to store its data on the local system but in a docker volume,
so this must be created before trying to start the dbgate service.
PS1> docker volume create dbgate-data
PS1> docker volume ls
DRIVER VOLUME NAME
local 64ade407fdcd1a212cdc45be88912b3b7bd568cf37b4ffc97ef556043461a818
local 295a1fe10ebb426f70b1f00eac472897c7482bed9bce4df2842ef2956cf07ba3
local 756c8b618be37350b915d98fe9e14b83e26df32b34d99eee2b189b17747ddd1c
local dbgate-dataTo start and stop the service.
PS1> docker compose up -d dbgate
# Open from Docker-Desktop or
PS1> start "http://localhost:3000"
PS1> docker compose down dbgateWhen the dbgate service is no longer required do not forget to delete the docker volume
PS1> docker volume rm dbgate-datamongo-express is a web-based MongoDB admin interface written in Node.js, Express.js, and Bootstrap3.
Useful references
Security Notice
JSON documents are parsed through a javascript virtual machine, so the web interface can be used for executing malicious javascript on a server.
mongo-expressshould only be used privately for development purposes.
PS1> docker compose up -d mongo-express
PS1> start "http://127.0.1.1:8081"
PS1> docker compose down mongo-expressSome simple example programs that work from your local system.
The docker containers need to be running and are accessed via localhost
A virtual environment should be created.
PS1> docker compose up -d
PS1> python -m venv venv
PS1> venv\Scripts\activate
(venv)> python -m pip install --upgrade pip
(venv)> pip install -r requirements.txt --upgrade
(venv)> python <test-program>.py
(venv)> deactivate
PS1> docker compose down
PS1>| Program | Description |
|---|---|
| format-dates.py | Date formatting example |
| odd-numbers.py | Print odd number in range |
| valkey-test.py | Simple Valkey example |
| valkey-example.py | Valkey Interactive examples |
| mariadb-test.py | Simple MariaDB example |
| postgres-test.py | Simple PostgreSQL example |
| mongodb-test.py | Simple MongoDB example |
Is an example development container, based on the official python-alpine container.
Please see
README.mdin thealpinefolder for specifics.
It communicates with the other containers over the Docker dev_net network.
The local alpine\repo folder is mounted in a devel account and provides access to run the source code.
PS1> docker compose up -d dbgate
PS1> docker exec -it alpine ash
PS1> docker compose down alpineThe same examples as the src folder but using the docker service names, rather than localhost to
create the connection.
| Program | Description |
|---|---|
| format-dates.py | Date formatting example |
| odd-numbers.py | Print odd number in range |
| valkey-test.py | Simple Valkey example |
| valkey-example.py | Valkey Interactive examples |
| mariadb-test.py | Simple MariaDB example |
| postgres-test.py | Simple PostgreSQL example |
| mongodb-test.py | Simple MongoDB example |
The source code is best edited on your local system.
Your local system is probably not Linux, so be aware of "Windows/MacOS Unix line ending madness when using GIT on Windows"