如何从Docker撰写文件为Solr服务器设置自定义IP?

简而言之:

我很难搞清楚如何从docker-compose.yml文件中为Solr容器设置自定义IP。

详细

我们想通过Docker部署本地的开发环境,用于Drupal实例。

问题是,虽然从浏览器中可以通过“传统” http://localhost:8983/solr访问Solr服务器,但是Drupal无法以这种方式连接到它。 内部0.0.0.0和127.0.0.1也不起作用。 Drupal可以连接到Solr服务器的唯一方法是通过局域网IP,每个站点明显不同,因为Drupal中的configuration需要更新,我认为指定一个自定义IP可以沟通将是我最好的select,但并不简单。

我知道将静态IP分配给容器并不是最好的解决scheme,但是似乎比修改solr.in.sh更可行,如果有人有不同的方法来实现这一点,我可以开放解决scheme。

最有可能的是我可以使用一些命令行参数与docker run ,但我们需要用docker-compose up -d运行容器,所以这不是一个最佳的解决scheme。

理想将是一个Solr容器部分的撰写文件的例子。 谢谢。

注意: 这个链接显示了一个如何设置它的例子,但是我不明白。 请记住,我绝不是专家。

忘了提及主机是基于Linux ,主要是UbuntuDebian

编辑:

按照要求,这是我的撰写文件:

 version: "2" services: db: image: wodby/drupal-mariadb environment: MYSQL_RANDOM_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} # command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # The simple way to override the mariadb config. volumes: - ./data/mysql:/var/lib/mysql - ./docker-runtime/mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here. php: image: wodby/drupal-php:7.0 # Allowed: 7.0, 5.6. environment: DEPLOY_ENV: dev PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025 PHP_XDEBUG_ENABLED: 1 # Set 1 to enable. # PHP_SITE_NAME: dev # PHP_HOST_NAME: localhost:8000 # PHP_DOCROOT: public # Relative path inside the /var/www/html/ directory. # PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025 # PHP_XDEBUG_ENABLED: 1 # PHP_XDEBUG_AUTOSTART: 1 # PHP_XDEBUG_REMOTE_CONNECT_BACK: 0 # This is needed to respect remote.host setting bellow # PHP_XDEBUG_REMOTE_HOST: "10.254.254.254" # You will also need to 'sudo ifconfig lo0 alias 10.254.254.254' links: - db volumes: - ./docroot:/var/www/html nginx: image: wodby/drupal-nginx hostname: testing environment: # NGINX_SERVER_NAME: localhost NGINX_UPSTREAM_NAME: php # NGINX_DOCROOT: public # Relative path inside the /var/www/html/ directory. DRUPAL_VERSION: 7 # Allowed: 7, 8. volumes_from: - php ports: - "${PORT_WEB}:80" pma: image: phpmyadmin/phpmyadmin environment: PMA_HOST: db PMA_USER: ${MYSQL_USER} PMA_PASSWORD: ${MYSQL_PASSWORD} ports: - '${PORT_PMA}:80' links: - db mailhog: image: mailhog/mailhog ports: - "8002:8025" redis: image: redis:3.2-alpine # memcached: # image: memcached:1.4-alpine # memcached-admin: # image: phynias/phpmemcachedadmin # ports: # - "8006:80" solr: image: makuk66/docker-solr:4.10.3 volumes: - ./docker-runtime/solr:/opt/solr/server/solr/mycores # entrypoint: # - docker-entrypoint.sh # - solr-precreate ports: - "8983:8983" # varnish: # image: wodby/drupal-varnish # depends_on: # - nginx # environment: # VARNISH_SECRET: secret # VARNISH_BACKEND_HOST: nginx # VARNISH_BACKEND_PORT: 80 # VARNISH_MEMORY_SIZE: 256M # VARNISH_STORAGE_SIZE: 1024M # ports: # - "8004:6081" # HTTP Proxy # - "8005:6082" # Control terminal # sshd: # image: wodby/drupal-sshd # environment: # SSH_PUB_KEY: "ssh-rsa ..." # volumes_from: # - php # ports: # - "8006:22" 

docker运行的例子将是

 IP_ADDRESS=$(hostname -I) docker run -d -p 8983:8983 solr bin/solr start -h ${IP_ADDRESS} -p 8983 

您可以使用以下方法来dynamic获取容器的IP,而不是分配静态IP。

将容器链接在一起时,它们会将networking信息(IP,端口)共享给对方。 信息作为环境variables存储在每个容器中。

泊坞窗,compose.yml

 service: build: . links: - redis ports: - "3001:3001" redis: build: . ports: - "6369:6369" 

服务容器现在将具有以下环境variables:

存储在“服务”容器中的dynamicIP地址: REDIS_PORT_6379_TCP_ADDR

dynamic端口存储在“服务”容器内: REDIS_PORT_6379_TCP_PORT

你总是可以通过炮击到容器中查看自己。

 docker exec -it [ContainerID] bash printenv 

printenv

在nodeJS应用程序中,您可以使用process.env在连接函数中使用环境variables。

 let client = redis.createClient({ port: process.env.REDIS_PORT_6379_TCP_ADDR, host: process.env.REDIS_PORT_6379_TCP_PORT }); 

编辑

这里是更新的docker-compose.yml“solr”部分:

  solr: image: makuk66/docker-solr:4.10.3 volumes: - ./docker-runtime/solr:/opt/solr/server/solr/mycores entrypoint: - docker-entrypoint.sh - solr-precreate ports: - "8983:8983" links: - db 

在上面的例子中,“solr”容器现在与“db”容器链接。 这是使用“链接”字段完成的。

如果要将solr容器链接到docker-compose.yml文件中的任何其他容器,则可以执行相同的操作。

db容器信息现在将被提供给solr容器(通过前面提到的环境variables)。

没有链接,当您执行printenv命令时,您将看不到列出的环境variables。