글쓴이의 컴퓨터 환경은 다음과 같습니다.
사용기기: Macbook pro M1 pro 16GB
사용OS: macOS - Sequoia 15.3
사용 소프트웨어
- Docker Desktop: v4.38.0
- Docker: Docker version 27.5.1, build 9f9e405
- MySQL 컨테이너: mysql:8.0
호스트 머신의 /var/log/mysql 폴더를 만들고 거기다 MySQL 컨테이너에서 발생하는 로그들을 Bind Mount 하려고 했으나 다음과 같은 에러가 발생했었다.

/var가 아닌 다른 경로로 설정하는 것도 하나의 방법이었고, bind mounts 대신 volume mounts를 쓰는 것도 하나의 방법이었겠지만, 일반적으로 Linux에서 가지고 있는 /var 경로 안에서 폴더를 만들어 여기에 로그를 수집하는 방식이 시스템을 구상할 때 일관적으로 유지할 수 있었고 logrotate를 통해서 daily를 기준으로 로그를 나누기 위해서는 호스트 머신에서 명확하게 로그가 저장되어 있는 경로를 알고 있어야 했기에 방법을 계속 연구해보았다.
문제는 호스트 머신에서는 root 계정으로 폴더가 만들어져 있었고 이를 MySQL의 컨테이너가 작성하려고 하는 순간 Permission Denied가 떴었던 거였다. (MySQL 컨테이너가 호스트 머신에 root 계정으로 만들어진 폴더에 대해서 접근할 수 있는 권한이 없었기 때문에 생긴 문제)

그래서 /var/log/mysql에서 소유자를 도커 소켓을 실행하는 계정으로 바꾸고 여기서 해당 계정으로만 접근이 가능하게끔 chmod 700을 적용하였다.

그리고 나서 도커 컴포즈를 다시 실행해보니 로그를 정상적으로 받아오는 것을 확인할 수 있었다.

이후 호스트 머신에서 로그 파일들을 확인할 수 있었고 내용도 잘 작성되어 있는 것을 확인할 수 있었다.

참고 자료
Isolate containers with a user namespace
Isolate containers within a user namespace
docs.docker.com
Storage drivers
Learn the technologies that support storage drivers.
docs.docker.com
Bind mounts
Using bind mounts
docs.docker.com