We take the original definition: “A quantum error-correcting code is defined to be a unitary mapping (encoding) of k qubits (2-state quantum systems) into a subspace of the quantum state space of n qubits such that if any t of the qubits undergo arbitrary decoherence, not necessarily independently, the resulting n qubits can be used to faithfully reconstruct the original quantum state of the k encoded qubits.”
An [[n,k,d]] code is a quantum error correction code which encodes k qubits in an n-qubit state, in such a way that any operation which maps some encoded state to another encoded state must act on at least dd qubits. (So, for example, any encoded state which has been subjected to an error consisting of at most ⌊(d−1)/2⌋ Pauli operations can in principle be recovered perfectly).
This notation generalizes the notation [n,k,d] for classical error correction codes, in which k-bit "plaintext" strings are encoded in n-bit "codeword" strings, in such a way that at least d bits must be flipped to transform between any two codewords representing different plain texts. (In this context and in the quantum case, d is referred to as the code distance.) The double-brackets are used simply to denote that the code being referred to is a quantum error correction code rather than a classical code.
Another way to understand quantum error correcting codes is offered by John Preskill: “A quantum error-correcting code can be viewed as a mapping of k qubits (a Hilbert space of dimension 2k) into n qubits (a Hilbert space of dimension 2n), where n > k. The k qubits are the “logical qubits” or “encoded qubits” that we wish to protect from error. The additional n − k qubits allow us to store the k logical qubits in a redundant fashion, so that the encoded information is not easily damaged.”