Docker составляют контейнеры связи - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть 7 docker контейнеров, а именно

  1. es_search
  2. postgres_db
  3. fusionauth
  4. mysql_db
  5. auth
  6. backend
  7. ui

Связь между контейнерами должна быть такой, как показано ниже

  • fusionauth должна быть в состоянии contact es_search, postgres_db
  • backend должен иметь возможность связаться с auth, mysql_db
  • auth должен иметь возможность связаться с fusionauth, backend
  • пользовательский интерфейс должен иметь возможность связаться с бэкэндом, аутентификация

Существующий docker -композит

version: '3.1'

services:
 postgres_db:
   container_name: postgres_db
   image: postgres:9.6
   environment:
     PGDATA: /var/lib/postgresql/data/pgdata
     POSTGRES_USER: ${POSTGRES_USER}
     POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
   ports:
     - ${POSTGRES_PORT}:5432
   networks:
     - postgres_db
   restart: unless-stopped
   volumes:
     - db_data:/var/lib/postgresql/data_test

 es_search:
   image: docker.elastic.co/elasticsearch/elasticsearch:6.3.1
   container_name: es_search
   environment:
     - cluster.name=fusionauth
     - bootstrap.memory_lock=true
     - "ES_JAVA_OPTS=${ES_JAVA_OPTS}"
   ports:
     - ${ES1_PORT}:9200
     - ${ES_PORT}:9300
   networks:
     - es_search
   restart: unless-stopped
   ulimits:
     memlock:
       soft: -1
       hard: -1
   volumes:
     - es_data:/usr/share/elasticsearch/data

 fusionauth:
   image: fusionauth/fusionauth-app:latest
   container_name: fusionauth
   depends_on:
     - postgres_db
     - es_search
   environment:
     DATABASE_URL: jdbc:postgresql://postgres_db:5432/fusionauth
     DATABASE_ROOT_USER: ${POSTGRES_USER}
     DATABASE_ROOT_PASSWORD: ${POSTGRES_PASSWORD}
     DATABASE_USER: ${DATABASE_USER}
     DATABASE_PASSWORD: ${DATABASE_PASSWORD}
     FUSIONAUTH_MEMORY: ${FUSIONAUTH_MEMORY}
     FUSIONAUTH_SEARCH_SERVERS: http://es_search:9200
     FUSIONAUTH_URL: http://fusionauth:9010
   networks:
    - postgres_db
    - es_search
   restart: unless-stopped
   ports:
     - ${FUSIONAUTH_PORT}:9011
   volumes:
     - fa_config:/usr/local/fusionauth/config

 db:
   container_name: db
   image: mysql:5.7
   volumes:
     - /etc/nudjur/mysql_data:/var/lib/mysql
   environment:
     - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
     - MYSQL_USER=${MYSQL_USER}
   ports:
     - ${MYSQL_PORT}:3306
   command: --default-authentication-plugin=mysql_native_password
   restart: on-failure

 backend:
   container_name: backend
   links:
     - db:${MYSQL_HOST}
   depends_on:
     - db
   image: ${BACKEND_IMAGE}
   volumes:
     - ${ENV_FILE}:/backend/.env
   ports:
     - ${BACKEND_PORT}:${BACKEND_PORT}
   command: >
     bash -c "set -a && source .env && set +a"
   restart: unless-stopped

 UI: 
   container_name: UI
   image: ${UI_IMAGE}
   volumes:
     - ${ENV_FILE}:/nudjur/.env
   ports:
     - ${UI_PORT}:${UI_PORT}
   command: >
     bash -c "PORT=${UI_PORT} npm start"
   restart: unless-stopped

 auth:
   container_name: auth
   network_mode: host
   image: ${AUTH_IMAGE}
   volumes:
     - ${ENV_FILE}:/auth/.env
   ports:
     - ${AUTH_PORT}:${AUTH_PORT}
   command: >
     bash -c "set -a && source .env && set +a && python3 ./auth_bridge.py --log-level DEBUG run -p ${AUTH_PORT}"
   restart: unless-stopped

networks:
 postgres_db:
   driver: bridge
 es_search:
   driver: bridge

volumes:
 db_data:
 es_data:
 fa_config:


Я не совсем понимаю, как установить sh общение между ними.

