首页 > 解决方案 > 想在 docker 中用 Laravel 应用程序运行 elasticsearch,但它不起作用

问题描述

我有位于 docker 中的 laravel 应用程序,我想将 elasticsearch 集成到我的应用程序中 这就是我的 docker-compose.yaml 的外观

version: '3'
services:
  laravel:
    build: ./docker/build
    container_name: laravel
    restart: unless-stopped
    privileged: true
    ports:
      - 8084:80
      - "22:22"
    volumes:
      - ./docker/settings:/settings
      - ../2agsapp:/var/www/html
      # - vendor:/var/www/html/vendor
      - ./docker/temp:/backup
      - composer_cache:/root/.composer/cache
    environment:
      - ENABLE_XDEBUG=true
    links:
      - mysql
  mysql:
    image: mariadb:10.2
    container_name: mysql
    volumes:
      - ./docker/db_config:/etc/mysql/conf.d
      - ./db:/var/lib/mysql
    ports:
      - "8989:3306"
    environment:
      - MYSQL_USER=dev
      - MYSQL_PASSWORD=dev
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=laravel
    command: --innodb_use_native_aio=0
  phpmyadmin:
    container_name: pma_laravel
    image: phpmyadmin/phpmyadmin:latest
    environment:
      - MYSQL_USER=dev
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_PASSWORD=dev
      - MYSQL_DATABASE=laravel
      - PMA_HOST=mysql
    ports:
      - 8083:80
    links:
      - mysql
  es:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - discovery.type=single-node

volumes:
  storage:
  composer_cache:

我运行docker-compose up -d然后遇到了非常奇怪的问题如果我curl localhost:9200在 laravel 容器中执行它会返回此消息Failed to connect to localhost port 9200: Connection refused 但是如果我将用完 dockercurl localhost:9200它会返回预期的响应

也许我不明白它是如何工作的,希望有人能帮助我

标签: docker

解决方案


当您想访问某个容器中的另一个容器时,您应该使用容器名称,而不是localhost.

如果您在内部laravel并想要访问 Elasticsearch,您应该:

curl es:9200

由于您将 9200 端口映射到 localhost(portsdocker-compose 中的部分),因此该端口也可从您的本地计算机获得,这就是从本地计算机卷曲到 9200 有效的原因。


推荐阅读