Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP application can't connect to MariaDB using Docker Compose

My application is set up using Docker Compose. My docker-compose.yml contents;

version: "3.1"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
  db:
    image: mariadb:10.4
    restart: always
    ports:
      - "3307:3306"
    volumes:
      - ./mysql:/var/lib/mysql
    container_name: mariadb
    environment:
      - MYSQL_DATABASE=dbname
      - MYSQL_PASSWORD=dbpass
      - MYSQL_RANDOM_ROOT_PASSWORD=yes
      - MYSQL_USER=dbuser
  phpapp:
    depends_on:
      - nginx-proxy
      - db
    image: myhub/myrepo
    restart: always
    container_name: phpapp
    expose:
      - 80
      - 443
    environment:
      - APP_ENV=prod
      - APP_SECRET="secret"
      - CORS_ALLOW_ORIGIN="^.*?$$"
      - DATABASE_URL="mysql://dbuser:dbpass@db/dbname"
      - VIRTUAL_HOST=phpapp.com
networks:
  default:
    external:
      name: nginx-proxy

However, when I try to connect to the database in the application I get an error message; SQLSTATE[HY000] [2002] No such file or directory.

I can, however, connect on port 3307 on my localhost with the correct username and password. Also, when I access the container using docker exec -ti phpapp /bin/bash and run env I get all the environment variables listed and they are correct.

When I execute docker network inspect nginx-proxy I get;

[
  {
    "Name": "nginx-proxy",
    "Id": "2529933d7e38cfba34e0e876e43a96fc4c8d7321c1e89048319ba804b00e1026",
    "Created": "2018-12-12T05:04:01.9044879Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
      {
        "Subnet": "172.18.0.0/16",
        "Gateway": "172.18.0.1"
      }
      ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
      "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {},
    "Options": {},
    "Labels": {}
  }
]

The containers array is empty, however a default (external) network is set in the docker-compose.yml.

like image 998
user10779576 Avatar asked Mar 05 '26 15:03

user10779576


1 Answers

Welcome to stackoverflow :)

I think maybe it is not working for db container not linked from phpapp container. Can you try like this?

version: "3.1"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
  db:
    image: mariadb:10.4
    restart: always
    ports:
      - "3307:3306"
    volumes:
      - ./mysql:/var/lib/mysql
    container_name: mariadb
    environment:
      - MYSQL_DATABASE=dbname
      - MYSQL_PASSWORD=dbpass
      - MYSQL_RANDOM_ROOT_PASSWORD=yes
      - MYSQL_USER=dbuser
  phpapp:
    depends_on:
      - nginx-proxy
    links:
      - db
    image: myhub/myrepo
    restart: always
    container_name: phpapp
    expose:
      - 80
      - 443
    environment:
      - APP_ENV=prod
      - APP_SECRET="secret"
      - CORS_ALLOW_ORIGIN="^.*?$$"
      - DATABASE_URL="mysql://dbuser:dbpass@db/dbname"
      - VIRTUAL_HOST=phpapp.com
networks:
  default:
    external:
      name: nginx-proxy

I moved db from depends_on to links. You must use db for hostname in database connection now.

I hope i could help.

like image 122
Emircan Ok Avatar answered Mar 08 '26 05:03

Emircan Ok



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!