Я использую Zend Framework 2 и MongoDB v3.2.11.
Когда я запускаю свое приложение ZF, получаю следующую ошибку:
Fatal error: Uncaught MongoDB\Driver\Exception\ConnectionTimeoutException: No suitable servers found (
serverSelectionTryOnceset) in /var/www/project/vendor/mongodb/mongodb/src/Collection.php on line 360
Вот мой docker-compose:
mongodb:
image: mongo:3.2.11
restart: always
container_name: mongodb
environment:
- MONGO_DATA_DIR=/data/project
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=mongopassword
volumes:
- mongodb-data:/data/project
ports:
- "27017:27017"
command: mongod --smallfiles
Вот моя конфигурация ZF:
'caches' => [
'Project\Web\Cache\Sessions' => [
'template' => 'mongodb',
'adapter' => [
'name' => 'Project\Common\Cache\Storage\Adapter\MongoDb',
'options' => [
'server' => getenv('ZF_MONGO_HOST'),
'connection_options' => [
'connect' => true,
'connectTimeoutMS' => 5000,
'fsync' => true,
'readPreference' => 'primaryPreferred',
'replicaSet' => 'set-1',
],
'database' => getenv('ZF_MONGO_DATABASE_NAME'),
'collection' => 'sessions',
'ttl' => 3600,
],
],
],
],
Вот мой docker-compose.env:
## MONGO DB ##
ZF_MONGO_HOST=mongodb://my_user:mymongopassword@mongodb/my_db
ZF_MONGO_DATABASE_NAME=my_db
Что я пробовал:
* Когда подключаюсь к mongodb, работает
* Я проверил учетные данные пользователя: работает
* Когда я меняю ZF_MONGO_HOST, я получаю ту же ошибку, но в скобках я вижу, что он не может подключиться к - неправильному - URL. Итак, все в порядке.
* Поиск в Google в течение ~ 3 часов: все ошибки связаны с офлайн-серверами mongodb ...
Любые идеи?
Обновлять:
Я опробовал изображение битнами, выполнив следующие настройки:
mongodb:
image: bitnami/mongodb:3.6.8
restart: always
container_name: mongodb
environment:
- MONGODB_USERNAME=my_user
- MONGODB_PASSWORD=mymongopassword
- MONGODB_DATABASE=my_db
volumes:
- mongodb-data:/data/db-bitnami
ports:
- "27017:27017"
Та же ошибка.






После докера docker-compose up подключитесь к базе данных MongoDB и введите rs.status(), и в нем должно быть поле member, указывающее, что это ведомое устройство. если он не установлен, вам нужно определить его в mongodb:
rs.initiate( {
_id : "set-1",
members: [
{ _id: 0, host: "mongodb0.example.net:27017" },
{ _id: 1, host: "mongodb1.example.net:27017" },
{ _id: 2, host: "mongodb2.example.net:27017" }
]
})
после этого шага ваш mongodb был скопирован и готов к использованию. для автоматизации второй части этого (config mongodb) вы можете написать сценарий bash, который работает как Entrypoint в файле docker-compose, или использовать реплицированные образы докеров, такие как битнами.
@Ron необходимо указать имя набора реплик MONGODB_REPLICA_SET_MODE=primary
Ок, отлично. Теперь я снова получаю свою "обычную" ошибку: ConnectionTimeoutException: No suitable servers found ('serverSelectionTryOnce' set)
@Ron Я не знаю о PHP, но какова ваша строка подключения MongoDB в env?
ZF_MONGO_HOST=mongodb://my_user:mymongopassword@mongodb:27017/my_db@Ron, по-видимому, хост mongodb плохо определен в системе, но вы можете подключить его напрямую по IP-адресу. получить ip с docker inspect mongodb | grep ip и использовать его вместо имени хоста.
Извините, ничего не меняет ... Действительно странно. Дальнейшие идеи?
Здорово! Некоторый прогресс! Я добавил localhost: 27017, когда я пытаюсь добавить mongodb: 27017 (это мое сетевое имя в docker-compose), я получаю сообщение об ошибке. Когда я опускаю mongodb, я получаю в php ошибку
connection refused calling ismaster on 'localhost:27017'. Любые идеи?