I assume those saying how hard or awful Docker is, are referring to building images. Docker took me a while to comprehend, because it's so different from how I normally think of software or use a computer. Once it "clicked," it seems easy.
A Docker container is an application run-time environment, a "bubble" within which the environment is controlled, where software and environment variables are independent from the host. Part of that bubble is a temporary disk that contains only what was specified in that image. (Just like in a traditional VM, you can also map folders from the host to exist inside the container.)
This is useful to run software that must behave consistently across different computers. For example, if the program requires a certain version of Java or a particular database client, or if it needs certain tools that you do not want to install on every computer. In one case, I used a Docker image of an older Linux release to host a certain obsolete software product on current Linux, so that we could retire the old server. It also makes it very easy to "reset" to defaults: just kill the container and start it anew.
The other Docker concept that broke my head is the structure of an image. It's not just a snapshot of whatever-you-got-working. It's built up in layers. Your base "CentOS" image is the first layer. Then you installed packages A, B, C and saved the image: another layer. Then you took the previous image and added D, E, F, G and deleted B: another layer. Finally, your new coworker used your latest image and deleted everything except package E. Layer 1 = 1GB. Layer 2 = ABC = 200MB. Layer 3 = DEFG = 300MB + (plus, not minus!) the change from removing B = 400MB. Finally, Layer 4 = changes from removing ACDFG = 400MB. When you deploy your ABC image, it's 1.2GB in size. When your coworker deploys their "only E" image, it's 2.3GB in size. (Then you fix it by basing a new image on Layer 1, and your deployment is 1.1GB.)
In other words, each layer is a delta of the previous one. If you select the appropriate base layer for your image, it's an efficient way to store many images or versions of an image. It's also easy to roll back to previous layers, which is a joy while prototyping.