2016-12-07 10 views
0

Есть ли способ узнать изнутри контейнера Docker, работает ли этот контейнер изначально на хосте Linux или в Docker Machine?Есть ли способ определить программно, работает ли контейнер Docker изначально или с помощью Docker Machine?

Предыстория вопроса в том, что я хочу, чтобы включить JMX в моем контейнере Tomcat на основе, но для этого мне нужно знать внешний IP-адрес хоста:

  • При работе в Docker- Машина, это что-то вроде 192.168.99.100.
  • Выполняется из Linux, это IP-адрес хоста.
  • Запуск в Docker для Mac, это также IP-адрес хоста.

У меня есть Docker Tomcat образа, который я хочу, чтобы раскатывать с поддержкой JMX, но я не знаю, люди собираются использовать его изначально или работают в Докер-машине, поэтому я не знаю, какое IP, чтобы обеспечить параметр java.rmi.server.hostname при запуске Tomcat.

Есть ли способ либо

  • найти этот IP-адрес из внутренней части контейнера (или выяснить, где он работает), или
  • найти его с внешней стороны (например, в Докер-композе), а затем передать его в контейнер при запуске? Может ли в этом случае помочь переменная окружения DOCKER_HOST? При запуске Docker Machine установлено значение tcp://192.168.99.100:2376 - эта переменная также используется, когда не работает Docker Machine?

Я хотел бы избежать ситуации, когда люди должны указать IP-адрес вручную при запуске контейнера (или Docker Compose).

+1

относительно вашего второго варианта, вы можете использовать [docker api] (https://docs.docker.com/engine/reference/api/docker_remote_api/) и получать информацию о своем контейнере! –

+0

@ Mohsen89z Что бы вы запросили у докера, какой тип хоста вы используете? – Matt

+1

Я думаю, что это будет трудно обойтись без ввода переменной среды во время выполнения с хоста, запускающего его. Вы могли бы создать сценарий для людей, чтобы запускать ваши контейнеры, которые собирают информацию для них. или попробуйте [jolokia] (https://jolokia.org), который подходит для запуска в докере. – Matt

ответ

0

Вот как я решил это, используя переменную DOCKER_HOST. Мое предположение состоит в том, что если эта переменная установлена, она будет содержать IP-адрес хоста, в виде tcp://192.168.99.100:2367.

В моем docker-compose.yaml файле, я сопоставляются DOCKER_HOST переменную хоста в контейнере:

version: "2" 

services: 
    foo: 
    environment: 
     DOCKER_HOST: $DOCKER_HOST 

Затем в контейнере, я оцениваю эту переменную как часть сценария, который запускается при запуске контейнера, а затем использовать его, чтобы установить JMX свойства для Tomcat:

# Allow to specify the JMX port from the outside. Use 10992 as a default if not provided 
DOCKER_JMX_PORT=${DOCKER_JMX_PORT:-10992} 

# Evaluate the $DOCKER_HOST variable 
if [ -n "DOCKER_HOST" ]; then 
    # DOCKER_HOST variable is set 
    DOCKER_JMX_HOST=$(echo "$DOCKER_HOST" | sed -e "s|tcp://||g" -e "s/:.*//g") 
else 
    # DOCKER_HOST variable is not set 
    DOCKER_JMX_HOST=$(hostname) 
fi 

# Set the JMX properties for Tomcat 
export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true \ 
    -Dcom.sun.management.jmxremote.port=$DOCKER_JMX_PORT \ 
    -Dcom.sun.management.jmxremote.rmi.port=$DOCKER_JMX_PORT \ 
    -Dcom.sun.management.jmxremote.authenticate=false \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -Djava.rmi.server.hostname=$DOCKER_JMX_HOST" 

Когда переменная DOCKER_HOST среды не задана, я полагаю, что контейнер работает изначально, например, в Linux, и я использую имя хоста для свойств JMX.