DOCKER 配置 YII2 + MSSQL

DOCKER Config YII2 + MSSQL

不幸的是,我无法让我的开发环境与 Docker 一起工作。到目前为止 Docker 启动,但我无法连接到 MSSQL 服务器。我使用 PHPStorm & OS X.15 SQL 服务器可以通过 Azure Data Studio 访问。

我的配置:

docker-compose.yml

version: '2'
services:
  php:
    image: tamuarchi/yii2-mssql:latest
    volumes:
      - ~/.composer-docker/cache:/root/.composer/cache:delegated
      - ./:/app:delegated
    ports:
      - '80:80'
    networks:
      - my-network
    environment:
      PHP_EXTENSION_XDEBUG: 1
      XDEBUG_CONFIG: remote_host=host.docker.internal

  memcached:
    container_name: memcached
    image: memcached:latest
    ports:
      - "0.0.0.0:11211:11211"
volumes:
  my-db:
networks:
  my-network:
    driver: bridge

SQL-服务器Docker

sudo docker pull mcr.microsoft.com/mssql/server:2017-latest

sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=SUPERPW" \
   -p 1433:1433 --name sql2017 \
   -d mcr.microsoft.com/mssql/server:2017-latest

db.php

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'sqlsrv:server=localhost;database=db_name;ConnectionPooling=0', //serveradresse
    'username' => 'sa',
    'password' => 'SUPERPW',
    'charset' => 'utf8',
    'enableSchemaCache' => true,

    // Duration of schema cache.
    'schemaCacheDuration' => 36000,

    // Name of the cache component used to store schema information
    'schemaCache' => 'cache',
];

错误:

PDOException: SQLSTATE[HYT00]: [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired in /app/vendor/yiisoft/yii2/db/Connection.php:703
Stack trace:
#0 /app/vendor/yiisoft/yii2/db/Connection.php(703): PDO->__construct('sqlsrv:server=1...', 'sa', 'SUPERPW', NULL)
#1 /app/vendor/yiisoft/yii2/db/Connection.php(624): yii\db\Connection->createPdoInstance()
#2 /app/vendor/yiisoft/yii2/db/Connection.php(1020): yii\db\Connection->open()
#3 /app/vendor/yiisoft/yii2/db/Connection.php(1007): yii\db\Connection->getMasterPdo()
#4 /app/vendor/yiisoft/yii2/db/Schema.php(462): yii\db\Connection->getSlavePdo()
#5 /app/vendor/yiisoft/yii2/db/Connection.php(899): yii\db\Schema->quoteValue('admin')
#6 /app/vendor/yiisoft/yii2/db/Command.php(211): yii\db\Connection->quoteValue('admin')
#7 /app/vendor/yiisoft/yii2/db/Command.php(1117): yii\db\Command->getRawSql()
#8 /app/vendor/yiisoft/yii2/db/Command.php(1138): yii\db\Command->logQuery('yii\db\Command:...')
#9 /app/vendor/yiisoft/yii2/db/Command.php(415): yii\db\Command->queryInternal('fetch', NULL)
#10 /app/vendor/yiisoft/yii2/db/Query.php(274): yii\db\Command->queryOne()
#11 /app/vendor/yiisoft/yii2/rbac/DbManager.php(243): yii\db\Query->one(Object(yii\db\Connection))
#12 /app/vendor/yiisoft/yii2/rbac/DbManager.php(200): yii\rbac\DbManager->getItem('admin')
#13 /app/vendor/yiisoft/yii2/rbac/DbManager.php(141): yii\rbac\DbManager->checkAccessRecursive(NULL, 'admin', Array, Array)
#14 /app/vendor/yiisoft/yii2/web/User.php(739): yii\rbac\DbManager->checkAccess(NULL, 'admin', Array)
#15 /app/views/layouts/header.php(38): yii\web\User->can('admin')
#16 /app/vendor/yiisoft/yii2/base/View.php(348): require('/app/views/layo...')
#17 /app/vendor/yiisoft/yii2/base/View.php(257): yii\base\View->renderPhpFile('/app/views/layo...', Array)
#18 /app/vendor/yiisoft/yii2/base/View.php(156): yii\base\View->renderFile('/app/views/layo...', Array, NULL)
#19 /app/views/layouts/main.php(51): yii\base\View->render('header.php', Array)
#20 /app/vendor/yiisoft/yii2/base/View.php(348): require('/app/views/layo...')
#21 /app/vendor/yiisoft/yii2/base/View.php(257): yii\base\View->renderPhpFile('/app/views/layo...', Array)
#22 /app/vendor/yiisoft/yii2/base/Controller.php(401): yii\base\View->renderFile('/app/views/layo...', Array, Object(app\controllers\SiteController))
#23 /app/vendor/yiisoft/yii2/base/Controller.php(387): yii\base\Controller->renderContent('<div class="sit...')
#24 /app/controllers/SiteController.php(71): yii\base\Controller->render('login', Array)
#25 [internal function]: app\controllers\SiteController->actionIndex()
#26 /app/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#27 /app/vendor/yiisoft/yii2/base/Controller.php(157): yii\base\InlineAction->runWithParams(Array)
#28 /app/vendor/yiisoft/yii2/base/Module.php(528): yii\base\Controller->runAction('', Array)
#29 /app/vendor/yiisoft/yii2/web/Application.php(103): yii\base\Module->runAction('', Array)
#30 /app/vendor/yiisoft/yii2/base/Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request))
#31 /app/web/index.php(12): yii\base\Application->run()
#32 {main}

有人对我有什么想法吗?

问题是您正在尝试连接到 PHP 容器中的 localhost。这里有多种可能的解决方案:

1 - 在 docker-compose.yml 中包含数据库服务并将 localhost 替换为 sql2017

2 - 将 my-network 设置为可附加的,附加网络中的容器并将 localhost 替换为 sql2017

3 - 将 localhost 替换为主机上的 docker ip(通常是 172.17.0.1。在 linux 上,您可以使用 [=18= 发现正确的地址])