도커 이미지는 한 번 작성하고 여러 곳에서 쓸 수 있는 것이 아닙니다. Docker image is not WORA(Write Once Run Anywhere)
Docker Image is not WORA
배경
각설하고 배경을 말씀드리겠습니다.
회사 프로젝트 업그레이드 테스트를 도커 환경에서 하기 위해서 도커로 베이스 이미지 🧱를 만들었습니다.
그 후 만들어 놓은 베이스 이미지🧱를 private registry에 올리고 다른 서버 노드(도커엔진이 설치된)에서 해당 이미지를 가져와 컨테이너로 실행시켰습니다.
실행시키는 것 까지는 별 문제 없어보였으나, 업그레이드 테스트를 시도하니까 아래에서 설명할 내용처럼 에러가 났습니다.
분명 private registry에 올리기 전에는 잘 됐습니다.
분명 도커 이미지를 한 번 올려놓으면 어디서든 동일하게 격리된 상태로 동작해야되는 게 맞지 않나? 무슨 환경을 타나 했습니다. 🌳
현상
일반적인 애플리케이션 분석하듯 로그를 보니까 특정 파일이 없다고 나옵니다.
확인하니까 아래와 같이 빨간색 파일로 나옵니다.
리눅스에서 이런 파일의 경우 broken file 또는 corrupted file 이라고 하나봅니다.
어찌됐든 파일이 손상되었다는 걸로 이해했습니다.
원래 이미지에서도 이런가 해서 이미지를 만들었던 서버 노드에서 컨테이너를 띄웠는데 정상적인 파일이었습니다.
해당 파일은 그닥 중요하지 않은 파일이라서 그냥 지워버렸습니다.
근데 저것들만 그런게 아니라 계속 곳곳에 생기는 현상이 있었습니다.
실행하면서 빨간색 파일, 그러니까 어디 빨간색 파일있나 하고 디렉토리를 막 찾아볼 때는 괜찮다가 뭔가 하려고하면 깨진 파일로 변하는 것이었죠.
아래 그림처럼 임시파일도 깨지고...
아래 그림처럼 자바 파일도 깨지고...
뭐 이런 파일들을 다 지우고 다시 실행하면 또 깨지고... 그랬습니다...
해결
대중적인 사례는 아니었습니다. 💣
대중적인 사례의 경우 스택오버플로우 뿐만 아니라 여러 곳에서 언급이 되어 정리가 잘 되어있을텐데 그렇지 않았습니다.
그러던 중에 찾은 해결 방법에 관련된 링크는 아래와 같습니다.
정리하자면, 도커 버전에 따라? 스토리지 드라이버에 따라? 같은 이미지가 실행이 될 수도 있고 안 될 수도 있는 것이었습니다.
아래 그림으로 비교해보면 알 수 있습니다.
docker info
명령어를 날려보면 나오는 화면인데요.
오른쪽에 docker version이 20.10.0-rci 이고 storage driver가 overlay2인 도커를 이용하여 이미지를 만들고 왼쪽에 있는 docker version이 17.05.0-ce? 이고 storage driver가 overlay인 곳에서 이미지를 컨테이너로 인스턴스화 했더니 그랬던 것이었습니다. = 도커 엔진(환경)에 차이가 있었음.
아마 역으로 이미지를 만들어도 안 되지 않을까 합니다만 테스트하진 않았습니다.
좀 더 집요하게 연구를 하려면 도커 storage driver에 따라 어떻게 동작하길래 저런 파일이 생기는지 확인을 해볼 필요가 있지만, 업무상 일단 처리하는 게 우선이므로...(핑계)
도커 버전, 스토리지 드라이버를 맞춰줘서 해결했습니다.
결론
이런 경우가 굉장히 드물어 보입니다만, 도커 이미지를 한 번 만들어 놓고 어디서든 실행이 가능하겠지라고 생각하면 안 되는 것을 배웠습니다.
스토리지 드라이버와 버전등의 환경을 동일하게 잡아주는 세팅이 필요한 것으로 보입니다.
→ 잘못된 점이 있으면 댓글 달아주시면 감사하겠습니다!!