
따라서 이러한 의존성 문제를 해결하고, 특정 컴포넌트를 변경하더라도 다른 컴포넌트에는 영향을 주지 않으면서도 운영체제와는 호환이 가능하도록 하는 무언가가 필요했다.

docker 컨테이너란 완전히 분리된 환경으로서 각각의 운영체제, 프로세스, 서비스, 네트워크 인터페이스를 가지고 각각의 다른 가상머신처럼 동작하지만 모두 같은 하나의 kernel에서 동작하는 환경을 말한다.
즉, 도커가 설치된 하나의 인스턴스가 있다고 할 때, 이 인스턴스에 설치된 호스트 운영체제가 있고, 이 운영체제의 하나의 커널 위에서 여러 컨테이너가 동작하게 된다.
(자세한 설명은 아래를 참고)
모든 운영체제는 커널과 소프트웨어로 구성된다.

ubuntu,fedora, suse, centOs와 같은 모든 운영체제는 모두 같은 Linux 커널을 기반으로 하지만, 일부 다른 커스텀 sw로 인해 서로 다른 운영체제가 된다.
즉, 이 개념을 빌려서 도커 컨테이너를 다시 한번 설명하자면, 각각의 도커 컨테이너는 모두 하나의 같은 kernel에서 동착하고, 이 컨테이너들은 각각의 다른 os를 가질 수 있음. 모든 운영체제는 같은 linux 커널을 기반으로 하고, 일부 다른 커스텀 sw를 가지고 있는 것이므로, 각각의 컨테이너가 서로 다른 운영체제를 가지고 있다고 하더라도, 그 운영체제는 하나의 같은 host 운영체제의 linux kernel위에서 동작할 수 있으므로 여러개의 도커 컨테이너가 실행 가능하게 된다.
즉, 도커 컨테이너는 모든 운영체제와 호환되는 도커 호스트의 기반 커널을 활용한다.

** 그러나 이러한 같은 linux 기반의 커널을 사용하지 않는 운영체제에는 windows가 있다.
즉, linux가 설치된 도커 호스트에서는 windows 기반 컨테이너를 실행할 수 없게 되므로 별도의 조치가 필요하다.

하나의 기반 하드웨어가 있고, os가 존재하고, docker가 존재하고, 그 위에 각각의 의존성과 라이브러리를 포함한 컨테이너가 존재한다.

하나의 기반 하드웨어가 있고, 그 위에 하이퍼바이저가 존재하며, 그 위에 가상머신이 존재한다. 컨테이너와의 차이점은 컨테이너는 같은 os위에서 동작하지만(하나의 같은 os 커널), vm의 경우, 하드웨어 위에 존재하는 각각의 vm마다 서로 다른 os(서로 다른 여러개의 커널)를 가지고 동작한다.
가상 머신은 매우 무겁고 용량을 많이 차지하고, 그 용량이 GB에 달하는 반면
컨테이너는 MB에 달하는 매우 가볍고 적응 용량을 차지한다.
또한 가상 머신은 운영 체제 전체를 부트해야하기 때문에 시작 시간이 많이 걸리는 반면, 도커 컨테이너를 부트하는데는 몇초밖에 걸리지 않는다.
그러나 한가지 중요한 점은, docker는 완전히 분리되지 못하는데, 이는 컨테이너 간 공유하는 커널과 같은 리소스가 많기 때문이다. 반면 가상 머신은 기반 운영 체제가 커널에 의존하지 않고 완전히 독립적으로 동작할 수 있다.

두가지 중 하나를 무조건적으로 사용해야 한다는 개념이 아니라, 각각의 이점을 필요에 따라 사용해야 한다.
간단히 설명하자면, 이미지를 만들어 이름을 붙혀 docker hub에 저장하고, 도커 hub에 저장된 이미지를 다운로드 받아 run하여 실행할 수 있다. 많은 기업에서는 자사의 제품을 도커 hub에 올려놓는다.
이미지는 컨테이너를 만드는데 사용되며, 컨테이너는 그런 이미지 인스턴스가 실행되는 공간으로 각각의 환경과 프로세를 지니고 있다.
예전에는 개발팀이 개발을 마무리하면, 운영팀에 전달해 배포한 뒤 제작된 환경에서 관리했으며, 개발팀에서 호스트 설정과 필요 설치 사항, 의존성 구성 등을 넘겨줬음. 운영팀은 직접 개발을 한 것이 아니기 때문에, 환경을 구성하고 설정하고 또 오류가 발생했을 때 이것을 수정하고 고치는데 매우 애를 먹었음.
그러나 docker 덕분에 예전에는 지침으로 넘겨줬던 사정을 docker 파일에 담아서 이미지를 생성할 수 있게 되었고, docker가 설치된 환경이라면 이 이미즈를 다운로드 받아 실행할 수 있었다. 따라서 운영팀에서 제작 환경과 동일한 환경을 구축할 필요도 없게 되었고, 구축 단계에서 이미지는 이미 완성이 되어 운영팀에서 이를 수정할 필요가 없어졌으므로, 제작 환경과 동일한 동작을 배포 환경에서도 보장할 수 있게 되었다.