fundo
Um contêiner do Docker executa um processo (o "comando" ou "ponto de entrada") que o mantém ativo. O contêiner continuará sendo executado enquanto o comando continuar sendo executado.
No seu caso, o comando ( /bin/bashpor padrão, centos:latestativado) sai imediatamente (como o bash faz quando não está conectado a um terminal e não tem nada para executar).
Normalmente, quando você executa um contêiner no modo daemon (com -d), o contêiner está executando algum tipo de processo daemon (como httpd). Nesse caso, enquanto o daemon httpd estiver em execução, o contêiner permanecerá ativo.
O que você parece estar tentando fazer é manter o contêiner vivo sem que um processo daemon seja executado dentro do contêiner. Isso é um pouco estranho (porque o contêiner não está fazendo nada útil até você interagir com ele, talvez com docker exec), mas há certos casos em que pode fazer sentido fazer algo assim.
(Você quis chegar a um prompt do bash dentro do contêiner? Isso é fácil! docker run -it centos:latest)
Solução
Uma maneira simples de manter um contêiner ativo no modo daemon indefinidamente é executar sleep infinitycomo o comando do contêiner. Isso não depende de coisas estranhas, como alocar um TTY no modo daemon. Embora dependa de fazer coisas estranhas, como usar sleepcomo seu comando principal.
$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d651c7a9e0ad centos:latest "sleep infinity" 2 seconds ago Up 2 seconds nervous_visvesvaraya
Solução alternativa
Conforme indicado por cjsimon, a -topção aloca um "pseudo-tty". Isso ajuda a continuar executando indefinidamente, porque pensa que está conectado a um TTY interativo (mesmo que você não tenha como interagir com esse TTY em particular, se não for aprovado -i). De qualquer forma, isso também deve funcionar:
$ docker run -t -d centos:latest
Não tenho 100% de certeza se -tproduzirá outras interações estranhas; talvez deixe um comentário abaixo, se houver.