Docker 기반 워드프레스 파일 권한 설정 방법
Docker로 워드프레스를 운영하다 보면 플러그인 설치, 테마 업로드, 미디어 업로드 시 “권한이 없습니다(Permission denied)”라는 오류나 FTP 연결 정보를 요구하는 화면을 자주 마주치게 됩니다. 이는 대부분 컨테이너 내부 프로세스의 소유자와 마운트된 볼륨/파일의 소유자가 일치하지 않아 발생합니다.
이 글에서는 Docker 기반 워드프레스 환경에서 파일 권한을 올바르게 설정하는 방법을 단계별로 정리했습니다.
1. 문제의 핵심: 컨테이너와 호스트의 사용자 불일치
공식 워드프레스 Docker 이미지는 내부적으로 www-data라는 사용자(보통 UID 33)로 Apache/PHP-FPM 프로세스를 실행합니다. 반면 호스트 PC에서 볼륨으로 파일을 옮기거나 docker cp로 파일을 복사하면, 그 파일은 호스트의 사용자 권한(UID)을 그대로 유지한 채 컨테이너 안으로 들어옵니다.
즉, 컨테이너 내부의 www-data(UID 33)와 호스트에서 복사된 파일의 소유자(UID 1000 등)가 다르면, 워드프레스가 wp-content 폴더에 쓰기 작업을 하지 못해 권한 오류가 발생합니다.
2. 컨테이너 내부에서 소유권 확인하기
먼저 컨테이너 내부 프로세스가 어떤 사용자로 동작하는지 확인합니다.
docker exec -it wordpress_app id www-data
일반적으로 아래와 같이 출력됩니다.
uid=33(www-data) gid=33(www-data) groups=33(www-data)
현재 wp-content 폴더의 소유권도 함께 확인해보세요.
docker exec -it wordpress_app ls -la /var/www/html/wp-content
소유자가 www-data가 아니라 root나 다른 UID로 표시된다면 이것이 문제의 원인입니다.
3. 해결 방법 1: 컨테이너 내부에서 소유권 직접 변경 (가장 간단함)
가장 빠른 해결책은 컨테이너 안에서 직접 chown, chmod를 실행하는 것입니다.
# wp-content 폴더 전체 소유권을 www-data로 변경
docker exec -it wordpress_app chown -R www-data:www-data /var/www/html/wp-content
# 폴더는 755, 파일은 644 권한으로 통일
docker exec -it wordpress_app find /var/www/html/wp-content -type d -exec chmod 755 {} \;
docker exec -it wordpress_app find /var/www/html/wp-content -type f -exec chmod 644 {} \;
이 방법은 즉시 효과가 있지만, 컨테이너를 재생성(recreate)하면 다시 원래 권한으로 돌아갈 수 있으므로 아래에서 소개하는 근본적인 해결법과 함께 적용하는 것이 좋습니다.
4. 해결 방법 2: docker-compose.yml에서 entrypoint로 자동화하기
매번 수동으로 명령어를 입력하기 번거롭다면, 컨테이너가 시작될 때마다 자동으로 권한을 맞춰주도록 설정할 수 있습니다.
services:
wordpress:
image: wordpress:latest
container_name: wordpress_app
depends_on:
- db
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpresspassword
volumes:
- wordpress_data:/var/www/html
entrypoint: >
bash -c "
chown -R www-data:www-data /var/www/html/wp-content &&
docker-entrypoint.sh apache2-foreground"
volumes:
wordpress_data:
이렇게 하면 컨테이너가 시작될 때마다 wp-content 폴더의 소유권을 자동으로 맞춰줍니다.
5. 해결 방법 3: wp-config.php에서 파일시스템 방식 강제 지정
권한이 이미 올바르게 설정되어 있는데도 워드프레스가 계속 FTP 정보를 요구한다면, wp-config.php에 아래 설정을 추가하세요.
define('FS_METHOD', 'direct');
Docker Compose 환경이라면 환경변수로 워드프레스 설정을 직접 주입할 수도 있습니다.
environment:
WORDPRESS_CONFIG_EXTRA: |
define('FS_METHOD', 'direct');
6. 해결 방법 4: 볼륨 마운트 시 UID/GID 맞추기 (근본적 해결)
호스트에서 직접 파일을 편집하거나 배포 스크립트를 사용하는 경우, 애초에 호스트 사용자와 컨테이너 사용자의 UID를 일치시키는 것이 가장 근본적인 해결책입니다.
방법 A: 호스트 사용자를 UID 33으로 맞추기
sudo usermod -u 33 your_username
방법 B: Dockerfile을 커스텀해서 www-data의 UID를 호스트와 맞추기
FROM wordpress:latest
# 호스트 사용자의 UID/GID가 1000이라고 가정
RUN usermod -u 1000 www-data && \
groupmod -g 1000 www-data && \
chown -R www-data:www-data /var/www/html
docker-compose.yml에서 이 Dockerfile을 빌드하도록 지정합니다.
services:
wordpress:
build: .
# image: wordpress:latest 대신 build 사용
...
7. 해결 방법 5: named volume 대신 bind mount 사용 시 주의사항
로컬 폴더를 직접 마운트(bind mount)하는 경우, 호스트 폴더의 권한을 미리 맞춰주는 것이 좋습니다.
volumes:
- ./wp-content:/var/www/html/wp-content
호스트에서 미리 권한을 설정:
mkdir -p ./wp-content
sudo chown -R 33:33 ./wp-content # www-data의 UID/GID인 33으로 지정
리눅스 환경이 아닌 macOS/Windows에서 Docker Desktop을 사용 중이라면, 파일시스템 공유 방식(gRPC FUSE, VirtioFS 등) 특성상 UID 매핑이 자동으로 처리되어 권한 문제가 상대적으로 덜 발생합니다.
8. 권한 문제 예방을 위한 체크리스트
| 점검 항목 | 확인 방법 |
|---|---|
| 컨테이너 내부 프로세스 사용자 확인 | docker exec -it [컨테이너명] id www-data |
| wp-content 소유권 확인 | docker exec -it [컨테이너명] ls -la /var/www/html/wp-content |
| 폴더 권한 755, 파일 권한 644 유지 | find ... -type d -exec chmod 755 / find ... -type f -exec chmod 644 |
| FS_METHOD를 direct로 지정 | wp-config.php에 define('FS_METHOD', 'direct'); 추가 |
| 컨테이너 재생성 후에도 권한 유지되는지 확인 | entrypoint 스크립트 또는 Dockerfile에 chown 반영 |
9. 요약
Docker 기반 워드프레스에서 발생하는 권한 문제의 근본 원인은 컨테이너 내부의 www-data 사용자와 마운트된 파일의 소유자가 다르다는 점입니다. 해결 방법을 상황별로 정리하면 다음과 같습니다.
- 당장 해결:
docker exec로chown -R www-data:www-data실행 - 재현 가능하게 만들기:
docker-compose.yml의 entrypoint에 chown 스크립트 추가 - 가장 근본적인 해결: Dockerfile에서
www-data의 UID/GID를 호스트와 맞추기 - FTP 요청이 계속될 때:
wp-config.php에FS_METHOD‘direct’ 지정
이 네 가지를 조합하면 Docker 환경에서도 플러그인·테마 설치, 미디어 업로드 시 권한 오류 없이 안정적으로 워드프레스를 운영할 수 있습니다.