Muhammad Yasir Amin

Loading websiteโ€ฆ

More from Muhammad Yasir Amin

Build Along With Me

Practical walkthroughs on Laravel, React, APIs and deployment workflows.

Subscribe on YouTube

Laravel Docker: Install phpMyAdmin with a MySQL Database

๐Ÿ› ๏ธ Laravel Tutorials4 min read

Laravel Docker: Install phpMyAdmin with a MySQL Database

Muhammad Yasir Amin

Muhammad Yasir Amin

Senior Full Stack Engineerโ€ขNov 6, 2026
Laravel Docker: Install phpMyAdmin with a MySQL Database

To add phpMyAdmin to a Laravel Docker setup, add a phpmyadmin service to your docker-compose.yml that uses the official phpmyadmin image, point it at your MySQL service with PMA_HOST, publish a local port such as 8080, and start the stack. You can then open http://localhost:8080 and browse your Laravel tables. This guide shows the full compose file and how to keep it safe.

phpMyAdmin is a web interface for MySQL and MariaDB. In development it saves you from typing SQL for quick checks of migrations, seeders and queued job tables.

What do I need before I start?

  • Docker and Docker Compose installed.
  • A Laravel 13 project (PHP 8.3 or newer) already running in containers with a MySQL service. If you do not have that yet, start from a compose file with an app service and a mysql service.
  • The database credentials your Laravel .env uses.

Step 1: What does the compose file look like?

Here is a minimal file with a database and phpMyAdmin. Your PHP service stays as it is; it is left out to keep the example short.

YAML
services:
  db:
    image: mysql:8.4
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: root-secret
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app

  phpmyadmin:
    image: phpmyadmin:latest
    depends_on:
      - db
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
    ports:
      - "8080:80"
    networks:
      - app

volumes:
  db_data:

networks:
  app:

I have not started these containers for this article, so verify the image tags you pick against the current tags on Docker Hub. Pinning a specific version is safer than latest.

PMA_HOST is the service name of the database. Containers on the same Compose network reach each other by service name, so you never use localhost inside a container to reach another container.

Step 2: How do I start it?

Code
docker compose up -d
docker compose ps

Open http://localhost:8080. Sign in with the MYSQL_USER and MYSQL_PASSWORD from the compose file. You should see the laravel database.

Step 3: How do I make Laravel use the same database?

In Laravel's .env, the host must be the compose service name:

Code
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

Then run migrations inside the app container:

Code
docker compose exec app php artisan migrate

Refresh phpMyAdmin and the new tables appear. Replace app with the name of your PHP service.

Can I log in without typing credentials?

The image also supports setting a user and password so the login form is skipped. That is convenient on a laptop but unsafe on any server, because anyone who can reach the port gets full access. Keep the login form.

How do I upload large SQL files?

Import is limited by PHP's upload limits. The image supports an UPLOAD_LIMIT environment variable. Add it under the phpmyadmin service, for example UPLOAD_LIMIT: 128M, then recreate the container.

How do I keep phpMyAdmin safe?

  • Use it for local development only. Do not publish port 8080 on a production server.
  • If you must reach it on a remote host, bind it to localhost with "127.0.0.1:8080:80" and use an SSH tunnel.
  • Never use the MySQL root account for day-to-day browsing. Use the app user.
  • Do not commit real passwords. Move them to a .env file used by Compose.
  • Stop it when you are not using it: docker compose stop phpmyadmin.

What are the common mistakes?

  • Using localhost as PMA_HOST. Inside the container that is phpMyAdmin itself. Use the service name.
  • Port already in use. If 8080 is taken, change the left side, for example "8081:80".
  • Connecting before MySQL is ready. The first start initialises the data directory and can take a few seconds. Wait and refresh.
  • Changing the password after the first run. MySQL only applies MYSQL_PASSWORD when it creates the volume. Remove the volume with docker compose down -v (this deletes data) or change it inside MySQL.
  • Different networks. If the services are not on the same network, the name does not resolve.

How do I verify the setup?

  1. docker compose ps shows db and phpmyadmin running.
  2. The login page loads at port 8080.
  3. After php artisan migrate, the migrations and users tables are listed.

FAQ

Is phpMyAdmin or Adminer better for Laravel Docker?

phpMyAdmin has more MySQL features. Adminer is a single lightweight page that also supports PostgreSQL and SQLite. Pick the one that matches your databases.

Does phpMyAdmin work with MariaDB?

Yes. Point PMA_HOST at the MariaDB service.

Why can I log in but see no Laravel tables?

You have not run migrations yet, or Laravel points at a different database. Check DB_DATABASE and run php artisan migrate.

References

Article Index & Topic Tags
DockerLaravelMysqlPhpmyadmin

YouTube Channel

Build Along With Me

Practical walkthroughs on Laravel, React, APIs and deployment workflows.

Muhammad Yasir Amin
Available for Contracts
Author & Solutions Architect

Senior Full Stack Engineer

Independent Senior Full Stack Engineer working on Laravel, React and Next.js applications, APIs and delivery workflows.

Laravel & PHP ApplicationsReact & Next.js InterfacesREST APIs & IntegrationsDatabase Queries & DebuggingDocker Development WorkflowsClear Scope & Handover
Discuss Your Next Step

What Does Your Application Need Next?

Share your current system, the problem you want to solve and what a useful result looks like. We can identify the right starting point and agree on a practical scope.

Technical Audit

Find the Next Useful Fix

Application Development

Scoped, Reviewable Milestones

Ongoing Support

Agreed Capacity and Priorities

Share your goals, current stack and requirements before the call.