구형 시놀로지 NAS(DS716+) Docker phpMyAdmin AH00141 오류 삽질기 — 커널 근본 원인과 우회 방법

이 글을 읽기 전에: 이 글은 DS716+(DSM 7.1.1) 환경의 AH00141 오류에 대한 Docker 완전 해결책이 아닙니다. Linux 3.10.x 커널의 getrandom() 미지원이라는 근본 원인을 분석하고, 같은 환경에서 검증된 우회책(시놀로지 패키지 센터 phpMyAdmin)을 제시합니다.

DS716+(DSM 7.1.1) 환경에서 phpMyAdmin Docker 컨테이너를 띄우려다 AH00141: Could not initialize random number generator 오류와 씨름했습니다. 결론부터 말씀드리면, 제 환경에서는 Docker로 해결하지 못했습니다. /dev/random 마운트부터 --privileged 옵션, 구버전 이미지 태그까지 다섯 가지 방법을 시도했지만 결과는 모두 동일했습니다. 같은 오류로 헤매고 계신 구형 NAS 사용자분들이 저처럼 시간을 허비하지 않으시도록, 실패한 경과와 최종 차선책을 있는 그대로 기록합니다.

1. 목표와 첫 번째 난관 — phpMyAdmin 컨테이너가 켜지지 않는다

당시 목표는 Docker로 MariaDB(mariadb 이미지)를 구성하고, 웹 인터페이스에서 편리하게 관리하기 위해 phpMyAdmin 컨테이너를 함께 올리는 것이었습니다. 나중에 다른 환경으로 데이터베이스를 옮기기 쉽게 Docker로 묶어두고 싶었기 때문입니다.

mariadb 컨테이너는 voca-net이라는 Docker 네트워크에 연결해 문제없이 생성됐습니다. (※ voca-net은 제가 임의로 만든 네트워크 이름이며, 실제 환경에 맞게 변경하시면 됩니다.) 이어서 phpMyAdmin 컨테이너를 실행하는 순간, 컨테이너가 시작과 동시에 종료되는 무한 재시작 루프에 빠졌습니다. 로그를 보니 아래 메시지가 반복해서 가득 찍혀 있었습니다.

AH00141: Could not initialize random number generator
phpMyAdmin Docker 컨테이너 로그에 반복 출력된 AH00141 난수 생성기 초기화 실패 오류

phpMyAdmin 컨테이너가 시작 직후 AH00141 오류를 뱉으며 종료되는 모습

처음에는 단순한 디바이스 접근 권한 문제로 판단했습니다. 그래서 검색을 통해 찾은 표준 해결책들을 하나씩 적용해봤습니다.

2. 표준 해결책 5종 시도 — 모두 동일한 결과

2.1 왜 /dev/random 마운트가 해결책으로 알려졌는가?

일반적으로 AH00141 오류는 컨테이너가 호스트의 /dev/random(또는 /dev/urandom)에 직접 접근하지 못해 발생한다고 알려져 있습니다. 그래서 커뮤니티에서는 해당 디바이스를 컨테이너에 마운트해 강제로 연결하는 방법이 첫 번째 처방으로 자주 언급됩니다. 저도 그 접근부터 시작했습니다.

2.2 시도 결과 요약

시도적용 방법결과
1-v /dev/urandom:/dev/random:ro (읽기 전용 마운트)실패 — 동일 AH00141
2-v /dev/urandom:/dev/random (RW 마운트)실패 — 동일
3-v /dev/random:/dev/random (직접 마운트, ro 포함)실패 — 변화 없음
4이미지 태그 phpmyadmin:5.2로 변경실패 — 동일
5--privileged 옵션 부여실패 — 동일

아래는 각 시도의 대표 커맨드 예시입니다(컨테이너명·포트·환경변수는 실제 환경에 맞게 조정하세요).

# 시도 1~3: /dev/random 마운트 방식 (대표 예시 — 읽기 전용)
docker run -d --name phpmyadmin \
  -v /dev/urandom:/dev/random:ro \
  -e PMA_HOST=<mariadb-container-name> \
  --network voca-net \
  -p 8080:80 \
  phpmyadmin:latest

# 시도 5: --privileged 옵션 부여
docker run -d --name phpmyadmin \
  --privileged \
  -e PMA_HOST=<mariadb-container-name> \
  --network voca-net \
  -p 8080:80 \
  phpmyadmin:latest

2.3 --privileged도 실패한 이유 — 그리고 보안 주의

시도 5의 --privileged는 컨테이너에 호스트 커널 기능 대부분에 대한 접근 권한을 부여하는 옵션입니다.

주의: --privileged는 컨테이너가 사실상 호스트 수준의 권한을 갖게 되어 보안 위험이 큽니다. 일반 운용 환경에서는 권하지 않는 옵션이며, 본 사례에서는 원인 추적 단계에서의 실험으로만 시도한 것입니다. 마찬가지로 -v /dev/random:/dev/random 직접 마운트 역시 호스트 디바이스 노출에 주의가 필요합니다.

다섯 번째까지 모두 실패했을 때, 로그에 함께 출력된 (38) Function not implemented라는 오류 코드가 계속 눈에 걸렸습니다. 단순한 권한·마운트 문제가 아닌 것 같았습니다.

3. 더 깊은 원인 — 커널의 벽

3.1 Apache의 getrandom() 시스템 호출

(38) Function not implemented를 키워드로 추가해 검색하면서 방향이 바뀌었습니다. 검색을 계속 하다 보니, 최신 Docker 이미지 — 특히 Debian Bullseye 기반 이미지에 내장된 Apache — 가 난수 생성을 위해 getrandom() 시스템 호출을 사용한다는 설명이 StackOverflow와 Docker 커뮤니티 글 여러 곳에서 반복해서 보였습니다.

