Как сделать ping в redis без CURL или NC в консоли на проде в docker

Недавно мне нужно было пропинговать Redis (ping redis) из контейнера докера, чтобы убедиться, что он доступен. Проблема в том, что вы не можете перезапустить Docker-контейнер для установки чего-либо, потому что изменения не сохранятся без перестройки контейнера.

Я нашел этот небольшой фрагмент кода на Stack Overflow, который позволил мне проверить соединение с Redis из моего docker контейнера.

exec 3<>/dev/tcp/<YourRedisServerAddress>/6379 && \
echo -e "PING\r\n" >&3 && \
head -c 7 <&3

Console command for ping redis in docker container

Если вы можете подключиться к серверу и доступ к redis есть, вы должны получить ответ +PONG на PING запрос конечной точки.

Пример через docker-compose.yaml

Собрал быстро небольшой пример для демонстрации на базе docker и локальной разработки, но такая команда очень нужна была на проде для проверки работы сети.

services:
  redis:
    image: redis:7.4-alpine
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
  php-fpm:
    image: php:8.2-fpm
    volumes:
      - ./:/var/www/html:rw
volumes:
  redis_data:
    driver: local

docker-compose.yaml для демонстрации redis connect test

Далее вызываем команду docker compose up -d и наблюдаем логи как поднимается redis и рядом с ним контейнер php-fpm.

~/dev/trash/redis-test  docker compose up -d
[+] Running 21/21
 ✔ php-fpm Pulled                                         21.1s
   ✔ 64e67eb868eb Pull complete                           0.7s
   ✔ a00585d56b82 Pull complete                           0.4s
   ✔ 1a69dc721f20 Pull complete                           0.8s
   ✔ 61aafc8de441 Pull complete                           0.7s
   ✔ 50f27088e546 Pull complete                           17.8s
   ✔ cb7d3c59aa83 Pull complete                           0.8s
   ✔ 38a941fa3865 Pull complete                           5.0s
   ✔ b791392dd0fd Pull complete                           0.8s
   ✔ 4c7ed7d337db Pull complete                           0.8s
   ✔ 4f4fb700ef54 Pull complete                           0.2s
   ✔ f626fba1463b Pull complete                           11.0s
   ✔ 59d1feadc1c1 Pull complete                           17.5s
 ✔ redis Pulled                                           10.7s
   ✔ f644b71be12e Pull complete                           0.5s
   ✔ b3c1bc2ae482 Pull complete                           7.3s
   ✔ e43997775f51 Pull complete                           0.8s
   ✔ a4cd490265be Pull complete                           1.8s
   ✔ c2fe130f4aab Pull complete                           7.2s
   ✔ ea7069ec8986 Pull complete                           1.5s
   ✔ cda2dfd82503 Pull complete                           0.9s
[+] Running 4/4
 ✔ Network redis-test_default      Created                0.0s
 ✔ Volume "redis-test_redis_data"  Created                0.0s
 ✔ Container redis-test-redis-1    Started                0.2s
 ✔ Container redis-test-php-fpm-1  Started                0.2s

Логи после запуска redis в docker

После делаю коннект к контейнеру php-fpm и из него запускаю команду проверки подключения к redis - exec 3<>/dev/tcp/redis/6379 && echo -e "PING\r\n" >&3 && head -c 7 <&3 и вижу ответ +PONG. Значит все успешно отработало и мы имеет сетевую доступность редиса из контейнера с пхп.

Обратите внимание, что я заменил /dev/tcp/<YourRedisServerAddress>/6379 на /dev/tcp/redis/6379 так как в данной сети адрес редиса называется redis, но в вашем случае на проде это может быть любой IP адрес.