A component diagram shows the various components in a system and their dependencies.
A component represents a physical module of code. A component is often the same as a package, but it may be different, since components represent the physical packaging of code. As such, a single class may be present in multiple components, but that class can be defined in only one package. For example, the Java string class is part of the java.lang package, but it turns up in lots of components.
The dependencies among the components show how changes to one component may cause other components to change. There is quite a range of dependencies that you can use, including communication and compilation dependencies. I often use these kinds of dependencies to show which components communicate with one another.