Âm thanh như một ban nhạc punk rock. Nhưng đó là cơ chế phối hợp hoàn toàn mới, hay đúng hơn là một cải tiến của cơ chế phối hợp có sẵn trong Docker. Để giữ cho nó ngắn gọn và dễ hiểu, nếu bạn đang sử dụng phiên bản Docker cũ hơn, bạn sẽ cần thiết lập Swarm theo cách thủ công để tạo các cụm Docker. Bắt đầu với phiên bản 1.12, công cụ Docker đi kèm với triển khai gốc cho phép thiết lập phân cụm liền mạch. Lý do tại sao chúng ta ở đây.
Trong hướng dẫn này, tôi sẽ cố gắng cho bạn biết Docker có thể làm gì khi nói đến điều phối. Bài viết này không có nghĩa là bao gồm tất cả (giường &bữa sáng) hoặc biết tất cả, nhưng nó có những gì cần thiết để đưa bạn vào hành trình phân cụm của mình. Sau tôi.
Tổng quan về công nghệ
Sẽ rất tiếc nếu tôi viết lại bài viết về tài liệu Docker rất chi tiết và rất hữu ích, vì vậy tôi sẽ chỉ phác thảo tổng quan ngắn gọn về công nghệ. Vậy là chúng ta có Docker rồi đúng không. Bây giờ, bạn muốn sử dụng nhiều hơn một máy chủ làm máy chủ Docker, nhưng bạn muốn chúng thuộc về cùng một thực thể logic. Do đó, phân cụm.
Hãy bắt đầu bằng một cụm của một. Khi bạn bắt đầu swarm trên một máy chủ, nó sẽ trở thành người quản lý cụm. Về mặt kỹ thuật, nó trở thành một nhóm đồng thuận của một nút. Logic toán học đằng sau dựa trên thuật toán Raft. Người quản lý chịu trách nhiệm lập kế hoạch cho các nhiệm vụ. Các nhiệm vụ sẽ được ủy quyền cho các nút công nhân, một lần và nếu chúng tham gia vào bầy đàn. Điều này được quản lý bởi API Node. Tôi ghét từ API, nhưng tôi phải sử dụng nó ở đây.
API dịch vụ là thành phần thứ hai của quá trình triển khai này. Nó cho phép các nút của người quản lý tạo các dịch vụ phân tán trên tất cả các nút trong bầy. Các dịch vụ có thể được sao chép, nghĩa là chúng được trải rộng trên cụm bằng cách sử dụng các cơ chế cân bằng hoặc chúng có thể là toàn cầu, nghĩa là một phiên bản của dịch vụ sẽ chạy trên mỗi nút.
Còn nhiều việc phải làm ở đây, nhưng điều này đủ tốt để giúp bạn chuẩn bị sẵn sàng và hào hứng. Bây giờ, hãy làm một số thứ thực tế. Nền tảng mục tiêu của chúng tôi là CentOS 7.2, điều này khá thú vị, vì tại thời điểm tôi viết hướng dẫn này, nó chỉ có Docker 1.10 trong repos và tôi phải nâng cấp thủ công khung để sử dụng swarm. Chúng tôi sẽ thảo luận về điều này trong một hướng dẫn riêng biệt. Sau đó, chúng tôi cũng sẽ có hướng dẫn tiếp theo, nơi chúng tôi sẽ kết hợp các nút mới vào cụm của mình và chúng tôi sẽ thử thiết lập bất đối xứng với Fedora. Tại thời điểm này, hãy giả định rằng thiết lập chính xác đã được thực hiện và hãy thiết lập và chạy một dịch vụ cụm.
Cài đặt hình ảnh &dịch vụ
Tôi sẽ cố gắng thiết lập dịch vụ Apache cân bằng tải, với nhiều phiên bản phân phát nội dung qua một địa chỉ IP duy nhất. Khá chuẩn. Nó cũng nêu bật những lý do điển hình khiến bạn chọn cấu hình cụm - tính khả dụng, dự phòng, chia tỷ lệ theo chiều ngang và hiệu suất. Tất nhiên, bạn cũng cần xem xét phần kết nối mạng cũng như lưu trữ, nhưng đó là điều nằm ngoài phạm vi trực tiếp của hướng dẫn này.
Mẫu Dockerfile thực tế có sẵn trong kho lưu trữ chính thức dưới httpd. Bạn sẽ cần một thiết lập tối thiểu để bắt đầu. Chi tiết về cách tải xuống hình ảnh, cách tạo hình ảnh của riêng bạn, v.v. có sẵn trong hướng dẫn giới thiệu của tôi, được liên kết ở phần đầu của hướng dẫn này.
docker build -t my-apache2 .
Gửi bối cảnh xây dựng tới Docker daemon 2.048 kB
Bước 1:TỪ httpd:2.4
Đang cố gắng kéo kho lưu trữ docker.io/library/httpd ...
2.4:Lấy từ docker.io/library/httpd
8ad8b3f87b37:Kéo hoàn tất
c95e1f92326d:Kéo hoàn tất
96e8046a7a4e:Kéo hoàn tất
00a0d292c371:Kéo hoàn tất
3f7586acab34:Kéo hoàn tất
Thông báo:sha256:3ad4d7c4f1815bd1c16788a57f81b413...a915e50a0d3a4
Trạng thái:Đã tải xuống hình ảnh mới hơn cho docker.io/httpd:2.4
---> fe3336dd034d
Bước 2:SAO CHÉP ../public-html/ /usr/local/apache2/htdocs/
...
Trước khi tiếp tục, bạn nên bắt đầu một phiên bản duy nhất và xem vùng chứa của bạn được tạo mà không có bất kỳ lỗi nào và bạn có thể kết nối với máy chủ Web. Khi chúng tôi thiết lập điều đó, chúng tôi sẽ tạo một dịch vụ phân tán.
docker run -dit --name my-running-app my-apache2
Kiểm tra địa chỉ IP, truy cập vào trình duyệt, xem những gì mang lại.
Bắt đầu và thiết lập bầy đàn
Bước tiếp theo là để có được bầy đàn đi. Đây là lệnh cơ bản nhất sẽ giúp bạn thực hiện và nó rất giống với ví dụ được sử dụng trong blog Docker:
dịch vụ docker tạo --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
Chúng ta có gì ở đây? Chúng tôi đang tạo một dịch vụ có tên là giao diện người dùng, với năm phiên bản vùng chứa. Chúng tôi cũng đang ràng buộc hostPort 80 của mình với containerPort 80. Và chúng tôi đang sử dụng hình ảnh Apache mới được tạo của tôi cho việc này. Tuy nhiên, khi bạn làm điều này, bạn sẽ gặp phải lỗi sau:
dịch vụ docker tạo --name frontend --replicas 5 -p 80:80/tcp my-Apache2:latest
Phản hồi lỗi từ daemon:Nút này không phải là trình quản lý bầy đàn. Sử dụng "docker swarm init" hoặc "docker swarm join" để kết nối nút này với swarm và thử lại.
Điều này có nghĩa là bạn chưa thiết lập máy chủ (nút) hiện tại thành trình quản lý bầy đàn. Bạn cần khởi tạo bầy đàn hoặc tham gia một bầy đàn hiện có. Vì chúng tôi chưa có, bây giờ chúng tôi sẽ khởi tạo nó:
docker swarm init
Đã khởi tạo bầy đàn:nút hiện tại (dm58mmsczqemiikazbfyfwqpd) hiện là người quản lý.
Để thêm một worker vào bầy đàn này, hãy chạy lệnh sau:
docker swarm tham gia \
--token SWMTKN-1-4ofd46a2nfyvrqwu8w5oeetukrbylyznxla
9srf9vxkxysj4p8-eu5d68pu5f1ci66s7w4wjps1u \
10.0.2.15:2377
Để thêm người quản lý vào bầy này, hãy chạy 'docker swarm join-token manager' và làm theo hướng dẫn.
Đầu ra là khá tự giải thích. Chúng tôi đã tạo ra một bầy đàn. Các nút mới sẽ cần sử dụng mã thông báo chính xác để tham gia bầy đàn. Bạn cũng có địa chỉ IP và cổng được xác định, nếu bạn yêu cầu các quy tắc tường lửa. Hơn nữa, bạn cũng có thể thêm người quản lý vào bầy đàn. Bây giờ, chạy lại lệnh tạo dịch vụ:
dịch vụ docker tạo --name frontend --replicas 5 -p 80:80/tcp my-Apache2:latest
6lrx1vhxsar2i50is8arh4ud1
Kiểm tra kết nối
Bây giờ, hãy kiểm tra xem dịch vụ của chúng ta có thực sự hoạt động không. Theo một cách nào đó, điều này tương tự như những gì chúng tôi đã làm với Vagrant và coreOS. Rốt cuộc, các khái niệm gần như giống hệt nhau. Đó chỉ là cách thực hiện khác nhau của cùng một ý tưởng. Đầu tiên, docker ps sẽ hiển thị đầu ra phù hợp. Bạn nên có nhiều bản sao cho dịch vụ đã tạo.
docker ps
ID CONTAINER IMAGE COMMAND TẠO TRẠNG THÁI PORTS
TÊN
cda532f67d55 my-apache2:latest "httpd-foreground"
2 phút trước Lên 2 phút 80/tcp frontend.1.2sobjfchdyucschtu2xw6ms9a
75fe6e0aa77b my-apache2:latest "httpd-foreground"
2 phút trước Lên 2 phút 80/tcp frontend.4.ag77qtdeby9fyvif5v6c4zcpc
3ce824d3151f my-apache2:latest "httpd-foreground"
2 phút trước Lên 2 phút 80/tcp frontend.2.b6fqg6sf4hkeqs86ps4zjyq65
eda01569181d my-apache2:latest "httpd-foreground"
2 phút trước Lên 2 phút 80/tcp frontend.5.0rmei3zeeh8usagg7fn3olsp4
497ef904e381 my-apache2:latest "httpd-foreground"
2 phút trước Lên 2 phút 80/tcp frontend.3.7m83qsilli5dk8rncw3u10g5a
Tôi cũng đã thử nghiệm với các cổng khác, không phải cổng mặc định và nó hoạt động tốt. Bạn có nhiều thời gian để kết nối với máy chủ và nhận phản hồi. Bạn có thể sử dụng localhost hoặc địa chỉ IP giao diện docker với cổng chính xác. Ví dụ bên dưới hiển thị cổng 1080:
Bây giờ, đây là một khởi đầu rất khó khăn, rất đơn giản. Thách thức thực sự là tạo ra các dịch vụ được tối ưu hóa, có thể mở rộng, nhưng chúng yêu cầu trường hợp sử dụng kỹ thuật phù hợp. Ngoài ra, bạn cũng nên sử dụng các lệnh docker info và docker service (inspect|ps) để tìm hiểu thêm về cách hoạt động của cụm.
Các vấn đề có thể xảy ra
Bạn có thể gặp phải một số sự cố nhỏ (hoặc không quá nhỏ) khi chơi với Docker và swarm. Ví dụ, SELinux có thể phàn nàn rằng bạn đang cố làm điều gì đó bất hợp pháp. Tuy nhiên, các lỗi và cảnh báo không nên cản trở bạn quá nhiều.
Dịch vụ Docker không phải là lệnh docker
Khi bạn cố gắng chạy lệnh cần thiết để khởi động một dịch vụ được sao chép, bạn sẽ gặp lỗi cho biết docker:'service' không phải là lệnh docker. Điều này có nghĩa là bạn không có phiên bản Docker phù hợp (kiểm tra bằng -v). Chúng tôi sẽ khắc phục điều này trong phần hướng dẫn tiếp theo.
dịch vụ docker tạo --name frontend --replicas 5 -p 80:80/tcp my-Apache2:latest
docker:'service' không phải là lệnh docker.
Thẻ docker không được nhận dạng
Bạn cũng có thể thấy lỗi sau:
dịch vụ docker tạo -tên giao diện người dùng -replicas 5 -p 80:80/tcp my-apache2:latest
Phản hồi lỗi từ daemon:lỗi rpc:code =3 desc =ContainerSpec:"-name" không phải là kho lưu trữ/thẻ hợp lệ
Có một số chủ đề thảo luận xung quanh điều này. Lỗi thực sự có thể khá vô tội. Bạn có thể đã sao chép lệnh từ trình duyệt và dấu gạch ngang có thể không được phân tích cú pháp chính xác. Đơn giản vậy thôi.
Đọc thêm
Có rất nhiều điều để nói về chủ đề này, bao gồm cả việc triển khai Swarm trước Docker 1.12, cũng như phiên bản hiện tại của công cụ Docker. Nói một cách dí dỏm, xin đừng lười biếng và dành chút thời gian đọc:
Tổng quan về Docker Swarm (để cài đặt Swarm độc lập)
Xây dựng cụm Swarm để sản xuất (thiết lập độc lập)
Cài đặt và tạo Docker Swarm (thiết lập độc lập)
Tổng quan về bầy động cơ docker (dành cho phiên bản 1.12)
Bắt đầu với chế độ bầy đàn (dành cho phiên bản 1.12)
Kết luận
Của bạn đi. Không có gì quá to tát vào thời điểm này, nhưng tôi tin rằng bạn sẽ thấy bài viết hữu ích. It covers several key concepts, there's an overview of how the swarm mode works and what it does, and we successfully managed to download and create our own Web server image and then run several clustered instances of it. We did this on a single node for now, but we will expand in the future. Also, we tackled some common problems.
I hope you find this guide interesting. Combined with my previous work on Docker, this should give you a decent understand of how to work with images, the networking stack, storage, and now clusters. Warming up. Indeed, enjoy and see you soon with fresh new tutorials on Docker. I just can't contain [sic] myself.
Chúc mừng.