3.2 DS716+ Linux 3.10.x 커널의 제약

getrandom() 시스템 호출은 Linux 커널 3.17부터 도입됐습니다. DS716+와 같은 구형 NAS 모델은 DSM 7.1 환경에서도 Linux 3.10.x 커널(일부 빌드에서는 4.4.x로 보고되기도 합니다)을 사용하는 것으로 알려져 있습니다. DS716+가 Linux 3.10.x 커널을 사용하는 경우, getrandom()이 구현되어 있지 않아 미지원 상태가 됩니다. 이것이 /dev/random 마운트나 --privileged로도 해결되지 않는 근본 이유입니다.

다만 이 분석은 검색과 커뮤니티 논의를 통해 파악한 추정 수준이며, 제 환경에서 커널 소스 레벨로 직접 검증한 것은 아닙니다.

3.3 (38) Function not implemented가 의미하는 것

(38) Function not implemented는 커널에 해당 시스템 호출 자체가 없다는 신호입니다. 이것이 파일 접근 권한 문제가 아니라 커널 기능 자체의 부재에 가깝다면, 디바이스 마운트나 권한 부여로 해결될 수 없는 구조적 제약임을 의미합니다.

4. 구버전 이미지로 우회 시도 — 여기서도 막혔습니다

5가지 표준 방법이 모두 실패한 뒤, 또 다른 방향을 생각했습니다. 커널 호환성 문제라면 더 오래된 이미지 — Debian Bullseye 이전 기반 — 라면 getrandom() 없이도 동작할 수 있지 않을까 싶었습니다. 그래서 phpmyadmin:4.9 태그를 시도했는데, 4.9라는 태그 자체는 존재하지 않고 4.9.x 형태의 세부 버전만 있다는 것을 뒤늦게 알았습니다. 다시 phpmyadmin:4.9.11로 시도했지만 결과는 아래와 같았습니다.

Error response from daemon: manifest for phomvadmin:4.9.11 not found: manifest unknown: manifest unknown

※ 위 오류 메시지는 당시 작성한 기록을 그대로 옮긴 것으로, phomvadmin은 입력 오타입니다. 실제 시도한 이미지명은 phpmyadmin:4.9.11이며, Docker Hub 응답에 오타가 있는 것이 아닙니다.

네트워크 문제인지 확인하기 위해 기본 진단을 진행했습니다.

  • ping 8.8.8.8정상
  • docker pull hello-world정상
  • ping hub.docker.com실패 (단, hello-world 다운로드가 정상이었으므로, 이것이 직접적인 원인은 아닌 듯했습니다.)
phpmyadmin 4.9.11 이미지 다운로드 시도 중 manifest not found 응답을 받은 터미널 화면

구버전 태그(phpmyadmin:4.9.11) 다운로드 시도에서 manifest not found 응답

인터넷 연결 자체는 문제없었지만, 해당 이미지 태그를 가져오는 것만 실패했습니다. 구버전 이미지를 통한 우회도 성공하지 못한 채 막혔습니다.

5. 최종 차선책 — 패키지 센터 phpMyAdmin

표준 Docker 해결책 5종과 구버전 이미지 우회까지 모두 통하지 않았습니다. 제 환경(DS716+, DSM 7.1.1, Linux 3.10.x 커널)에서는 이 방식으로 접근하는 게 한계에 다다랐다고 판단했습니다. Docker 고집을 조금 더 일찍 내려놨더라면 시간을 훨씬 아낄 수 있었겠다는 생각도 들었습니다.

차선책: 시놀로지 패키지 센터에서 제공하는 공식 phpMyAdmin 패키지를 설치해 사용하세요.

설치 방법은 간단합니다. DSM 메인 메뉴에서 패키지 센터를 열고, 검색창에 phpMyAdmin을 입력하면 바로 나옵니다. 설치가 완료되면 DSM 메인 메뉴에 phpMyAdmin 아이콘이 추가되며, 별도 포트 설정 없이 DSM 계정으로 바로 접근할 수 있습니다.

커널 호환성이나 이미지 다운로드 문제 없이 안정적으로 phpMyAdmin을 사용할 수 있습니다. 저 역시 이 방법을 선택했고, 필요할 때 데이터베이스는 mysqldump를 이용해 수동으로 마이그레이션하기로 했습니다.

마무리

이번 경험에서 얻은 한 가지는, 구형 NAS 모델의 커널 버전이 Docker 이미지 호환성에 생각보다 크게 영향을 미친다는 점입니다. 마운트 옵션이나 권한 설정을 아무리 바꿔봐도 커널에 구현되지 않은 기능은 살아나지 않았습니다. 처음에 예상했던 “권한 문제”가 아니라 “커널 기능 부재(Linux 3.10.x의 getrandom() 미지원)”라는 것을 일찍 파악했더라면 삽질의 범위를 훨씬 줄일 수 있었을 것입니다.

PS: 커뮤니티에서 DSM을 6 버전대로 낮춰서 Docker phpMyAdmin을 성공했다는 사례를 언급하시는 분들이 계시긴 합니다. 다만 DSM 다운그레이드는 데이터 손실 위험이 상당한 작업이라 저는 시도하지 않았습니다. 향후 NAS 초기화 후 재시도 기회가 생기면 그 경과를 별도로 정리해 보겠습니다.


이 글은 2025-05-02에 직접 경험한 트러블슈팅 과정을 기반으로 작성되었습니다.

Similar Posts