mysql - 将数据库附加到 Web 容器时,Docker 数据库连接拒绝错误

标签 mysql docker laravel-5 docker-compose

我是 Docker 新手,正在尝试对我的 Laravel 应用程序进行 docker 化(版本 5.1)

以下是我的 docker-compose.yml

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
    ports:
      - "3307:3306/tcp"
    volumes:
      - test_db:/var/lib/test_db/data
  web:
    build:
      context: ../
      dockerfile: deploy/Dockerfile
      args:
        APP_ENV: "local"
    environment:
      APP_DEBUG: "true"   
      DB_HOST: "db"
      DB_DATABASE: "test"
      DB_USERNAME: "root"
      DB_PASSWORD: "root"      
    ports:
      - "443:8000/tcp"
    volumes:
      - ../:/var/www/html
    links:
      - db
    depends_on:
      - db     
    restart: on-failure:10
    container_name: test_web 
volumes:
  test_db:  

当我执行docker-compose up命令时,出现以下错误

[PDOException]                             
test_web |   SQLSTATE[HY000] [2002] Connection refused

由于我设置了 10 次重试,因此它最终会连接并执行迁移,但我遇到以下问题:

  • 为什么连接没有立即建立或在几次重试后建立?
  • 我正在使用命名卷,但数据似乎没有持久化。每次我运行 docker-compose up 时,都会执行迁移并覆盖数据

请告诉我上述两个问题背后可能存在哪些问题

最佳答案

数据库启动总是很慢。

depends_on: 是一种影响 start 顺序的方法。

一种解决方案是修改 dockerfile 中的 CMD ,以等待某个条件。

我使用nc(又名netcat)来测试db的端口3306是否已准备好。

sleep 7200 替换为启动命令

CMD ["/bin/sh","-c", \
 "( while ( ! nc -z db 3306 >/dev/null 2>&1 ) ; do \
       date ; sleep 4 ; \
    done ;  \
    sleep 7200 ;  ) " ]

关于mysql - 将数据库附加到 Web 容器时,Docker 数据库连接拒绝错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58877172/

相关文章:

php - 在 Laravel 5 中间件中操作 JSON

php - 如何在生产服务器中配置 Laravel 5.2.41(Redhat 7 with Apache 和 Mysql)

python - Django ManyToManyField 是否创建具有冗余索引的表?

docker - Kubernetes证书管理器证书生成错误

php - 使用子数组中的值将多维数组转换为单维数组

java - 无法在 Docker 中部署的 Jenkins 中安装插件

plugins - 在 Docker 中安装 Jenkins 插件 (mercurial) 显示在插件文件夹中,但不在 Jenkins 本身中

javascript - 如何在laravel之类的vue js中使用组路由?

sql - 需要您在创建表格时提供意见

mysql只导入缺失的行