basic difference between canonical isomorphism and isomorphims
Great question. Canonical is more a term of art than a word with a strict mathematical definition. It's sometimes used as a synonym for “natural” or “obvious,” although natural is yet another idiom and obvious is in the eye of the beholder. You might think of it as meaning independent of any choices.
It sounds like you're in an abstract algebra class now, but hopefully this linear algebra example will make sense. Let $V$ be a vector space over $\mathbb{R}$ of dimension $n$. By choosing a basis $(v_1,\dots,v_n)$, $V$ is isomorphic to $\mathbb{R}^n$. What is the isomorphism? It takes $v\in V$, decomposes it into $\alpha_1 v_1 + \dots + \alpha_n v_n$, and assigns to $v$ the $n$-tuple $(\alpha_1,\dots,\alpha_n)$.
Through the isomorphism to $\mathbb{R}^n$, all vector spaces of the same dimension are isomorphic to each other, but not for any good reason, and not in any natural way. The isomorphism depends on the choice of basis.
Let $V^*$ be the dual space to $V$, that is, the vector space of linear functions $V \to \mathbb{R}$. Once you choose a basis of $(v_1,\dots,v_n)$, you can form a dual basis $(\lambda_1,\dots,\lambda_n)$ of $V^*$, such that $\lambda_i(v_j) = \delta_{ij}$. So $V$ and $V^*$ are isomorphic, but not canonically so.
Now let $V^{**}$ be the dual space of $V^*$. Elements of $V^{**}$ are linear functions from $V^*$ to $\mathbb{R}$. One way to create such a map is to select $v \in V$ and send $\lambda \in V^*$ to $\lambda(v)$. This association extends to a linear map $$ f \colon V \to V^{**},\ f(v)(\lambda) = \lambda(v) $$ By a dimension count, this map has to be an isomorphism. And, we didn't have to choose a basis to create it. For this reason, we say that $V$ and $V^{**}$ are canonically isomorphic.
Too much for a comment, but there some things I do not see mentioned in the existing answers and comments. "Natural" and "canonical" have related but somewhat different meanings in mathematics. This doesn't mean everyone uses them perfectly in accordance to those meanings. But this is a common usage. I'll start out with "natural" first, then bring in "canonical".
The term natural actually has a precise mathematical meaning, defined in Category theory. In fact, Category theory was originally invented to define what "natural" means. (The first step to studying something is to define it, and once you've defined "natural transformations", you can use them to define "natural" more broadly.)
An intuitive grasp of "natural" is that it means something is definable by the generic properties of objects in the theory under study, rather than by properties of the specific objects for which the thing is being defined.
As Matthew Leingang has discussed, finite dimensional real vector spaces are isomorphic to their dual spaces. But in order to have such an isomophism, we have to pick a basis for the vector space. The isomorphism requires something specific to this vector space in order to define it. But we don't require that to define this isomorphism $\phi$ of a vector space with its second dual. We can define just from the definition of "dual of a real vector space": $$\forall v \in V, f \in V^*, \phi(v)(f) := f(v)$$ That is why $\phi$ is "natural".
But note this weasel wording in the description above: "in the theory under study". This is why "natural" becomes a word of art, rather than of precision: most of the time, we don't bother to lay out the category that allows a precise definition of "natural". That is left to our audience to deduce. You see, a little tightening of the category under discussion will suddenly turn the unnatural into natural. In finite-dimensional linear algebra, $V$ is not naturally isomorphic to $V^*$. But in the theory of matrices, a column space is naturally isomorphic to a row space by transposing, even though the row space is natually isomorphic to the dual of the column space.
When someone calls something "natural", you have to figure out in what context they are speaking. And this is where "canonical" comes in. When we call something "canonical" when there is a familiar (and obvious) context where it is natural, but we are (usually) working in a broader context where it is not natural. For example, the canonical basis of $\Bbb R^n$ is natural when discussing matrices and column spaces - so natural we don't even mention it, even though it underlies practically everything we do. But if we are considering $\Bbb R^n$ as an example of a vector space, then it is not natural, but is defined by non-vector-space properties of $\Bbb R^n$. So we use "canonical" to describe it instead.
I agree with @MatthewLeingang that this is an excellent question. A canonical isomorphism is one that comes along with the structures you are investigating, requiring no arbitrary choices. Here's another example from abstract algebra.
Whenever you have a surjective group homomorphism $\sigma: G \to H$ there is a natural isomorphism $$ \phi : G/(\ker \sigma) \to H $$ defined by setting $\phi (C) = \sigma(g)$ for any $g \in C$. Here $C$ is a coset of the kernel of $\sigma$ and the value of $\phi$ is independent of the choice of $g \in C$.
When $\sigma$ is not surjective this defines a canonical injective homomorphism.