O Docker foi desenvolvido para S.Os que usam o kernal Linux. No ambiente Linux é possível usar Docker para Desenvolvimento e Produção. Recentemente foi disponibilizado a versão docker para Windows e esta só pode ser usada para Desenvolvimento.
Container
É um binário/arquivo/cápsula que encapsula todo o ambiente necessário para sua aplicação funcionar. O ambiente e sua aplicação serão virtualizados na sua máquina física.
É errado afirmar que um container é uma VM. Uma VM obrigatoriamente terá um S.O(e outros recursos) virtualizados em um software (KMV,VMWare, Virtualbox). Já o container usa os recursos da própria máquina onde está sendo executado. Ele não virtualiza um S.O, ele usa o S.O da máquina hospedeira onde o Docker está instalado e através de alguns recursos disponibilizados pelo hospedeiro é criado toda a estrutura interna do container.
A diferença entre Imagem e Container é que uma imagem é um container parado. Quando essa imagem é executada ela se transforma em um Container. Análogo a uma imagem ISO de um DVD.
Storage Drives
São os caras responsáveis por gerenciar leitura/escrita dos dados no container.
AUFS
Esse foi o primeiro SD (Storage Driver) usado pelo Docker. Ele trabalha com o esquema de camadas:
Toda vez que é instalado um novo software ou adicionado arquivos ao container é criado uma nova camada(imagem) como se fosse formando uma pilha de camadas. É nesse momento que entra o conceito de Copy-on-Write.
Todas as camadas subjacentes são read-only, somente a camada superior é read/write, essa camada também é chamada de Camada Container.
Digamos que você vai editar o arquivo /etc/network/interfaces, esse arquivo está na camada image 1.0 (que é read-only). No momento de salvar a edição esse arquivo é copiado para a primeira camada da pilha(que é read/write), onde é salvo uma cópia dele. Na próximas vezes que você for usar a configuração feita nesse arquivo, o docker vai chamar o da primeira camada da pilha. Isso é o Copy-on-write !