ivankprod
@ivankprod
Системный / веб fullstack-разработчик

Как узнать реальный IP адрес клиента внутри docker-контейнера?

Всем доброго дня. Подскажите, как узнать реальный ip клиента в веб-сервере внутри docker-контейнера? Сейчас в логах ip докера, а не реального клиента.
network_mode: host не помогает, мало того, сервер в этом случае вообще не стартует (listen tcp4 192.168.0.104:80: bind: cannot assign requested address, хотя в файле hosts хоста все казано корректно), но если слушать на локалхосте, то сервер становится недоступен с хоста и из сети вообще.

У хоста IP 192.168.0.104, у докера 172.17.32.1.

Файл hosts:
192.168.0.104 ivankprod.ru
192.168.0.104 www.ivankprod.ru

Файл docker-compose.yml:
version: '3.8'

services:
  certbot:
    container_name: ikpru_certbot
    image: certbot/certbot
    restart: unless-stopped
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
    volumes:
      - ./data/certbot:/etc/letsencrypt

  tarantool:
    container_name: ikpru_tarantool
    image: tarantool/tarantool:2.8
    environment:
      TARANTOOL_PORT: ${DB_TARANTOOL_PORT:-3301}
      TARANTOOL_USER_NAME: ${DB_TARANTOOL_USER:-nothing}
      TARANTOOL_USER_PASSWORD: ${DB_TARANTOOL_PASSWORD:-nothing}
    command: tarantool /usr/local/share/tarantool/app.lua
    ports:
      - "${DB_TARANTOOL_PORT:-3301}:${DB_TARANTOOL_PORT:-3301}"
    volumes:
      - ./tarantool/app:/usr/local/share/tarantool
      - ./tarantool/data:/var/lib/tarantool

  app:
    container_name: ikpru_app
    build: .
    image: ivankprodru_app
    restart: on-failure
    env_file:
      - ${STAGE_MODE:-prod}.env
    command: bash -c "cd ./home/app && ./server"
    ports:
      - "${SERVER_PORT_HTTP:-80}:${SERVER_PORT_HTTP:-80}"
      - "${SERVER_PORT_HTTPS:-443}:${SERVER_PORT_HTTPS:-443}"
    volumes:
      - ./build_${STAGE_MODE:-prod}:/home/app
      - ./data/certbot:/etc/letsencrypt
    links:
      - tarantool:${DB_TARANTOOL_HOST:-tarantool}
    depends_on:
      - certbot
      - tarantool
  • Вопрос задан
  • 558 просмотров
Решения вопроса 1
karabanov
@karabanov Куратор тега Docker
Системный администратор
network_mode: host в данном случае поможет, просто надо убрать нечто, что мешает забиндить порт.

Есть ещё вариант поставить Nginx перед этим сервисом и передавать на бэкенд реальный IP в http заголовке X-Real-IP.
Как-то так:
location /blablbla/ {
      proxy_pass http://127.0.0.1:8080/blablabla/;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы