Guide to Troubleshooting MySQL Remote Connection Issues in a Docker Environment

Guide to Troubleshooting MySQL Remote Connection Issues in a Docker Environment

Problem Description

A MySQL database running within a Docker container appears to be functioning correctly, with port 3306 mapped to the host machine. However, it is not possible to connect to the MySQL service from either the local machine or external networks.

Problem Analysis

This is typically a Docker network access permission issue. The error logs indicate that access attempts from the Docker default bridge IP (172.17.0.1) are being denied, suggesting that there might be a problem with the MySQL user permissions configuration.

Resolution Steps

1. Reset MySQL User Permissions

First, enter the MySQL container and reset the user permissions:

# Enter the MySQL container
docker exec -it your_mysql_container bash

# Connect to MySQL
mysql -u root -p

# Check current user permissions
SELECT user, host FROM mysql.user;

# Remove existing root user settings
DROP USER 'root'@'%';
DROP USER 'root'@'localhost';
DROP USER 'root'@'172.17.0.1';

# Recreate the root user and grant privileges
CREATE USER 'root'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

2. Verify MySQL Configuration

Ensure that the MySQL configuration allows remote connections:

# Execute inside the container
cat /etc/mysql/my.cnf
# Or
cat /etc/mysql/mysql.conf.d/mysqld.cnf

If you see bind-address = 127.0.0.1, change it to:

bind-address = 0.0.0.0

3. Restart the Container

docker restart your_mysql_container

4. Validate Connection

# Test connection from the host
mysql -h localhost -u root -p

# Test connection from a remote location
mysql -h your_server_ip -u root -p

Troubleshooting Checklist

If you still cannot connect, check the following:

1. Verify Docker Port Mapping

docker inspect your_mysql_container | grep -A 20 PortBindings

Ensure you see similar output:

"PortBindings": {
    "3306/tcp": [
        {
            "HostIp": "0.0.0.0",
            "HostPort": "3306"
        }
    ]
}

2. Check Firewall Settings

sudo ufw status

Ensure port 3306 is open:

sudo ufw allow 3306

Precautions

  1. For security reasons, avoid using the root user for remote connections.
  2. It’s recommended to limit access to specific IP addresses instead of using ‘%’.
  3. In production environments, enforce a stronger password policy.
  4. Consider using SSL/TLS for encrypted connections.

Summary

Remote connection issues with MySQL usually involve multiple aspects: user permissions, network configuration, firewall settings, etc. By systematically troubleshooting and configuring, you can gradually identify and resolve the problem. While solving the problem, pay attention to maintaining system security.

Comments

Popular posts from this blog

How to turn off Sass warning prompts in Nuxt.js projects

Guide to Modifying Docker Container Port Mappings

Optimizing Class Name Management with CSS Attribute Selector