There is basically two ways:
1) Have a background, static or generated once, and draw dots or minisprites on top of it. It is cheaper because you don't need to draw the whole world twice, but needs a bit more code.
2) Using a secondary viewport that renders the world zoomed out. That one is easier but can be performance-hungry depending on how many things your world contains. Also, it might not look exactly like you expect, for example you usually want to see clearly on the minimap, but because it's just a zoomed-out viewport you'll see a tiny pixel mash of the real world, not always good to distinguish objects.
You can take these two approaches and try what is best for you, because there is no "best" solution and it depends a lot on what you want to do exactly, not all minimaps are the same.
For a minimap that really renders the world a second time, you actually need two viewports:
One that renders the world, and ONLY the world (not the GUI),
One that renders the same world but on a smaller rectangle (the minimap).
The first viewport will have your game world as a child, with one camera for the player and another one for the minimap.
For the complete setup you can have a look at the the split-screen example, that you can find here: https://github.com/godotengine/godot-demo-projects/tree/master/2d/split_screen_platformer
Why split-screen? Well, your minimap is like a second screen then^^
Take your time to understand (I'm discovering it too btw), it requires a bit of scripting and tinkering with the options, but if you really want to draw the world twice, that's what you are looking for.