You can always use your favourite compiler A to write another compiler, say B. In this B you added some extra functionality, so it can easily become your favourite one, and you will use it for writing compiler C, ...
How to start then?
In the old days people simply filled the memory with the raw numbers to interpret by the CPU directly. This is why source is often referred to as code.
Once a minimal compiler has been programmed this way, it can be executed to create another one written in the language it compiles.
That again can be used to create a higher level one and so forth.
In fact filling raw instruction codes to memory can itself be treated as a zero level compilation process, where the human is the compiler.
It is quite usual that a compiler for a given language is written in the same language. This is the case with the C programming language for example. This is somewhat more than coincidal, because who knows a language good enough to dare writing a compiler for it, likely has this language among his favourite ones to use for programming.
It is simply a typical case though, not necessary as there are many languages to choose from, including ones especially good for compiler construction.