본문 바로가기

전체 글88

[docker] Docker 레이어 캐시 - 빌드가 느리고 이미지가 큰 이유 Dockerfile 의 한 줄이 레이어 하나다. 순서만 바꿔도 재빌드가 6~8초에서 0~1초가 되고, .dockerignore 하나로 이미지가 255MB에서 171MB가 된다.Dockerfile 을 만들어 빌드까지는 됐는데, 코드 한 줄만 고쳐도 매번 pip install 이 처음부터 다시 돌아 몇 분씩 기다립니다. 만들어진 이미지도 몇백 MB 라 배포할 때마다 오래 걸립니다. Docker 레이어 캐시를 잘 쓰라는 말은 봤는데, 무엇을 어떤 순서로 놔야 하는지가 감이 안 옵니다. 이 글은 Dockerfile 을 한 번이라도 써 본 사람을 전제한다. FROM·WORKDIR·COPY·RUN·CMD 가 각각 무엇인지부터라면 같은 폴더의 「Docker - 이미지 빌드 & Dockerfile 심화」 2절을 먼저 .. 2026. 8. 30.
[docker] Docker 운영 - 로그·재시작·헬스체크·디스크 컨테이너를 띄운 뒤에 챙겨야 하는 것들. 로그 무제한 증가, 재시작 정책, 헬스체크, OOM 종료, 디스크 정리를 실제 출력으로 확인한다. 개발용으로 쓰던 Docker 를 작은 서버에 올려 며칠 굴렸더니 디스크가 가득 찼습니다. 컨테이너 하나는 어느 순간 사라져 있는데 로그에는 아무 흔적이 없고, 다른 하나는 docker ps 에 Up 이라고 나오는데 요청은 계속 실패합니다. Docker 운영에서 무엇부터 봐야 하는지를 모르겠습니다.이 글은 증상에서 출발한다. 같은 폴더의 「Docker - 컨테이너 실행 & 런타임 심화」가 로그·리소스·재시작 옵션을 항목별로 정리한 레퍼런스라면, 여기서는 '디스크가 찼다'·'컨테이너가 사라졌다'·'Up 인데 요청이 실패한다' 같은 증상에서 시작해 무엇을 찍어 봐야 하는지.. 2026. 8. 29.
[java/spring] Log4j2 - 자리표시자는 인자 계산까지 막아 주지 않는다 스프링 부트의 기본 로깅은 Logback이라 Log4j2로 바꾸려면 먼저 빼야 할 것이 있다. 롤링은 세대 수와 보존 기간을 함께 정해야 디스크가 차지 않는다. 새벽에 디스크 사용률 경보가 울렸습니다. 들어가 보니 로그 파일 하나가 수십 기가로 자라 있습니다. Log4j2 롤링은 걸어 뒀는데 오래된 파일이 하나도 지워지지 않았습니다. 급한 불을 끄고 설정을 열어 보니, 세대 수는 정해 뒀지만 보존 기간을 정한 자리가 비어 있었습니다.스프링 부트에서 Log4j2로 바꾼다는 것스프링 부트는 아무 설정을 하지 않아도 로깅이 동작합니다. spring-boot-starter-web 이 spring-boot-starter-logging 을 끌고 오고, 그 안에 Logback이 들어 있기 때문입니다. 코드에서 부르는.. 2026. 8. 29.
[java] LocalDateTime이 배열로 나올 때 - Jackson 설정 세 가지 날짜 타입은 모듈을 등록해야 직렬화되고, 등록만 하면 숫자 배열이 된다. null 제외와 이름 전략까지 세 가지가 자주 손대는 설정이다. API 응답에 날짜를 넣었더니 [2026,8,7,9,30] 같은 배열로 나옵니다. 프런트엔드에서 파싱이 안 된다고 합니다. 어떤 프로젝트에서는 "2026-08-07T09:30:00"으로 잘 나오는데 무엇이 다른지 모르겠습니다. null 필드를 빼거나 필드 이름을 스네이크 케이스로 바꾸는 것도 어디서 설정하는지 헷갈립니다. Jackson 설정을 어디에 두는 것인지부터 모르겠습니다.날짜는 세 단계를 지난다Jackson은 자바 8의 날짜 타입을 기본으로 모릅니다. 별도 모듈에 들어 있기 때문입니다. 모듈 없이 직렬화하면 예외가 나면서 친절하게도 무엇을 추가하라고 알려 줍니다.. 2026. 8. 29.
[docker] Docker 볼륨과 바인드 마운트 - 컨테이너를 지워도 남는 데이터 컨테이너 안에 쓴 데이터는 컨테이너와 함께 사라진다. 볼륨과 바인드 마운트가 같은 자리에서 정반대로 동작한다는 점까지 실행해 확인한다. Postgres 컨테이너를 띄워 잘 쓰다가 옵션을 바꾸려고 지우고 다시 만들었더니 데이터베이스가 비어 있었습니다. Docker 볼륨을 붙이라는 말은 봤는데 -v 뒤에 이름을 쓰는 것과 경로를 쓰는 것이 무슨 차이인지 모르겠고, 개발할 때 소스를 마운트했더니 이번에는 컨테이너 안에 있어야 할 파일이 사라져 있었습니다.컨테이너를 지우면 데이터도 사라진다컨테이너는 이미지 위에 쓰기 레이어를 한 겹 얹어 시작하고, 안에서 만든 파일은 전부 그 레이어에 들어갑니다. 그 레이어는 컨테이너의 일부라서 docker rm 과 함께 없어집니다. 서두의 '지우고 다시 만들었더니 비어 있더라.. 2026. 8. 28.