This type of behavior typically occurs when your Component Template is set to dynamic, but your Content Delivery environment and/or Pages are not setup correctly.
For instance, your pages could be using the .html extension, which (by default) will not execute server-side code. Since DCPs get added to the pages on the server-side, the content will not be loaded if your extension is .html. A clear sign that this is happening is that you'll see tags like this:
<tridion:ComponentPresentation [...] />
in your page source in the browser.
Another possible reason is that your Publication Target is configured to use "Language: None", which means that Tridion can't create the required Content Delivery API calls to load your Dynamic Component Presentations.
Yet another possible reason is that you configured your Component Templates to use output format "Jsp" or "Ascx" but didn't configure it properly in your cd_storage_conf.xml on the delivery side.
And the list goes on and on. Adding more detail (for instance, covering the examples I mentioned above) will help us help you.
UPDATE
Just want to mention one of the comments added to this thread by Alvin: Can you make sure your Page and Component Templates are correctly checked in in Tridion? Preview and Template Builder will use the latest version of those templates, but the publisher will only use checked in versions.