Na teoria não precisa, mas é mais fácil se fizer.
Por exemplo, pra rodar um container com o MySQL você pode só usar esse comando no seu terminal:
docker run -d --name NOME_IMAGEM -e MYSQL_ROOT_PASSWORD=SENHA(root) -p 3307:3306 mysql
Mas se você fizer um Dockerfile:
# Usar a imagem oficial do MySQL
FROM mysql:latest
# Definir a senha para o usuário root do MySQL
ENV MYSQL_ROOT_PASSWORD=SENHA(root)
# Expor a porta 3306 para permitir conexões externas
EXPOSE 3306
Então é só rodar algo como:
docker compose up -d --build
// ou
docker build -t nome_da_imagem .
docker run -d --name nome_do_container -p 3307:3306 nome_da_imagem
Ai depende mais do que você prefere, porém pra acostumar, acho que é legal ir fazendo sempre no Dockerfile, fica tudo muito mais organizado. Só que vai da necessidade/complexidade do seu problema.