elasticsearch,docker-compose,Docker,elasticsearch,Docker Compose" /> elasticsearch,docker-compose,Docker,elasticsearch,Docker Compose" />

Docker,运行多个容器(elasticsearch)

Docker,运行多个容器(elasticsearch),docker,elasticsearch,docker-compose,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}

我正在和你一起做一个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
(我认为,当容器访问
/usr/share/elasticsearch/data
时,这个应用程序使用主机的
/var/lib/elasticsearch
,并且数据被保存在主机的
/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使用单独的数据。但他们似乎在互相干扰

我有一个kibana跑步,它看起来像是第一次跑步

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

我误解了什么

环境署署长


您的docker compose在
卷:
部分方面很可能有问题

第二个例子的顶部有这个

volumes:
   - data:/usr/share/elasticsearch/data
下面是:

volumes:
    - /etc/localtime:/etc/localtime:ro
    - data:/usr/share/elasticsearch/data
这意味着至少有两个单独的容器绑定到同一本地文件夹
data
。这无疑是看到奇怪事物的一种方式,因为这些容器中的某些东西(ES就是其中之一)将尝试在hosts
data
文件夹中重新创建数据存储层次结构

您可以尝试将第一个ES的卷定义为:

volumes:
   - ./data/es1:/usr/share/elasticsearch/data
第二个是:

volumes:
   - ./data/es2:/usr/share/elasticsearch/data
只需确保主机上有
/data/es1
/data/es2
文件夹,然后再执行
docker compose up


或者你可以发布整个
docker compose.yml
文件,这样我们就可以知道它有什么问题了…

你能提供这两种情况下你的compose文件的全部内容,以及你如何知道它们在干扰吗?@optsteresninja Amit我添加了compose文件,为什么我认为他们会在第二个文件中插入,应该有一个顶级的
卷:
部分,其中包含
数据:
块;这对问题很重要。@DavidMaze哦,是的,我的撰写文件中有它,在复制它时遗漏了这一部分。在第二个示例中,您将数据存储在命名卷中,您希望数据如何进入其中?(看起来您看到了您所期望的,两个ES安装的数据存储彼此隔离。)我修复了操作。。顶部的
卷:
是docker compose的
片段摘要,如下所示。在这种情况下,
elasticsearch
服务和
elasticsearch
在驱动器上没有冲突。它们应该同时工作,很好。(假设您的项目不位于
/var/lib/elasticsearch
内部,这就是为什么我建议第二个也使用完整路径,而不是
数据
)此外,我看不到您正在公开端口“```端口:-27017:27017```这应该是第二个主机的不同端口。否则它将无法启动…抱歉,ES端口是
端口:-9200:9200
我复制了完整的docker compose。。对不起,我应该早点完成。现在我明白了,顶层的卷被设计成多个服务中的公共位置。因此,您有两个选项1)-将两个卷定义为
dataes1
dataes2
,并更改您的服务以使用它们。或2)-装载2个主机独立路径,而不是定义的loume
数据
volumes:
   - ./data/es2:/usr/share/elasticsearch/data