Docker,运行多个容器(elasticsearch)

时间:2019-12-27 11:56:15

标签: docker elasticsearch docker-compose

我正在与进行一次Elasticsearch

version: '3'

services:
 elasticsearch:
  build:
    context: .
    dockerfile: ./compose/elasticsearch/Dockerfile
    args:
      - VERSION=${VERSION}
      - MEM=${MEM}
      - ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT_DEV}
      - CLUSTER_NAME=${CLUSTER_NAME_DEV}
      - ENV=${ENV_DEV}
  container_name: elasticsearch
  network_mode: host
  environment:
    - discovery.type=single-node
  volumes:
   - /var/lib/elasticsearch:/usr/share/elasticsearch/data
 logstash:
  build:
    context: .
    dockerfile: ./compose/logstash/Dockerfile
    args:
      - VERSION=${VERSION}
      - ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST_DEV}
      - ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT_DEV}
      - DB_HOST=${DB_HOST_DEV}
      - DB_NAME=${DB_NAME_DEV}
      - ENV=${ENV_DEV}
  container_name: logstash
  network_mode: host
  volumes:
   - /opt/logstash/data:/usr/share/logstash/data
  dns:
   -  192.168.1.1  # IP necessary to connect to a database instance external to where the server in which the container is running
 kibana:
  build:
    context: .
    dockerfile: ./compose/kibana/Dockerfile
    args:
      - VERSION=${VERSION}
      - ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST_DEV}
      - ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT_DEV}
  container_name: kibana
  depends_on:
   - elasticsearch
  network_mode: host
 nginx:
  build:
    context: .
    dockerfile: ./compose/nginx/Dockerfile
    args:
      - KIBANA_HOST=${KIBANA_HOST_DEV}
      - KIBANA_PORT=${KIBANA_PORT_DEV}
  container_name: nginx
  network_mode: host
  depends_on:
   - kibana
 apm:
  build:
    context: .
    dockerfile: ./compose/apm/Dockerfile
    args:
      - VERSION=${VERSION}
      - ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST_DEV}
      - ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT_DEV}
      - APM_PORT=${APM_PORT_DEV}
  container_name: apm
  depends_on:
   - elasticsearch
  network_mode: host

(我认为当容器访问/var/lib/elasticsearch且数据保存在主机的/usr/share/elasticsearch/data中时,该主机将使用主机的/var/lib/elasticsearch

另一个

version: '3'

services:
 elasticsearch-search:
  restart: always
  build:
    context: .
    dockerfile: ./compose/elasticsearch/Dockerfile
    args:
      - VERSION=${VERSION}
      - ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT_SEARCH_DEV}
      - MEM=${MEM_SEARCH}
      - CLUSTER_NAME=${CLUSTER_NAME_SEARCH_DEV}
      - ENV=${ENV_DEV}
  container_name: elasticsearch-search
  network_mode: host
  environment:
    - discovery.type=single-node
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - data:/usr/share/elasticsearch/data

  ulimits:
    memlock:
      soft: -1
      hard: -1
    nofile:
      soft: 65536
      hard: 65536
 kibana:
  build:
    context: .
    dockerfile: ./compose/kibana/Dockerfile
    args:
      - VERSION=${VERSION}
      - ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST_SEARCH_DEV}
      - ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT_SEARCH_DEV}
  container_name: kibana-search
  depends_on:
   - elasticsearch-search
  network_mode: host
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - data:/usr/share/elasticsearch/data

volumes:
  data:

(我不确定这是如何实现的,但是我想docker提供了持久性存储,可以通过/usr/share/elasticsearch/data从容器访问该持久性存储)

当我同时运行它们时,我期望两个elasticsearch使用单独的数据。但似乎它们正在互相干扰。

我有一个运行在第一个ES上的kibana。

当我单独运行第一个ES时,我可以看到数据,但是一旦运行第二个ES,就什么也没有,没有索引模式,也没有仪表板。

我误会什么?

.env

ELASTICSEARCH_PORT_DEV=29200
ELASTICSEARCH_PORT_SEARCH_DEV=29300

1 个答案:

答案 0 :(得分:0)

volumes:节中,您的docker-compose最有可能出了问题。

第二个示例在顶部

volumes:
   - data:/usr/share/elasticsearch/data

并在底部:

volumes:
    - /etc/localtime:/etc/localtime:ro
    - data:/usr/share/elasticsearch/data

,这意味着至少两个单独的容器已绑定到同一本地文件夹data。这绝对是一种观察奇怪事物的方法,因为这些容器(ES就是其中之一)内部的某些事物将尝试在主机data文件夹中重新创建数据存储层次结构。

您可以尝试为以下第一个ES定义卷吗?

volumes:
   - ./data/es1:/usr/share/elasticsearch/data

,第二个为:

volumes:
   - ./data/es2:/usr/share/elasticsearch/data

在执行./data/es1之前,请确保主机上存在./data/es2docker-compose up文件夹。

或者您可以发布整个docker-compose.yml文件,以便我们可以说出问题所在...