programing

PHP 응용 프로그램이 도커 작성을 사용하여 MariaDB에 연결할 수 없습니다.

goodsources 2022. 11. 29. 21:49
반응형

PHP 응용 프로그램이 도커 작성을 사용하여 MariaDB에 연결할 수 없습니다.

내 응용 프로그램은 Docker Compose를 사용하여 설정되었습니다.docker-compose.yml 콘텐츠

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

다만, 애플리케이션의 데이타베이스에 접속하려고 하면, 에러 메세지가 표시됩니다.SQLSTATE[HY000] [2002] No such file or directory.

단, 올바른 사용자 이름과 비밀번호를 사용하여 로컬호스트 포트 3307에 접속할 수 있습니다.또한 컨테이너에 접속할 때docker exec -ti phpapp /bin/bash실행하다env열거된 환경변수가 모두 맞았습니다.

실행할 때docker network inspect nginx-proxy알겠습니다.

[
  {
    "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": {}
  }
]

컨테이너 배열은 비어 있지만 docker-compose.yml에서 기본(외부) 네트워크가 설정되어 있습니다.

stackoverflow에 오신 것을 환영합니다:)

아마도 phpapp 컨테이너에서 링크되지 않은 db 컨테이너에서는 동작하지 않는 것 같습니다.이렇게 해주시면 안 돼요?

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

db를 depends_on에서 링크로 이동했습니다.데이터베이스 연결에서 호스트 이름으로 db를 사용해야 합니다.

내가 도울 수 있으면 좋겠다.

음, 이 문제에 대한 해결책을 찾았어요.하지만, 그것은 내가 예상했던 것이 아니다.데이터베이스 URL은 다음과 같이 정의됩니다.

DATABASE_URL="mysql://dbuser:dbpass@db/dbname"

다음과 같이 따옴표가 없어야 합니다.

DATABASE_URL=mysql://dbuser:dbpass@db/dbname

이제 모든 것이 작동하는 것 같습니다. 언제 왜 인용문을 사용할 수 있고 사용할 수 없는지 아는 사람이 있습니까?

언급URL : https://stackoverflow.com/questions/53738437/php-application-cant-connect-to-mariadb-using-docker-compose

반응형