So far I've found glMapBuffer and glMapBufferRange (similar to lock operation in directx), but I'm not sure if I understand them right.
When I lock the buffer in DX with flag D3DLOCK_DISCARD I'm sure that if the data in a vertex buffer is currently being used - I will get a new chunk of memory (while GPU keeps using old memory for drawing behind the scenes), will the same happen with glMapBuffer? or should I do it myself? and if so how I should do it? Talking about D3DLOCK_NOOVERWRITE I see it as just mapping the buffer in the range it is not being used, so here glMapBufferRange might work perfectly for the situation.

There's some info on this in the wiki.
glBufferData with NULL as the last argument before mapping will work on all hardware that supports buffer objects, but the other ways are probably neater if you are targeting more recent hardware only.

If you are updating the buffer frequently the most important parameter is the usage, in your case you should use GL_STREAM_DRAW. Alternative to D3DLOCK_DISCARD is GL_MAP_INVALIDATE_BUFFER_BIT but you can use it only in glMapBufferRange. Better way is to use multiple buffers with the flag GL_MAP_UNSYNCHRONIZED_BIT, usually four are enough because the driver GPU queue is usually 2-3 frames behind (use fences for syncing). This solution doesn't involve driver's memory management and will save some CPU time. You can use one big buffer too, with your own address management but don't forget the unsynchronized flag.