Installing MySQL with Docker

Introduction

Docker runs MySQL in an isolated container with one command—same on Windows, macOS, and Linux. This chapter pulls the official mysql:8 image, starts a container with persistent data, connects from the host, and stops or resets cleanly without touching system services.

Prerequisites

Why Docker for Learning

BenefitDetail
Clean hostNo system MySQL service conflict if you choose different port
ReproducibleSame env vars → same database every time
Reset fastRemove container and volume to start over
Version pinningmysql:8.0.36 for exact matches

Pull the Image

bash
docker pull mysql:8
docker images | grep mysql

Run a MySQL Container

bash
docker run -d \
  --name mysql-learn \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=learnpass \
  -e MYSQL_DATABASE=learn_db \
  -e MYSQL_USER=learn_user \
  -e MYSQL_PASSWORD=learnpass \
  mysql:8
FlagMeaning
-dBackground (detached)
--name mysql-learnFriendly container name
-p 3306:3306Host port → container 3306
MYSQL_ROOT_PASSWORDRequired root password
MYSQL_DATABASEAuto-create database on first start
MYSQL_USER / MYSQL_PASSWORDExtra non-root user with grants on MYSQL_DATABASE

Code explanation:

  • Environment variables run only on first container initialization with empty data volume

Connect from Host

bash
mysql -h 127.0.0.1 -P 3306 -u learn_user -plearnpass learn_db

Or root:

bash
mysql -h 127.0.0.1 -u root -plearnpass
sql
SELECT DATABASE();
SHOW TABLES;
EXIT;

Warning

Password on Command Line

-plearnpass exposes password in shell history—fine for local learning; use config file or prompt in production scripts.

Persist Data with a Volume

Without a volume, removing container deletes data:

bash
docker run -d \
  --name mysql-learn \
  -p 3306:3306 \
  -v mysql_learn_data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=learnpass \
  -e MYSQL_DATABASE=learn_db \
  mysql:8

Code explanation:

  • mysql_learn_data named volume survives container delete

Daily Commands

bash
docker ps
docker logs mysql-learn
docker stop mysql-learn
docker start mysql-learn

Remove container (keep volume):

bash
docker rm -f mysql-learn

Remove container and volume (wipe data):

bash
docker rm -f mysql-learn
docker volume rm mysql_learn_data

Port Conflict with Native MySQL

If local MySQL uses 3306, map host port 3307:

bash
-p 3307:3306

Connect with -P 3307.

docker compose (Optional)

compose.yml snippet:

Run: docker compose up -d

FAQ

Container exits immediately?

Check docker logs mysql-learn—often missing MYSQL_ROOT_PASSWORD.

Cannot connect from app in another container?

Use service name db as host on same Docker network—not 127.0.0.1.

mysql client not on host?

Install client only, or: docker exec -it mysql-learn mysql -u root -p

ARM Mac image?

Official mysql:8 supports multi-arch.

JDBC connection string?

jdbc:mysql://127.0.0.1:3306/learn_db — see JDBC Docker chapter.

Production on Docker?

Valid with backups and resource limits—beyond this intro chapter.