There's a few different things you can do to fix this, and there's loads of tutorials about it. I know Blender Guru has done one including the relevant info about subdivision modelling, but there's others as well.
Still, linking something isn't directly answering so I'll do that as well:
The problem here is a lack of controlling geometry. The control mesh that the subsurface is generated of will tend to produce a very rounded subsurface whenever it has a sharp corner, and you can control that by adding extra geometry near the corners. (Specifically you are constraining the size of the rounded corner by adding the extra supporting geometry - it's still there, just very small, effectively a bevel now instead of a huge rounded corner)
The first thing to do is add edge-loops, by default with ctrl + R in edit mode. If you have the subdivision surface displaying in edit mode this is much easier. Push an edge loop near the top of the bottle lid and it will look much much closer to the original. The two downsides to this technique is that it adds geometry and it takes some manual work to put the loops where you need them, but the main advantage is you have perfect control over where that extra geometry goes and exactly how sharp each edge becomes. In some cases Inset faces (I in edit mode) is also useful for this, especially with faces such as the top face on that mesh.
If you have a big mesh and want to automate more, you can use a bevel modifier with an angle limit before (above) the subdivision surface modifier, and this will effectively add edge-loops for you. Keep the bevel low resolution as the subsurf will already be adding more geometry, but play with the offset to adjust the 'sharpness' of the result. This is a lot faster than adding loops manually, but you usually end up with even more added geometry, and you have less control over where exactly unless you fiddle with marking bevel weights and such and I usually find it's easier to just do it by hand at that point.
Lastly and almost least effectively in this particular case, you can use edge creasing (shift + E in edit mode with edges selected) to pull the subdivision surface closer to the control mesh - but this often fails with circular shapes such as the one you've got here, especially with ngons, and for this mesh I wouldn't recommend it. It's a useful thing to practice with as it gives you better control over subdivision surfaces in general but there are some shapes it just won't help with much - experiment with it on this mesh and you'll probably find it's either not helpful or that your lid ends up looking weirdly polygonal. If you ever do have to do this, removing the ngon and using grid fill or some other method for filling in the top will probably work better.
You can of course combine these methods, and often some combination will produce the 'best' result, though it's up to you to determine which set is worth the effort.