Thanks for all the great replies!
At my job, we run goharbor.io and use its Replications feature to do just that.
For most of you suggesting hosting a repository - yes but,
Host forgejo. Just host the git mirror. It comes with a package repo out of the box. Then you have the source code and the docker images
An alternative method is to run an actions workflow that syncs from upstream images directly, like what Forgejo actually do.
Isn’t a Docker registry just HTTP? Would a caching proxy be too hard to use for this?
Just use a sonatype nexus 3 image and proxy docker hub, etc. Then you pull images through it.
Sorry for the link dump - I just glanced over the content and it seems like this might help you:
https://www.warpbuild.com/blog/docker-mirror-setup
https://medium.com/@shaikrish27/deploying-a-docker-registry-mirror-as-a-container-59565ff92c48
https://blog.alexellis.io/how-to-configure-multiple-docker-registry-mirrors/