Подключение к базе данных из другого контейнера

#docker #docker-compose

#docker #docker-создать

Вопрос:

Пожалуйста, помогите мне, если это возможно.

Мне нужно запустить 2 приложения с одной базой данных.

У меня есть 2 приложения. Первый domain.com , 2-й api.domain.com . У каждого приложения есть docker-compose.файлы yaml.

domain.com — CMS

 version: "3.8"

services:
  web:
    container_name: domain_web
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    working_dir: /var/www/html
    #command: composer install
    volumes:
      - ./:/var/www/html
      - ./docker/php/app.conf:/etc/apache2/sites-available/000-default.conf
      - ./docker/php/hosts:/etc/hosts
    networks:
      domain:
        ipv4_address: 10.9.0.5

networks:
  domain:
    driver: bridge
    ipam:
      config:
        - subnet: 10.9.0.0/16
          gateway: 10.9.

volumes:
  bel_baza:
  

api.domain.com — Laravel 5.6

 version: "3.8"

services:
  web:
    container_name: api_domain_web
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    working_dir: /var/www/html
#    command: composer install
    volumes:
      - ./:/var/www/html
      - ./docker/php/app.conf:/etc/apache2/sites-available/000-default.conf
      - ./docker/php/hosts:/etc/hosts
    networks:
      api_domain:
        ipv4_address: 10.15.0.5
  db:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    container_name: api_domain_db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: domain
      MYSQL_USER: user
      MYSQL_PASSWORD: user

    volumes:
      - api_domain_baza:/var/lib/mysql
      - ./docker/db:/docker-entrypoint-initdb.d

    networks:
      api_domain:
        ipv4_address: 10.15.0.6

  phpmyadmin:
    image: phpmyadmin
    restart: always
    container_name: api_domain_pma
    networks:
      api_domain:
        ipv4_address: 10.15.0.7
  redis:
    image: redis:3.0
    container_name: api_domain_redis
    networks:
     api_domain:
        ipv4_address: 10.15.0.10
networks:
  api_domain:
    driver: bridge
    ipam:
      config:
        - subnet: 10.15.0.0/16
          gateway: 10.15.0.1

volumes:
  api_domain_baza:
  

api_domain успешно запущен.

Мне нужно подключиться domain.com с базой api_domain_db данных . Для подключения хоста я использовал IP-адрес 10.15.0.6. Первое приложение не подключено к базе данных из 2-го приложения.

В чем моя проблема?

Как я могу подключиться domain.com с базой данных 2-го приложения?

Ответ №1:

ваша проблема в том, что вы используете отдельные приложения docker compose для каждого приложения. И по умолчанию эти приложения не могут получить доступ к внутренним частям друг друга:

 By default Compose sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.
  

документ здесь — https://docs.docker.com/compose/networking /

Таким образом, это похоже на то, что он создает отдельную сеть для каждой компоновки docker.

  1. если вы хотите, чтобы они оба видели внутреннюю часть друг друга, вы можете создать внешнюю сеть docker следующим образом:
 docker network create --subnet 10.1.0.0/24 network_name
  
  1. а затем используйте эту сеть в обоих docker compose следующим образом:
 networks:
  default:
    external:
      name: network_name
services:
.....
  
  1. если вам нужны фиксированные IP-адреса, вы можете определить их как
    app:
    image: ...
    networks:
      default:
        ipv4_address: 10.1.0.10