Some very basic answers, with the aim of giving you an idea of the big picture:
On the most basic level, you can think of cohomology as a fancy way of counting/classifying holes in an underlying space (although modern offshoots are a bit more general). There are many versions of cohomology which all use the same basic approach, but the most intuitive version for someone who has gone through the usual calculus sequence along with linear algebra and some basic analysis is de Rham cohomology. Homology came first and its goal/description is pretty much the same. The reason for the "co" is that the cohomology is attained (or at least can be attained) by "reversing the arrows" of the homology.
In every version of homology, we have a chain-complex and a $\partial$ operator:
$$
\cdots \to C_{i+1} \overset{\partial_{i+1}}\to C_i \overset{\partial_{i}}\to C_{i-1} \to \cdots
$$
Intuitively, each $C_i$ is meant to encode the $i$-dimensional properties of the space, and the $\partial$ operator takes us from an $i$-dimensional object to an $(i-1)$-dimensional object. The $C_i$ will always be module over some (usually commutative) ring $R$, and the $\partial$s are module homomorphisms. In many versions, the $C_i$ are $\Bbb Z$-modules (abelian groups). In some versions, the $C_i$ are modules over a field (vector spaces). Whatever $C_i$ happens to be, it makes sense to look at the dual object $C_i^* = \operatorname{Hom}(C_i,R)$.
From the homology, looking at those "dual spaces" gives us a co-chain-complex
$$
\cdots \to C_{i-1}^* \overset{d_{i-1}}\to C_i^* \overset{d_i} \to C_{i+1}^* \to \cdots
$$
and this is what one studies in cohomology. Again, each $C_i^*$ encodes the $i$-dimensional properties of the space. $d_{i-1}$ here is the adjoint to $\partial_i$.
I think the most intuitive thing at this point is to look at some examples and see how homology/cohomology does its job of detecting holes. I will be as informal as possible.
In singular homology, the elements $C_n$ are $n$-dimensional "hole-free blobs" (actually, formal sums thereof). In order to take an $n$-dimensional blob and produce an $(n-1)$-dimensional blob, the $\partial$ operator produces the boundary of whichever blob you put in. So, for instance: in $2$-dimensional space, if $\sigma$ encodes a filled-in square, then $\partial(\sigma)$ is (a formal sum which encodes) the perimeter of that square. If $\sigma$ is a line segment, then $\partial(\sigma)$ encodes the endpoints of that line segment. If $\sigma$ is a closed loop (such as our square perimeter from earlier), then $\partial(\sigma)$ is $0$ since there is no boundary.
Note that, whatever your blob, applying $\partial$ twice produces zero. This is an important property behind any system of homology.
So how do we detect holes? We ask the question: for $\sigma \in C_i$, does $\partial(\sigma) = 0$ imply that $\sigma = \partial(\sigma_0)$ for some $\sigma_0 \in C_{i+1}$? In a hole-free space, the answer will be yes. When the answer isn't yes, we know that there's a hole. For our space, let's consider $S = \Bbb R^3 \setminus \{0\}$ ($3$-dimensional space with the origin removed). Suppose that $\sigma$ is sphere centered at the origin. Then $\sigma$ is a $2$-dimensional hole-free blob with $\partial \sigma = 0$. However, there is no $3$-D blob whose boundary is $\sigma$. In particular, any such blob whose boundary is our $\sigma$ would either have to include the disallowed point $0$, or would have a hole in it at $0$. Because such a blob does not exist, we conclude that $S$ contains a hole. In particular, the second homology group satisfies
$$
H_2(S) = \ker(\partial_{2})/\operatorname{im}(\partial_{3}) \neq 0
$$
I hope that clears things up a little.