How to configure mariadb docker-compose file to use other port than 3306?

15,902

Solution 1

You need to replace the default my.cnf to specify a custom port for MariaDB/MySQL:

cd /where/your/docker-compose.yml/located

docker run -it mariadb cat /etc/mysql/my.cnf > my.cnf

# use any text editor your like to open my.cnf, search for "port = 3306"
# and replace it to the port you like to have.

Configure your docker-compose.yml like this:

version: '3.1'

services:

  db:
    image: mariadb
    restart: always
    volumes:
    - type: bind
      source: ./my.cnf
      target: /etc/mysql/my.cnf
    environment:
    - MYSQL_ROOT_PASSWORD=mypassword
    # add your other configurations here

Solution 2

The container image is statically bound to :3306. If you wish to change this, you'll need to build a new image and configure the database to run elsewhere.

However, Docker permits you to map (publish) this as a different port :33020.

The correct way to do this is to:

  • docker-compose MYSQL_TCP_PORT=3306
  • docker-compose ports: - "33020:3306"
  • Dockerfile EXPOSE 3306 (unchanged)

Containers (internally) will correctly reference :3306 but externally (from the host) the database will be exposed on :33020.

NB Within docker-compose (network), other containers must continue to reference the database on port :3306.

Share:
15,902
Software
Author by

Software

Updated on June 04, 2022

Comments

  • Software
    Software almost 2 years

    I cannot get mariadb to use another port other than 3306 when running it in a docker container using a docker-compose file.

    I have already read the mariadb/docker documentation, searched online and conducted my own experiments.

    1. docker-compose file:
    version: '3.1'
    
    services:
    
      db:
        image: mariadb
        restart: always
        environment:
        - MYSQL_ROOT_PASSWORD=mypassword
        - MYSQL_TCP_PORT=33030
        - MYSQL_UNIX_PORT=33020
        ports:
        - "33020:33020"
    
    1. Dockerfile:
    FROM: mariadb: 10.3.14
    COPY mydbscript.sql /docker-entrypoint-initdb.d/
    EXPOSE 33020
    CMD ["mysqld"]
    

    It never uses port 33020. It still uses port 3306. How can I pass the port dynamically via the docker-compose file at run-time?