Recently I took on a task to develop a WordPress plugin. WordPress is old school web app that is usually executed in the context of HTTP server, and needs SQL server to store data. This is a setup that lends itself very well to containers.
There are plenty of
docker-compose.yml WordPress examples floating around, but I am using Podman here and I had trouble running them under podman-compose.
Instead of trying to fix these problems, I decided to create Pod definition file that Podman understands natively.
Including it below in case it is useful for others.
apiVersion: v1 kind: Pod metadata: name: wordpress labels: app: wordpress spec: containers: - name: wpdb image: docker.io/library/mariadb:10 volumeMounts: - mountPath: /var/lib/mysql/ name: mysql_data-pvc ports: - containerPort: 3306 hostPort: 13306 env: - name: MARIADB_ROOT_PASSWORD value: somewordpress - name: MARIADB_DATABASE value: wordpress_db - name: MARIADB_USER value: wordpress_user - name: MARIADB_PASSWORD value: wordpress_password tty: true - name: wp image: docker.io/library/wordpress:latest volumeMounts: - mountPath: /var/www/html/wp-content/plugins/my-wordpress-project:Z name: wp-plugin-hp env: - name: WORDPRESS_DB_HOST value: 127.0.0.1:3306 - name: WORDPRESS_DB_NAME value: wordpress_db - name: WORDPRESS_DB_USER value: wordpress_user - name: WORDPRESS_DB_PASSWORD value: wordpress_password - name: WORDPRESS_DEBUG value: "1" - name: WORDPRESS_CONFIG_EXTRA value: | define( 'WP_ENVIRONMENT_TYPE', 'local' ); ports: - containerPort: 80 hostPort: 8080 tty: true restartPolicy: OnFailure volumes: - name: mysql_data-pvc persistentVolumeClaim: claimName: mysql_data - name: wp-plugin-hp hostPath: path: "/home/USER/projects/my-wordpress-project/"
Pod name, container names and exposed ports must be globally unique. While you can use the same file for multiple projects, you won’t be able to start these projects at the same time.
This file will keep database data across container restarts and system reboots.
If you use the same file for multiple projects, you will end up using the same database for all of them.
claimName near the bottom to prevent this.
docker-compose.yml, usually you map specific local path to specific container path.
In Podman Pod definition, this is broken into two steps.
First, you define container path and volume name.
Then, you configure volume with specific name.
Full documentation is available in Kubernetes API page.
Most of the time you want
persistentVolumeClaim (keep data on host machine, but let Podman figure out the details) or
hostPath (keep data on host machine, let me specify the host path).
In case of
hostPath, if you use SELinux, you should add
:Z at the end of container path.
You start both containers with
podman kube play ./wordpress_pod.yaml, and stop them with
podman kube down ./wordpress_pod.yaml.
If you want to remove MariaDB data, use
podman volume ls and
podman volume rm.