Clustering dengan Docker Swarm

Tutorial ini memperkenalkan pengembang Java ke Docker Swarm. Anda akan mempelajari mengapa begitu banyak toko perusahaan mengadopsi pengembangan yang dikelola kontainer melalui Docker, dan mengapa pengelompokan merupakan teknik penting untuk bekerja dengan kontainer Docker. Anda juga akan mengetahui bagaimana dua teknologi pengelompokan Docker yang populer - Amazon ECS dan Docker Swarm - membandingkan, dan mendapatkan panduan cepat untuk memilih solusi yang tepat untuk toko atau proyek Anda. Tutorial diakhiri dengan demonstrasi langsung menggunakan Docker Swarm untuk mengembangkan dan mengelola cluster perusahaan dua node.

Baca sekarang: Pengembangan yang dikelola container dengan Docker

Sebaiknya Anda terbiasa dengan pengembangan yang dikelola container dan dasar-dasar Docker sebelum mempelajari Docker Swarm. Ada ikhtisar di bawah ini, tetapi lihat pengantar saya ke Docker untuk diskusi yang lebih mendalam. Pengembang yang memahami dasar-dasar ini harus melompat ke bagian berikutnya.

Apa masalahnya dengan Docker?

Docker adalah platform terbuka untuk membangun, mengirim, dan menjalankan aplikasi terdistribusi. Aplikasi Docker dapat berjalan secara lokal di mesin pengembang, dan dapat diterapkan ke produksi di seluruh infrastruktur berbasis cloud. Docker cocok untuk perkembangan cepat dan memungkinkan integrasi berkelanjutan dan penyebaran berkelanjutan seperti yang hampir tidak dilakukan teknologi lain. Karena fitur-fitur ini, ini adalah platform yang harus diketahui oleh setiap pengembang.

Penting untuk dipahami bahwa Docker adalah teknologi containerization , bukan teknologi virtualisasi . Sedangkan mesin virtual berisi sistem operasi yang lengkap dan dikelola oleh proses kelas berat yang disebut hypervisor, wadah dirancang untuk menjadi sangat ringan dan mandiri. Setiap server menjalankan proses daemon yang disebut mesin Docker yang menjalankan kontainer dan menerjemahkan panggilan sistem operasi di dalam kontainer menjadi panggilan asli pada sistem operasi host. Sebuah container, yang dianalogikan dengan mesin virtual, hanya lebih kecil, menghosting aplikasi Anda, lingkungan runtime, dan sistem operasi barebone. Container biasanya berjalan di mesin virtual. Sementara mesin virtual memerlukan beberapa menit untuk memulai, penampung dapat melakukannya dalam hitungan detik.

Gambar 1 mengilustrasikan perbedaan antara container dan mesin virtual.

Kontainer Docker berdiri sendiri, yang berarti mereka menyertakan semua yang mereka butuhkan untuk menjalankan aplikasi Anda. Misalnya, untuk aplikasi web yang berjalan di Tomcat, wadahnya akan mencakup:

  • File WAR
  • Kucing jantan
  • JVM
  • Sistem operasi dasar

Gambar 2 menunjukkan arsitektur aplikasi web di dalam container Docker.

Dalam kasus Docker, setiap mesin virtual menjalankan proses daemon yang disebut mesin Docker . Anda membangun aplikasi Anda, seperti file WAR Anda, dan kemudian membuat Dockerfile yang sesuai . Dockerfile adalah file teks yang menjelaskan cara membuat image Docker , yang merupakan file biner yang berisi semua yang diperlukan untuk menjalankan aplikasi. Sebagai contoh, Anda dapat membuat Dockerfile dari image dasar Tomcat yang berisi OS Linux dasar, runtime Java, dan Tomcat. Setelah menginstruksikan Docker untuk menyalin file WAR ke direktori webapps Tomcat, Dockerfile akan dikompilasi menjadi image Docker yang terdiri dari base OS, JVM, Tomcat, dan file WAR Anda. Anda dapat menjalankan image Docker secara lokal, tetapi pada akhirnya Anda akan menerbitkannya ke repositori Docker, seperti DockerHub.

Meskipun Gambar Docker adalah versi biner dari container Anda, instance runtime dari Gambar Docker disebut container Docker . Kontainer Docker dijalankan oleh mesin Docker Anda . Mesin yang menjalankan mesin Docker Anda disebut host Docker ; ini bisa berupa laptop lokal atau platform cloud Anda, bergantung pada skala aplikasi Anda.

Dasar-dasar di bagian ini memberikan dasar untuk memahami mengapa pengelompokan merupakan tambahan penting untuk toolkit Docker Anda. Lihat pengantar saya ke Docker untuk lebih lanjut.

Pengelompokan Docker

Sebagian besar pengembang yang memulai dengan Docker akan membangun Dockerfile dan menjalankannya secara lokal di laptop. Namun, ada lebih banyak pengembangan yang dikelola kontainer daripada menjalankan kontainer Docker individual secara lokal. Kekuatan super Docker adalah kemampuannya untuk menaikkan atau menurunkan skala kontainer secara dinamis. Dalam produksi, ini berarti menjalankan Docker dalam cluster di berbagai mesin atau mesin virtual.

