Как подключиться к сервисам, работающим в другом стеке докеров?
Могут ли службы, работающие в двух разных док-стеках, обмениваться данными?
Это то, что я пытался и не смог добиться этого.
- Создал стек (stack1) под управлением nginx, а php-fpm работает отлично.
- Создан еще один стек (stack2) с запущенной базой данных mysql.
- Теперь я хочу, чтобы служба stack1 могла взаимодействовать со stack2 так, чтобы она могла обращаться к службе базы данных.
Я подумал, что это может помочь и создал внешнюю сеть и пытается добавить к ней службу в stack1 и stack2, чтобы они тоже могли общаться друг с другом.
Mystack1 docker-compose file
version: "3.4"
networks:
apps-net:
db-net:
external:
name: db-net
services:
web:
image: nginx:latest
ports:
- "9080:80"
volumes:
- ./code:/code
- ./site.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
networks:
- apps-net
- db-net
deploy:
mode: replicated
replicas: 1
php:
image: php:7-fpm
volumes:
- ./code:/code
networks:
- apps-net
- db-net
deploy:
mode: replicated
replicas: 1
МОЙ стек 2 docker-compose файл
version: '3.3'
networks:
db-net:
external:
name: db-net
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: root
MYSQL_PASSWORD: password
networks:
- db-net
volumes:
db_data:
Я создал сеть роя с docker network create db-net
команда
ВЫХОД:
Nginx и php работают нормально, но я добавил коды соединения с базой данных в index.php, что привело к сообщению об ошибке. Ошибка, потому что они не подключены? Я также установил расширения php-mysql, но в нем есть ошибка. Как я могу убедиться, что сервисы успешно общаются.
nginx and php working
Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /code/index.php:11 Stack trace: #0 {main} thrown in /code/index.php on line 11
1 ответ
Вместо сетей (которые я часто вижу в стеке как не работающие, как ожидалось) попробуйте использовать external_links
что хорошо объяснено здесь.
Попробуйте удалить все пользовательские конфигурации сети и просто измените свой файл приложения, например:
version: "3.4"
# removed all custom networks configuration
services:
web:
image: nginx:latest
external_links:
- mysql_1:mysql
[..]
php:
image: php:7-fpm
external_links:
- mysql_1:mysql
[..]
где mysql_1
фактическое имя контейнера, созданное вашим последним файлом, и mysql
это псевдоним, по которому ваш сервис будет доступен внутри php
а также web
контейнеры
Ссылки являются устаревшим вариантом в v3, и Docker предлагает вместо этого использовать сети.Я опубликую правку о развертывании роя, поскольку подход будет совершенно другим, потому что Docker игнорирует ссылки при развертывании роя.