docker-compose, как совместно использовать том

#docker #elasticsearch #docker-compose

#docker #elasticsearch #docker-compose

Вопрос:

Я пытаюсь воспроизвести https://www.elastic.co/&uide/en/elasticsearch/reference/7.x/confi&urin&-tls-docker.html

В примере показано, как включить ssl для кластера ES с помощью docker. он запускает экземпляры на одном компьютере

Я запускаю контейнер docker на нескольких хостах и у меня возникают проблемы с совместным использованием тома для сертификата

соответствующие части

// создайте файлы сертификации и сохраните в certs томе // create-certs.yml

  services:
   create_certs:
     ima&e: docker.elastic.co/elasticsearch/elasticsearch:${VERSION}
     container_name: create_certs
     command: &&t;
       bash -c '
         yum install -y -q -e 0 unzip;
         if [[ ! -f /certs/bundle.zip ]]; then
           bin/elasticsearch-certutil cert --silent --pem --in confi&/certificates/instances.yml -out /certs/bundle.zip;
           unzip /certs/bundle.zip -d /certs;
         fi;
         chown -R 1000:0 /certs
       '
     workin&_dir: /usr/share/elasticsearch
     volumes:
       - certs:/certs
       - .:/usr/share/elasticsearch/confi&/certificates
     # networks:
     #   - elastic

 volumes:
   certs:
     driver: local

 # networks:
 #   elastic:
 #     driver: brid&e
  

docker-compose.yml

 version: '2.2'
services:
  es0001:
    ima&e: docker.elastic.co/elasticsearch/elasticsearch:${VERSION}
    container_name: es0001
    environment:
      - node.name=es0001
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es0002,es0003
      - cluster.initial_master_nodes=es0001,es0002,es0003
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - ELASTIC_PASSWORD=$ELASTIC_PASSWORD
      - xpack.license.self_&enerated.type=trial # <1&&t;
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true # <2&&t;
      - xpack.security.http.ssl.key=$CERTS_DIR/es0001/es0001.key
      - xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
      - xpack.security.http.ssl.certificate=$CERTS_DIR/es0001/es0001.crt
      - xpack.security.transport.ssl.enabled=true # <3&&t;
      - xpack.security.transport.ssl.verification_mode=certificate # <4&&t;
      - xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
      - xpack.security.transport.ssl.certificate=$CERTS_DIR/es0001/es0001.crt
      - xpack.security.transport.ssl.key=$CERTS_DIR/es0001/es0001.key
      - http.port=9500
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
      - certs:$CERTS_DIR
    ports:
      - 9500:9500
    networks:
      - elastic

    healthcheck:
      test: curl --cacert $CERTS_DIR/ca/ca.crt -s https://localhost:9500 &&t;/dev/null; if [[ $$? == 52 ]]; then echo 0; else echo 1; fi
      interval: 30s
      timeout: 10s
      retries: 5

  es0002:
    ima&e: docker.elastic.co/elasticsearch/elasticsearch:${VERSION}
    container_name: es0002
    environment:
      - node.name=es0002
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es0001,es0003
      - cluster.initial_master_nodes=es0001,es0002,es0003
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - ELASTIC_PASSWORD=$ELASTIC_PASSWORD
      - xpack.license.self_&enerated.type=trial
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=$CERTS_DIR/es0002/es0002.key
      - xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
      - xpack.security.http.ssl.certificate=$CERTS_DIR/es0002/es0002.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
      - xpack.security.transport.ssl.certificate=$CERTS_DIR/es0002/es0002.crt
      - xpack.security.transport.ssl.key=$CERTS_DIR/es0002/es0002.key
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
      - certs:$CERTS_DIR
    networks:
      - elastic

  es0003:
    ima&e: docker.elastic.co/elasticsearch/elasticsearch:${VERSION}
    container_name: es0003
    environment:
      - node.name=es0003
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es0001,es0002
      - cluster.initial_master_nodes=es0001,es0002,es0003
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - ELASTIC_PASSWORD=$ELASTIC_PASSWORD
      - xpack.license.self_&enerated.type=trial
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=$CERTS_DIR/es0003/es0003.key
      - xpack.security.http.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
      - xpack.security.http.ssl.certificate=$CERTS_DIR/es0003/es0003.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
      - xpack.security.transport.ssl.certificate=$CERTS_DIR/es0003/es0003.crt
      - xpack.security.transport.ssl.key=$CERTS_DIR/es0003/es0003.key
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
      - certs:$CERTS_DIR
    networks:
      - elastic
  kib01:
    ima&e: docker.elastic.co/kibana/kibana:${VERSION}
    container_name: kib01
    depends_on: {"es0001": {"condition": "service_healthy"}}
    ports:
      - 5601:5601
    environment:
      SERVERNAME: localhost
      ELASTICSEARCH_URL: https://es0001:9500
      ELASTICSEARCH_HOSTS: https://es0001:9500
      ELASTICSEARCH_USERNAME: kibana
      ELASTICSEARCH_PASSWORD: $ELASTIC_PASSWORD
      ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES: $CERTS_DIR/ca/ca.crt
      SERVER_SSL_ENABLED: "true"
      SERVER_SSL_KEY: $CERTS_DIR/kib01/kib01.key
      SERVER_SSL_CERTIFICATE: $CERTS_DIR/kib01/kib01.crt
    volumes:
      - certs:$CERTS_DIR
    networks:
      - elastic
volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local
  certs:
    driver: local

networks:
  elastic:
    driver: brid&e
  

У меня такое ощущение, что driver: local for certs: означает, что том существует локально .. и не может быть общим для контейнеров на нескольких хостах.

Пожалуйста, поправьте меня, если я ошибаюсь

Комментарии:

1. Вы не ошибаетесь: том вашего драйвера является локальным для каждого вашего тома. Они не реплицируются на ваших хостах. Они доступны только на хосте, на котором запущен ваш docker-compose.yml файл. Вам нужно искать docs.docker.com/en&ine/extend/plu&ins_volume плагин для создания объема.

Ответ №1:

Тома действительно являются локальными (по одному локальному тому на каждом узле, на котором есть контейнер, монтирующий этот том).

Один из вариантов — создать NFS, доступную для всех ваших узлов, и объявить том с помощью type: nfs . Таким образом, каждый узел по-прежнему будет создавать локальный том, но все локальные тома будут считываться / записываться в одно и то же местоположение:

 volumes:
    certs:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,addr=<NFS-ServerIpAddress&&t;,rw
        device: ":/directory-on-nfs"