Posting a new JSON application definition (e.g. marathon.json) with the same application ID and any other changes will cause Marathon to start a deployment and update the running application.
If you're using a Docker container, Marathon won't necessarily fetch the Docker image again unless you specify a new tag or set the force pull property.
It is good practice to uniquely tag each Docker image. A common way of generating tags is to use the SHA-1 of the commit that it was built from. You can then include this exact tag inside the application definition.
Alternatively, you can stick with using the "latest" tag and set the forcePullImage property as documented here.