Воу-воу, сам на днях буду переносить celery в docker.
Но ваш вопрос немного не о том. Он скорее о понимании, как вообще работает celery.
Неужели все содержимое такса каким-то образом передается через брокер и ему неважно, где располагается код? Или передается только имя+сигнатура.
Только описание, какое задание надо выполнить, с какими входными параметрами. Никакого кода не передаётся.
Возьмём Django + Celery.
Типичный, описанный в документации и используемым самим celery для интеграции с django, шаблон использования таков: вы создаёте в django-приложениях файл tasks.py, в котором создаются функции, декорируемые @task. В этих функциях вы описываете логику этих заданий.
В таком случае, веб-приложение и воркеры используют один и тот же код. И в контейнеры django_web и celery_worker надо упаковывать одно и то же. Просто запускаться это будет по разным сценариям: django_web будет обрабатывать http-запросы, celery_worker будет обрабатывать поступающие задания.