O docker commit e o Dockerfile são duas abordagens distintas para criar e gerenciar imagens Docker. Aqui está uma comparação detalhada entre os dois:
Critério
docker commit
Dockerfile
Propósito
Captura o estado atual de um contêiner e cria uma nova imagem a partir dele.
Define uma receita para construir uma imagem do zero, de maneira automatizada.
Uso
Quando mudanças manuais foram feitas em um contêiner e você deseja salvá-las.
Para criar imagens reprodutíveis e versionadas, ideal para ambientes de CI/CD.
Reprodutibilidade
Baixa, pois captura um estado específico que pode ser difícil de replicar.
Alta, pois todas as etapas são codificadas e podem ser repetidas facilmente.
Manutenção
Difícil, pois mudanças manuais não são documentadas explicitamente.
Fácil, pois as instruções estão em um arquivo de texto, facilitando o controle de versão.
Controle de Versão
Limitado, a menos que as mudanças sejam documentadas manualmente.
Completo, usando sistemas de controle de versão como Git para rastrear mudanças.
Flexibilidade
Flexível para mudanças ad-hoc ou experimentais.
Flexível para construções automatizadas, mas requer planejamento prévio.
Performance e Eficiência
Pode resultar em imagens maiores e não otimizadas.
Permite otimizar o processo de construção e criar imagens mais eficientes.
Conclusão:
Use docker commit se você precisar capturar rapidamente o estado de um contêiner após modificações manuais, especialmente para experimentos ou testes rápidos.
Use Dockerfile para construir imagens de maneira organizada, reprodutível e eficiente, especialmente em ambientes de produção ou em equipes onde a manutenção e o controle de versão são importantes.
Laboratório
Image construída a partir do Dockerfile:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
conversao-temperatura-dockerfile latest 4c32eaa602c1 6 hours ago 381MB
$ pwd
/tmp/devops-conversao-temperatura/src
$ docker container ls
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de1ed911391f ubuntu "/bin/bash" 3 minutes ago Up 3 minutes gifted_matsumoto
$ docker container cp . de1ed911391f:/app
Successfully copied 127kB to de1ed911391f:/app
root@de1ed911391f:/# ls
app boot etc lib media nodesource_setup.sh proc run srv tmp var
bin dev home lib64 mnt opt root sbin sys usr
root@de1ed911391f:/# cd /app
root@de1ed911391f:/# ls
Dockerfile config convert.js package-lock.json package.json server.js test views
root@de1ed911391f:/# npm install
added 153 packages, and audited 154 packages in 3s
27 packages are looking for funding
run `npm fund` for details
4 vulnerabilities (2 moderate, 2 high)
To address all issues, run:
npm audit fix
Run `npm audit` for details.
root@de1ed911391f:/# exit
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de1ed911391f ubuntu "/bin/bash" 7 minutes ago Exited (0) 3 seconds ago gifted_matsumoto
$ docker commit de1ed911391f conversao-temperatura-commit
sha256:d5d8908eba2872acef16e4dfcd8644b102820988c1d006f28bd216842ca02ce0
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
conversao-temperatura-commit latest d5d8908eba28 14 seconds ago 381MB
conversao-temperatura-dockerfile latest 4c32eaa602c1 7 hours ago 381MB
Comparação da imagem construída entre o Docker Commit e o Dockerfile:
$ docker history d5d8908eba28
IMAGE CREATED CREATED BY SIZE COMMENT
d5d8908eba28 59 seconds ago /bin/bash 303MB
edbfe74c41f8 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:c2e78eb585ec4e503… 78.1MB
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ARG RELEASE 0B
$ docker history 4c32eaa602c1
IMAGE CREATED CREATED BY SIZE COMMENT
4c32eaa602c1 7 hours ago ENTRYPOINT ["node" "server.js"] 0B buildkit.dockerfile.v0
<missing> 7 hours ago RUN /bin/sh -c npm install # buildkit 26.3MB buildkit.dockerfile.v0
<missing> 7 hours ago COPY . . # buildkit 116kB buildkit.dockerfile.v0
<missing> 7 hours ago WORKDIR /app 0B buildkit.dockerfile.v0
<missing> 7 hours ago RUN /bin/sh -c apt-get update && apt-get… 276MB buildkit.dockerfile.v0
<missing> 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:c2e78eb585ec4e503… 78.1MB
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ARG RELEASE 0B
O Dockerfile possui mais camadas o que proporciona mais aproveitamento para outras imagens. Maior eficiência.