Pengenalan | Swarm, bunyi macam band punk rock. Tetapi ia sememangnya mekanisme orkestrasi baharu, atau penambahbaikan pada mekanisme orkestrasi sedia ada Docker. Ringkasnya, jika anda menggunakan versi lama Docker, anda mesti mengkonfigurasi Swarm secara manual untuk mencipta kluster Docker. Bermula dengan versi 1.12, enjin Docker menyepadukan pelaksanaan asli (anotasi LCTT: lihat di bawah) untuk menyokong persediaan kluster yang lancar. Sebab itu artikel ini wujud. |
Dalam tutorial ini, saya akan membawa anda untuk mengalami perkara yang boleh dilakukan oleh Docker yang dirancang. Artikel ini tidak dimaksudkan untuk mengandungi semua butiran (seperti BnB) atau memberi anda semua jawapan, tetapi ia sepatutnya membantu anda memulakan laluan anda ke pengelompokan. Mari kita mulakan dengan kepimpinan saya.
Penggoda
Ringkasan TeknikalAmat memalukan untuk menyalin dokumentasi Docker yang terperinci dan berguna di sini, jadi saya akan memberikan gambaran ringkas tentang teknologi itu. Kami sudah mempunyai Docker, betul. Sekarang, anda mahukan lebih banyak pelayan berfungsi sebagai hos Docker, tetapi pada masa yang sama anda mahu mereka tergolong dalam entiti logik yang sama. Iaitu, anda ingin menyediakan kluster.
Mari kita mulakan dengan sekumpulan hos. Apabila anda memulakan kluster Swarm pada hos, hos akan menjadi pengurus kluster. Dari perspektif teknikal, ia menjadi nod dalam kumpulan konsensus. Logik matematik di belakangnya adalah berdasarkan algoritma Raft. Pengurus bertanggungjawab untuk menjadualkan tugas. Tugas-tugas tertentu akan diwakilkan kepada setiap nod pekerja yang telah menyertai kluster Swarm. Operasi ini akan diuruskan oleh API Node. Walaupun saya benci perkataan API, saya perlu menggunakannya di sini.
API Perkhidmatan ialah komponen kedua dalam pelaksanaan ini. Ia membolehkan nod pengurus mencipta perkhidmatan teragih pada semua nod kluster Swarm. Perkhidmatan ini boleh direplikasi, yang bermaksud bahawa mereka (Anotasi LCTT: merujuk kepada perkhidmatan ini) akan diedarkan kepada kluster oleh mekanisme pengimbangan (LCTT Annotation: merujuk kepada mod replika, berbilang contoh kontena akan menjadualkan tugas secara automatik kepada beberapa dalam kluster ) nod yang memenuhi syarat), atau boleh diberikan kepada global (anotasi LCTT: merujuk kepada mod global), yang bermaksud bahawa setiap nod akan menjalankan contoh kontena.
Ada lagi kerja yang perlu dilakukan, tetapi maklumat ini sudah cukup untuk membantu anda. Sekarang mari kita turun ke perkara praktikal. Platform sasaran kami ialah CentOS 7.2, yang menariknya hanya mempunyai versi 1.10 Docker dalam repositorinya semasa saya menulis tutorial ini, yang bermaksud saya perlu mengemas kininya secara manual untuk menggunakan Swarm. Kami akan membincangkan perkara ini dalam tutorial lain. Kami mempunyai panduan susulan yang merangkumi cara menambah nod baharu pada kluster sedia ada kami, dan kami akan menggunakan Fedora untuk konfigurasi asimetri. Pada ketika ini, pastikan konfigurasi yang betul telah disediakan dan anda mempunyai kluster yang berfungsi dan berjalan (Anotasi LCTT: Merujuk kepada Docker nod pertama yang dipasang dan memasuki mod Swarm, tetapi saya belum membincangkan cara untuk memulakan Swarm up hingga ke tahap ini.
Konfigurasikan imej dan perkhidmatanSaya akan cuba mengkonfigurasi perkhidmatan Apache seimbang beban dan menggunakan berbilang contoh kontena untuk menyampaikan kandungan halaman melalui alamat IP yang unik. Standard yang cukup (anotasi terjemahan LCTT: merujuk kepada pelayan web seimbang beban ini). Contoh ini juga menyerlahkan kebanyakan sebab mengapa anda mungkin ingin menggunakan kluster: ketersediaan, lebihan, skala kecil dan prestasi. Sudah tentu, anda perlu mempertimbangkan kedua-dua rangkaian dan storan, tetapi ia berada di luar skop panduan ini.
Templat Dockerfile ini sebenarnya boleh didapati di bawah httpd dalam repositori imej rasmi. Apa yang anda perlukan ialah persediaan mudah untuk bermula. Mengenai cara memuat turun atau mencipta imej anda sendiri, sila rujuk panduan permulaan saya, pautan boleh didapati di bahagian atas tutorial ini.
docker build -t my-apache2 . Sending build context to Docker daemon 2.048 kB Step 1 : FROM httpd:2.4 Trying to pull repository docker.io/library/httpd ... 2.4: Pulling from docker.io/library/httpd 8ad8b3f87b37: Pull complete c95e1f92326d: Pull complete 96e8046a7a4e: Pull complete 00a0d292c371: Pull complete 3f7586acab34: Pull complete Digest: sha256:3ad4d7c4f1815bd1c16788a57f81b413...a915e50a0d3a4 Status: Downloaded newer image for docker.io/httpd:2.4 ---> fe3336dd034d Step 2 : COPY ../public-html/ /usr/local/apache2/htdocs/ ...
Imej dicipta
Sebelum anda meneruskan langkah berikut, anda harus memastikan bahawa anda boleh memulakan contoh bekas tanpa ralat dan menyambung ke pelayan web (anotasi LCTT: gunakan arahan berikut). Sebaik sahaja anda memastikan anda boleh menyambung, kami boleh mula membuat perkhidmatan yang diedarkan.
docker run -dit --name my-running-app my-apache2
Masukkan alamat IP ini ke dalam penyemak imbas anda dan lihat perkara yang muncul.
Pengamatan dan konfigurasi swarmLangkah seterusnya ialah memulakan kluster Swarm. Anda memerlukan arahan paling asas ini untuk bermula, yang hampir sama dengan contoh di blog Docker:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
Apa yang kami buat di sini? Kami mencipta perkhidmatan yang dipanggil frontent dengan lima contoh kontena. Pada masa yang sama, kami juga mengikat port 80 hos kepada port 80 bekas ini. Kami akan menggunakan imej Apache yang baru dibuat untuk ujian ini. Walau bagaimanapun, apabila anda menaip arahan di atas terus pada komputer anda, anda akan melihat ralat berikut:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
这意味着你没有将你的主机(节点)配置成一个 Swarm 管理者manager。你可以在这台主机上初始化 Swarm 集群或是让它加入一个现有的集群。由于我们目前还没有一个现成的集群,我们将初始化它(LCTT 译注:指初始化 Swarm 集群并使当前节点成为 manager):
docker swarm init Swarm initialized: current node (dm58mmsczqemiikazbfyfwqpd) is now a manager.
为了向这个 Swarm 集群添加一个工作者worker,请执行下面的指令:
docker swarm join \ --token SWMTKN-1-4ofd46a2nfyvrqwu8w5oeetukrbylyznxla 9srf9vxkxysj4p8-eu5d68pu5f1ci66s7w4wjps1u \ 10.0.2.15:2377
为了向这个 Swarm 集群添加一个管理者manager,请执行 docker swarm join-token manager 并按照指示操作。
操作后的输出不用解释已经很清楚明了。我们成功的创建了一个 Swarm 集群。新的节点们将需要正确的令牌token来加入这个 Swarm 集群。如果你需要配置防火墙,你还需找到它的 IP 地址和端口(LCTT 译注:指 Docker 的 Swarm 模式通讯所需的端口,默认 2377)。此外,你还可以向 Swarm 集群中添加管理者节点。现在,重新执行刚刚的服务创建指令:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest 6lrx1vhxsar2i50is8arh4ud1
现在,我们来验证下我们的服务是否真的工作了。从某些方面讲,这很像我们在 Vagrant 和 coreOS 中做的事情那样。毕竟它们的原理几乎相同。相同指导思想的不同实现罢了(LCTT 译注:笔者观点,无法苟同)。首先需要确保 docker ps 能够给出正确的输出。你应该能看到所创建服务的多个容器副本。
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cda532f67d55 my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.1.2sobjfchdyucschtu2xw6ms9a 75fe6e0aa77b my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.4.ag77qtdeby9fyvif5v6c4zcpc 3ce824d3151f my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.2.b6fqg6sf4hkeqs86ps4zjyq65 eda01569181d my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.5.0rmei3zeeh8usagg7fn3olsp4 497ef904e381 my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.3.7m83qsilli5dk8rncw3u10g5a
我也测试了不同的、非常规的端口,它们都能正常工作。对于你如何连接服务器和收取请求你将会有很多可配置的余地。你可以使用 localhost 或者 Docker 网络接口(笔者注:应该是指 Docker 的默认网桥 docker0,其网关为 172.17.0.1) 的 IP 地址的正确端口去访问。下面的例子使用了端口 1080:
Replicated Web service works
至此,这是一个非常粗略、简单的开始。真正的挑战是创建一个优化过的、可扩展的服务,但是它们需要一个准确的技术用例。此外,你还会用到 docker info 和 docker service(还有 inspect 和 ps)命令来详细了解你的集群是如何工作的。
可能会遇到的问题你可能会在把玩 Docker 和 Swarm 时遇到一些小的问题(也许没那么小)。比如 SELinux 也许会抱怨你正在执行一些非法的操作(LCTT 译注:指在强制访问控制策略中没有权限的操作)。然而,这些错误和警告应该不会对你造成太多阻碍。
SELinux alert
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest docker: 'service' is not a docker command.
docker service create -name frontend -replicas 5 -p 80:80/tcp my-apache2:latest Error response from daemon: rpc error: code = 3 desc = ContainerSpec: "-name" is not a valid repository/tag
关于这个错误已经有多个相关的讨论和帖子了。其实这个错误也许相当无辜。你也许是从浏览器粘贴的命令,在浏览器中的横线也许没被正确解析(笔者注:应该用 --name 而不是 -name)。就是这么简单的原因所导致的。 扩展阅读
关于这个话题还有很多可谈的,包含 1.12 版之前的 Swarm 集群实现(笔者注:旧的 Swarm 集群实现,下文亦作独立版本,需要 Consul 等应用提供服务发现),以及当前的 Docker 版本提供的(笔者注:新的 Swarm 集群实现,亦被称为 Docker 引擎的 Swarm 模式)。也就是说,请别偷懒花些时间阅读以下内容:
Anda akhirnya melihatnya di sini. Masih tiada jaminan bahawa anda telah mempelajari apa-apa pada ketika ini, tetapi saya percaya anda masih akan mendapati artikel ini berguna. Ia merangkumi beberapa konsep asas dan gambaran keseluruhan tentang cara mod kluster Swarm berfungsi dan perkara yang boleh dilakukannya. Kami juga berjaya memuat turun dan mencipta imej pelayan web kami dan kemudian menjalankannya berdasarkan contoh bekas berkelompok. Walaupun kami hanya menjalankan eksperimen di atas pada satu nod, kami akan menerangkannya dengan jelas pada masa hadapan (terjemahan LCTT: untuk menerangkan operasi kluster Swarm berbilang nod). Dan kami telah menyelesaikan beberapa masalah biasa.
Saya harap anda mendapati panduan ini cukup menarik. Digabungkan dengan artikel yang telah saya tulis tentang Docker pada masa lalu, artikel ini harus memberi anda penjelasan yang baik, termasuk: cara mengendalikan imej, susunan rangkaian, storan, dan kini kelompok. Anggap sahaja ia sebagai pemanasan badan. Sesungguhnya, nikmati dan nantikan untuk melihat anda dalam tutorial Docker baharu. Saya tidak dapat mengawal berapa banyak yang saya ingat.
Selamat hari raya.
Atas ialah kandungan terperinci Mulakan dengan cepat dengan mod Swarm Docker Engine!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!