Berbagai teknologi pengelompokan Docker tersedia, tetapi dua yang paling populer adalah Amazon EC2 Container Service (ECS) dan Docker Swarm.

Amazon ECS

Teknologi pengelompokan Docker Amazon memanfaatkan Amazon Web Services (AWS) untuk membuat klaster mesin virtual yang dapat menjalankan kontainer Docker. Klaster ECS terdiri dari instans ECS terkelola , yang merupakan instans EC2 dengan mesin Docker dan agen ECS. ECS menggunakan grup penskalaan otomatis untuk memperluas dan mengontrak jumlah instans berdasarkan kebijakan CloudWatch. Misalnya, ketika penggunaan CPU rata-rata dari instans ECS terlalu tinggi, Anda dapat meminta ECS untuk memulai lebih banyak instans, hingga jumlah maksimum instans yang ditentukan dalam grup penskalaan otomatis.

Kontainer Docker dikelola oleh layanan ECS dan dikonfigurasi berdasarkan jumlah kapasitas komputasi (CPU) dan RAM yang dibutuhkan kontainer untuk dijalankan. Layanan ECS memiliki Elastic Load Balancer (ELB) terkait. Saat memulai dan menghentikan kontainer Docker, layanan ECS mendaftarkan dan membatalkan pendaftaran kontainer tersebut dengan ELB. Setelah Anda menyiapkan aturan untuk klaster Anda, Amazon ECS memastikan bahwa Anda menjalankan sejumlah kontainer yang diinginkan dan semua kontainer itu dapat diakses melalui ELB. Gambar 3 menunjukkan tampilan tingkat tinggi dari Amazon ECS.

Penting untuk membedakan antara instans dan tugas ECS . Kluster ECS mengelola instans ECS Anda, yang merupakan instans EC2 khusus yang berjalan dalam grup penskalaan otomatis. Layanan ECS mengelola tugas, yang dapat berisi satu atau lebih kontainer Docker, dan yang berjalan di klaster. ELB berada di depan instans ECS yang menjalankan wadah Docker Anda dan mendistribusikan beban ke wadah Docker Anda. Hubungan antara tugas ECS dan container Docker adalah bahwa definisi tugas memberi tahu layanan ECS container Docker mana yang akan dijalankan dan konfigurasi container tersebut. Layanan ECS menjalankan tugas, yang memulai kontainer Docker.

Lihat pengantar saya ke Amazon ECS di VMTurbo.com.

Docker Swarm

Teknologi pengelompokan asli Docker, Docker Swarm memungkinkan Anda menjalankan beberapa kontainer Docker di seluruh klaster mesin virtual. Docker Swarm menentukan wadah manajer yang berjalan di mesin virtual yang mengelola lingkungan, menyebarkan wadah ke berbagai agen, dan melaporkan status wadah dan informasi penyebaran untuk cluster.

Saat menjalankan Docker Swarm, manajer adalah antarmuka utama ke Docker. Agen adalah "mesin buruh pelabuhan" yang berjalan di mesin virtual yang mendaftarkan dirinya ke pengelola dan menjalankan kontainer Docker. Ketika klien mengirimkan permintaan ke manajer untuk memulai sebuah wadah, manajer menemukan agen yang tersedia untuk menjalankannya. Ini menggunakan algoritme yang paling jarang digunakan untuk memastikan bahwa agen yang menjalankan jumlah kontainer paling sedikit akan menjalankan kontainer yang baru diminta. Gambar 4 menunjukkan contoh konfigurasi Docker Swarm, yang akan Anda kembangkan di bagian selanjutnya.

Proses manajer mengetahui tentang semua agen aktif dan kontainer yang berjalan pada agen tersebut. Saat mesin virtual agen dimulai, mereka mendaftarkan dirinya sendiri dengan manajer dan kemudian tersedia untuk menjalankan kontainer Docker. Contoh pada Gambar 4 memiliki dua agen (Agen1 dan Agen2) yang terdaftar dengan manajer. Setiap agen menjalankan dua kontainer Nginx.

Docker Swarm vs Amazon ECS

Artikel ini menampilkan Docker Swarm, tetapi berguna untuk membandingkan teknologi kontainer. Sementara Amazon ECS menawarkan solusi turnkey yang dikembangkan dengan baik, Docker Swarm memberi Anda kebebasan untuk mengonfigurasi lebih banyak infrastruktur Anda sendiri. Sebagai contoh, Amazon ECS mengelola kontainer dan penyeimbang beban, sedangkan di Docker Swarm Anda akan mengonfigurasi solusi penyeimbangan beban seperti Cisco LocalDirector, F5 BigIp, atau proses perangkat lunak Apache atau Nginx.

