Como tudo na computação, Docker não é onipotente, e muitas vezes precisa sacrificar desempenho por facilidade de uso ou vice-versa. Vemos aqui algumas vantagens e desvantagens do sistema.
Como os containers não possuem acesso direto ao hardware da máquina, o daemon do Docker precisa intermediar toda a comunicação entre as duas partes. Portanto, o Docker é responsável por receber e encaminhar cada pedido de conexão à Internet feito por esses containers. Como um servidor Docker pode possuir diversas instâncias de containers ativas, ele precisar realizar um mapeamento de portas, ou port forwarding, para impedir que as origens e destinos de cada pacote esteja correto.
O servidor do Docker utiliza port forwarding para poder servir corretamente as conexões de entrada e saída de cada container. Dessa forma, se mais de um container utiliza a porta 80 para alguma troca de mensagens pela rede, por exemplo, o host do Docker mapeia diferentes portas para estes containers, de modo que as mensagens de e para cada um deles seja encaminhada corretamente, como na figura abaixo.
Como todas as tecnologias, há vantagens e desvantagens de se usar Docker ao invés de outras tecnologias como uma máquina virtual.
Uma máquina virtual oferece mais isolamento e garante recursos de hardware, porém demora mais para ser iniciada, e é mais pesada(o que torna sua escalabilidade problemática).
Por outro lado, executar um projeto em uma imagem do Docker é mais vantajoso do que executá-lo em um ambiente de produção normal, pois estes estão sujeitos a atualizações e outras coisas que mudam seus estados entre diferentes usuários. Imagens, por sua vez, podem ser compartilhadas entre todos os desenvolvedores, o que tornaria o ambiente de produção em containers bem mais uniforme e de fácil manutenção.
Uma possível desvantagem do Docker se encontra no fato de que, como este divide recursos entre outros containers e outros processos do sistema que o executa, uma aplicação que necessite por exemplo de um alto consumo de CPU terá seu desempenho prejudicado, comparado a executá-la em uma VM ou uma máquina comum. Além disso, a comunicação entre o container e seu host, e o mapeamento de rede necessário para enviar os pacotes aos seus destinos corretos também impacta na performance de seus processos.
Outra desvantagem é a dificuldade na persistência dos dados, pois containers são elaborados para apagar totalmente seus arquivos quando são desligados, portanto qualquer armazenamento de dados para uso futuro teria que ser feito em algum outro lugar.
Além disso, o Docker foi criado com o intuito de executar aplicações de servidor que não necessitam de interfaces gráficas, portanto uma aplicação que precisa ser visualmente utilizada não seria própria para ser usada com a plataforma.