Может кто-нибудь помочь мне с этим?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Я понимаю, что вы хотите ограничить обмен данными, чтобы контейнеры могли взаимодействовать только с другими службами, такими как:

  • fusionauth должен иметь возможность связаться с es_search, postgres_db
  • backend должен иметь возможность связаться с auth, mysql_db
  • auth должен иметь возможность связаться с fusionauth, backend
  • ui должен иметь возможность связаться с backend, auth

Вы можете использовать networks, как вы уже частично сделали это в своем примере, чтобы включить связь, такую ​​как:

  • сервисы в одной сети могут достигать друг друга используя имя службы или псевдоним - то есть es_search могут быть достигнуты другими службами в той же сети через http://es_search:9200
  • службы в другой сети изолированы и не могут связываться друг с другом

Затем вы можете определить свои сети, например:

services:

 postgres_db:
   networks:
     - postgres_db

 es_search:
   networks:
     - es_search

  # fusionauth should be able to contact es_search, postgres_db
  fusionauth:
    networks:
     - fusionauth
     - postgres_db
     - es_search

  db:
    networks:
    - mysql_db

  # backend should be able to contact auth, mysql_db
  backend:
    networks:
    - backend
    - auth
    - mysql_db

  # ui should be able to contact backend, auth
  UI: 
    networks:
    - backend
    - auth

  # auth should be able to contact fusionauth, backend
  auth:
    networks:
    - auth
    - fusionauth
    - backend


networks:
  fusionauth:
  backend:
  auth:
  postgres_db:
  es_search:
  mysql_db:

Где все службы (кроме ui) имеют свою собственную сеть, а другая служба должна находиться в сети этой службы общаться с этим.

Примечание. Я не использовал link, поскольку он является устаревшим и может быть удален в будущих выпусках, как указано в документации.

1 голос
/ 16 апреля 2020

Удалить все последние опции networks: и container_name: из файла docker-compose.yml. network_mode: host, поскольку у вас есть контейнер auth, несовместим с сетевым взаимодействием Docker и, как правило, представляется в качестве обходного пути для проблем публикации портов; удалите это тоже. Возможно, вы захотите, чтобы имя ui: также было в нижнем регистре.

Когда вы сделаете это, Docker Compose создаст одну сеть с именем default и присоединит к ней все создаваемые контейнеры. сеть. Все они будут доступны по их служебным именам. Networking in Compose в документации Docker описывает это более подробно.

Ваш контейнер fusionauth имеет правильную базовую настройку c. Обрезка некоторых опций:

fusionauth:
   image: fusionauth/fusionauth-app:latest
   depends_on:
     - postgres_db
     - es_search
   environment:
     # vvv These host names are other Compose service names
     # vvv and default Compose networking makes them reachable
     DATABASE_URL: jdbc:postgresql://postgres_db:5432/fusionauth
     DATABASE_ET: CETERA
     FUSIONAUTH_SEARCH_SERVERS: http://es_search:9200
     FUSIONAUTH_URL: http://fusionauth:9010
   restart: unless-stopped
   ports:
     - ${FUSIONAUTH_PORT}:9011
   volumes:
     - fa_config:/usr/local/fusionauth/config
   # no networks: or container_name:

Если контейнер ui представляет что-то вроде React или Angular front-end, помните, что приложение запускается в браузере, а не в Docker, и поэтому придется обратиться к DNS-имени или IP-адресу физической системы и опубликовать ports:. Обычно в эту настройку вводится nginx обратный прокси-сервер, который обслуживает как код пользовательского интерфейса, так и интерфейс REST, с которым он должен взаимодействовать.

В принципе, вы можете настроить его с несколькими сетями для более ограниченного обмена другие ответы сделали. Это может помешать ui связаться с postgres_db. Я был бы немного удивлен, увидев среду, где требуется такой уровень контроля, а также где Compose является подходящим решением для развертывания.

Также ненужным и часто встречающимся в других вопросах, подобных этому, являются hostname: (задает только собственные понятия контейнеров для собственных имен хостов), links: (только для предварительной сети Docker) и expose: (аналогично).

0 голосов
/ 16 апреля 2020

из вашего docker -compose.yml.

postgres_db:
   ..
   networks:
   - postgres_db_net

fusionauth:
   ..
   environment:
     DATABASE_URL: jdbc:postgresql://postgres_db:5432/fusionauth
   networks:
   - postgres_db_net
  • Службы postgres_db и fusionauth подключены к сети postgres_db-net, что позволяет им связываться друг с другом
  • связь происходит с использованием имени службы, которое также работает как имя узла внутри контейнера. служба fusionauth знает базу данных по ее имени postgres_db в DATABASE_URL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...