Jika Anda sudah menjalankan aplikasi Anda di AWS, ECS membuatnya lebih mudah untuk menjalankan dan mengelola kontainer Docker daripada solusi eksternal. Sebagai pengembang AWS, Anda mungkin sudah memanfaatkan grup penskalaan otomatis, ELB, awan pribadi virtual (VPC), peran dan kebijakan manajemen identitas dan akses (IAM), dan sebagainya. ECS terintegrasi dengan baik dengan semuanya, jadi itulah caranya. Tetapi jika Anda tidak berjalan di AWS, maka integrasi erat Docker Swarm dengan alat Docker menjadikannya pilihan yang tepat.

AWS dan Docker Swarm di cloud hybrid

Amazon Web Services can be configured for very high availability, scalability, and performance, which is probably why it services 25% of all internet traffic, including the massively scaled Netflix services infrastructure. Recently, however, there's been a push toward hybrid cloud environments. A hybrid cloud is a cloud in which part of the application, or sometimes a full copy of it, runs in a public cloud like AWS, and part of it runs in a private cloud. A popular option in this case is to run OpenStack in a private data center.

A hybrid cloud is a safe strategy for a company that is moving some or all operations to the cloud, but needs to go slowly and gain confidence in public clouds. When you choose a hybrid cloud option, you need to create an abstraction layer on top of the underlying cloud technologies, which means you can just as easily deploy to Docker Swarm running on OpenStack in your own data center as you can to ECS running on AWS. Tools like Chef and Puppet can help by allowing you to define your environments abstractly, delegating to them to handle many of the differences between the different environments.

Getting Started with Docker Swarm

In the previous section you saw a sample architecture for a two-node Docker Swarm cluster. Now you'll develop that cluster using two Nginx Docker container instances. Nginx is a popular web server, publicly available as a Docker image on DockerHub. Because this article is focused on Docker Swarm, I wanted to use a Docker container that it quick and easy to start and straightforward to test. You are free to use any Docker container you wish, but for illustrative purposes I chose Nginx for this example.

My introduction to Docker includes a guide to setting up Docker in your development environment. If you've installed and setup the Docker Toolbox then it includes everything that you need to run Docker Swarm. See Docker's official documentation for further setup instructions.

Docker Swarm on the command line

Jika sebelumnya Anda pernah menggunakan Docker, Anda sudah terbiasa menggunakan baris dockerperintah untuk memulai dan menghentikan container. Bila menggunakan Docker Swarm, Anda akan perdagangan dockeruntuk docker-machine. Mesin Docker didefinisikan sebagai berikut dalam dokumentasi Docker:

Docker Machine adalah alat yang memungkinkan Anda menginstal Docker Engine di host virtual, dan mengelola host dengan perintah mesin buruh pelabuhan. Anda dapat menggunakan Mesin untuk membuat host Docker di kotak Mac atau Windows lokal Anda, di jaringan perusahaan Anda, di pusat data Anda, atau di penyedia cloud seperti AWS atau Digital Ocean. Dengan menggunakan perintah mesin buruh pelabuhan, Anda dapat memulai, memeriksa, menghentikan, dan memulai ulang host terkelola, memutakhirkan klien dan daemon Docker, dan mengonfigurasi klien Docker untuk berbicara dengan host Anda.

If you've installed Docker then your installation already includes Docker Machine. To get started with Docker Swarm, start Docker and open a terminal on your computer. Execute the following docker-machine ls command to list all the VMs on your local machine:

 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM default * virtualbox Running tcp://192.168.99.100:2376 

If you've only run Docker from your local machine, then you should have the default Docker virtual machine running with an IP address of 192.168.99.100. To conserve resources on your local machine you can stop this virtual machine by executing: docker-machine stop default.

Create a swarm

A Docker swarm consists of two or virtual machines running Docker instances. For this demo, we'll create three new virtual machines: manager, agent1, and agent2. Create your virtual machines using the docker-machine create command:

$ docker-machine create -d virtualbox manager $ docker-machine create -d virtualbox agent1 $ docker-machine create -d virtualbox agent2 

The docker-machine createperintah menciptakan sebuah "mesin." Baru Meneruskan -dargumen tersebut memungkinkan Anda menentukan driver yang akan digunakan untuk membuat mesin. Berjalan secara lokal, itu seharusnya virtualbox. Mesin pertama yang dibuat adalah manager, yang akan menjadi tuan rumah proses pengelola. Dua mesin terakhir, agent1dan agent2, adalah mesin agen yang akan menjadi tuan rumah proses agen.

Pada titik ini, Anda telah membuat mesin virtual tetapi Anda belum membuat manajer atau agen Swarm yang sebenarnya. Untuk melihat mesin virtual dan statusnya, jalankan docker-machine lsperintah:

 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS agent1 - virtualbox Running tcp://192.168.99.101:2376 v1.11.1 agent2 - virtualbox Running tcp://192.168.99.102:2376 v1.11.1 default - virtualbox Stopped Unknown manager * virtualbox Running tcp://192.168.99.100:2376 v1.11.1