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

Я нашел небольшой сниппет кода (команду) на Stack Overflow, который позволяет мне проверить доступность redis из docker контейнера, где нет curl или nc команд. Будет актуально всем, кто использует максимально легкие контейнеры в docker, alpine docker

Как сделать 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 адрес.