Docker 가 모든 요소를 컨테이너 단위로 표준화했음에도 불구하고,
"내 컴퓨터에서는 잘 되는데" 를 다른 컴퓨터에서 재현하지 못하는 경우도 있어?
하드웨어 아키텍처 불일치:
최신 Mac(Apple Silicon(ARM64))에서 도커 컨테이너를 빌드한 후,
Intel(x86_64) 칩이 탑재된 구형 클라우드 서버에서 실행하려고 할 때,
컨테이너 내부의 컴파일된 바이너리가 제대로 크로스 컴파일되지 않은 경우, 충돌할 수 있다.
커널 의존적 코드:
컨테이너는 호스트 머신의 리눅스 커널을 공유한다.
코드가, 호스트의 구형 OS에서 지원하지 않는, 최신 커널 기능에 의존하는 경우, 오류가 발생한다.
도커 컨테이너는 리눅스 커널 위에서 실행된다. 리눅스 커널에 내장되어 있는 기능을 이용한다.
윈도우에는 Windows NT 커널이, 맥OS에는 XNU 커널이 있다.
근데 어떻게 Docker를 실행할 수 있을까?
백그라운드에서 리눅스 VM 을 가동하기 때문이다.
맥에서 Docker 컨테이너를 실행할 때, 백그라운드의 리눅스 VM 안에서 실행된다.
컨테이너는 맥OS와 직접 통신하지 않는다.
"리눅스가 아닌" 컨테이너도 있다. 윈도우 컨테이너.
Windows Server 에서 Docker 를 실행하는 경우, 윈도우 컨테이너를 생성할 수 있다.
그 컨테이너는 Windows 커널을 공유하며 네이티브 Windows APP(ex. .NET Framework, IIS 웹 서버)를 실행한다.
하지만 리눅스 호스트에서 윈도우 컨테이너를 실행할 수는 없다.
로컬 docker 캐시
현실은 카오스 세계인데, CPU cache 에서 temporal/spatial locality 경향성이 발견된다는 게 신기하다.