A note on Kubernetes
Docker Swarm is a very popular container orchestrator, but it isn't the only one. Kubernetes is one alternative that has seen huge growth, with most public clouds now offering a managed Kubernetes service. At the time of writing this book, Kubernetes is a Linux-only orchestrator, with Windows support still in beta. You are likely to hear a lot about Kubernetes on your container journey, so it's worth understanding how it compares to Docker Swarm.
First, the similarities – they are both container orchestrators, which means they are clusters of machines that take care of running containers in production at scale. They both run Docker containers, and you can use the same Docker images with Docker Swarm and Kubernetes. They are both built on open source projects and conform to the Open Container Initiative (OCI), so there's no concern about vendor lock-in. You can start with Docker Swarm and then move to Kubernetes, and vice versa, without changing your apps.
Now, the differences. Docker Swarm is very simple; you can describe a distributed application to run in containers on swarm in just a few lines of markup. To run the same app on Kubernetes, your application description would be four times as much markup, or even more. Kubernetes has many more abstractions and configuration options than swarm, so there are some things you can do with Kubernetes that you can't do with swarm. The cost of that flexibility is complexity, and the learning curve for Kubernetes is very much steeper than for swarm.
Kubernetes will support Windows soon, but it's not likely to offer full feature compatibility between Linux servers and Windows servers for some time. Until then, it's fine to use Docker Swarm – Docker has hundreds of enterprise customers running their production clusters on Docker Swarm. And if you do find Kubernetes has some extra features that you need, it will be much easier to learn Kubernetes once you have a good understanding of swarm.