Как подключиться к сервисам, работающим в другом стеке докеров?

Могут ли службы, работающие в двух разных док-стеках, обмениваться данными?

Это то, что я пытался и не смог добиться этого.

  1. Создал стек (stack1) под управлением nginx, а php-fpm работает отлично.
  2. Создан еще один стек (stack2) с запущенной базой данных mysql.
  3. Теперь я хочу, чтобы служба 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 игнорирует ссылки при развертывании роя.

Другие вопросы по тегам