Various ways in various companies, but in my last few companies pretty much always “CI runs tests and builds/uploads a Docker image, CD deploys it onto a K8s cluster somewhere.”
Here, I do a canary deploy to a dev server (jonline.io), then cut a GitHub release and deploy to production servers (bullcity.social, oakcity.social). (All really live on the same single-box dinky K8s cluster.)