PHP应用程序无法使用Docker Compose连接到MariaDB

时间:2018-12-12 07:57:28

标签: php docker docker-compose 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中设置了默认(外部)网络。

2 个答案:

答案 0 :(得分:2)

欢迎来到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作为主机名。

希望我能帮上忙。

答案 1 :(得分:0)

好吧,我已经找到了解决此问题的方法。但是,这不是我所期望的。数据库URL定义为:

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

应该没有引号,例如:

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

现在一切似乎都正常了,有人知道何时,为什么可以使用引号,不能使用引号?