I. Đối tượng bài viết

Bài viết này phù hợp với các bạn đã có kiến thức, làm quen với docker và docker-machine

II. Khái niệm

1. Docker swarm là gì?

Docker swarm là công cụ nằm trong bộ docker CLI giúp bạn quản lý các service chạy trong các node (docker machine) một cách dẽ dàng. Đặc biệt trong vấn đề scale services. Đặc điểm nổi bật của docker swarm:

  • Cluster management integrated with Docker Engine: Sử dụng chính bộ docker cli để tạo swarm một cách dễ dàng
  • Scaling: Scale up, down replicas của 1 service một cách dễ dàng
  • Desired state reconciliation: Swarm đảm bảo 1 service hoạt động ổn định bằng cách tự động thay 1 replicas crash bằng 1 replicas mới
  • Multi-host networking: Swarm có thể tự động gán IP cho mỗi service khi thay đổi
  • Service discovery: Swarm có DNS server riêng. Do đó bạn có thể truy xuất thông qua DNS này
  • Load balancing: Swarm tích hợp cân bằng tải với thuật toán Round-robin
  • Secure by default: Các service giao tiếp với nhau thông qua giao thức bảo mật TLS
  • Rolling updates: Swarm giúp bạn update image của service một cách hoàn toàn tự động và bạn có thể rolling back bất cứ lúc nào.

III. Các bước thực hiện

1. Thiết lập các node

Trước tiên hiểu đơn giản node là các máy để chạy docker engine (có thể là server cloud hoặc virtual machine). Trong bài viết này mình sử dụng virtual machine cho dễ minh họa nhé Trong swarm chúng ta có thể chứa tối thiếu 1 node manager – 0 node worker và tối đa dựa vào cấu hình phần cứng mà thôi Ok. Chúng ta tạo các node bằng docker-machine. Mình sẽ tạo 1 manager node và 3 manager worker để chạy nginx nhé

$ docker-machine create manager
$ docker-machine create worker1
$ docker-machine create worker2
$ docker-machine create worker3

Kiểm tra lại

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
manager  -              virtualbox   Running   tcp://192.168.99.100:2376           v17.05.0-ce   
worker1   -              virtualbox   Running   tcp://192.168.99.101:2376           v17.05.0-ce   
worker2   -              virtualbox   Running   tcp://192.168.99.102:2376           v17.05.0-ce   
worker3   -              virtualbox   Running   tcp://192.168.99.103:2376           v17.05.0-ce   

Tất cả các node này đều chạy trên image boot2docker. Mà cái này lại build trên debian os. Do đó các bạn có thể chạy apt thoải mái 

2. Thiếp lập swarm (manager && worker)

2.1. Thiết lập manager node trong swarm

SSH vào trong node manager

$ docker-machine ssh manager

Chạy lệnh

docker@manager:~$ docker swarm init --advertise-addr 192.168.99.100

Swarm initialized: current node (ja8rreuqdmiehpxjmcwogj9ww) is now a manager. To add a worker to this swarm, run the following command:

docker swarm join
–token SWMTKN-1-68dvy5a71f63x4n3u90o3qid9lq8f6mpwg9obkwy244n1ebc6x-4ln8axdg81qfn3fmm7gbw4hrk 192.168.99.100:2377

To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

Kiểm tra lại

docker@manager:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
ja8rreuqdmiehpxjmcwogj9ww *   manager             Ready               Active              Leader

Ok vậy node hiện tại đã là manager trong swarm. Bước tiếp theo chúng ta sẽ join các node còn lại (worker1-2-3) vào trong swarm. Có thể join vào làm manager hoặc worker tùy ý. Trước tiên ta lấy token đã

  • Lấy token join manager
docker@manager:~$ docker swarm join-token manager

To add a manager to this swarm, run the following command:

docker swarm join
–token SWMTKN-1-68dvy5a71f63x4n3u90o3qid9lq8f6mpwg9obkwy244n1ebc6x-etsiao2xv9uvdiuds0jclc4i2
192.168.99.100:2377

  • Lấy token join worker
docker@manager:~$ docker swarm join-token worker

To add a worker to this swarm, run the following command:

docker swarm join
–token SWMTKN-1-68dvy5a71f63x4n3u90o3qid9lq8f6mpwg9obkwy244n1ebc6x-4ln8axdg81qfn3fmm7gbw4hrk
192.168.99.100:2377

2.2. Thiết lập worker node

SSH vào woker1

$ docker-machine ssh woker1

Join worker1 này vào swarm bằng câu lệnh lấy ở trên

docker@worker1:~$ docker swarm join \
    --token SWMTKN-1-68dvy5a71f63x4n3u90o3qid9lq8f6mpwg9obkwy244n1ebc6x-4ln8axdg81qfn3fmm7gbw4hrk \
    192.168.99.100:2377

This node joined a swarm as a worker.

Làm tương tự với worker 2,3 Kiểm tra lại tại manager node

docker@manager:~$ docker node ls
ID                                 HOSTNAME                 STATUS              AVAILABILITY        MANAGER STATUS
ja8rreuqdmiehpxjmcwogj9ww *        manager                  Ready               Active              Leader
s7jddasdsadjhjhgjgoiosctsck        worker1                  Ready               Active              
sldasdoijrwerwen543243fdfd         worker2                  Ready               Active              
sdasdweqewqbcvcxzj231245           worker3                  Ready               Active              

Ok giờ chúng ta thiết lập các service

3. Thiết lập service

Service hiểu đơn giản đó chính là các docker container chạy trong các node. 1 swarm -> n nodes -> n services Ok mình sẽ khởi tạo service nginx tại manager node bằng câu lệnh sau

docker@manager:~$ docker service create --replicas 10 -p 8080:80 --name nginx nginx
# ftaung6cacczc5s3vantadssl

Kiểm tra lại:

docker@manager:~$ docker service ps nginx
ID                    NAME             IMAGE                 NODE             DESIRED STATE    CURRENT STATE          ERROR          PORTS
n66o1v3fyr5l          nginx.1          nginx:latest          worker1          Running          Running 2 seconds ago                         
lailq4lsmchk          nginx.2          nginx:latest          worker1          Running          Running 2 seconds ago                         
pggv3hcbruuz          nginx.3          nginx:latest          worker2          Running          Running 2 seconds ago                         
wkpo4498x62a          nginx.4          nginx:latest          worker3          Running          Preparing 3 seconds ago                       
07m9x6zvc6lo          nginx.5          nginx:latest          worker3          Running          Preparing 3 seconds ago                       
5w6pt42lcmj1          nginx.6          nginx:latest          worker1          Running          Running 2 seconds ago                         
izrqlq8mai0l          nginx.7          nginx:latest          worker2          Running          Running 2 seconds ago                         
22lomzgggp16          nginx.8          nginx:latest          manager          Running          Running 2 seconds ago                         
kafdtkh59n8s          nginx.9          nginx:latest          manager          Running          Running 2 seconds ago                         
j1yw2z2lh27m          nginx.10         nginx:latest          worker2          Running          Running 2 seconds ago                         

Với replicas = 10 swarm đã tạo 10 container chạy image nginx tại 4 node mà chúng ta đã tạo Giờ bạn vào địa chỉ của các node: 192.168.99.100, 192.168.99.101, 192.168.99.102, 192.168.99.103. Bạn sẽ thấy trang welcome của nginx. Thật đơn giản phải không nào?  Ngoài ra swarm còn chức năng rất thú vị đó là tính năng update service, scale service. Ví dụ update nginx image lên version mới nhất. Tại manager node

docker@manager:~$ docker service update --image nginx:latest nginx

Ví dụ scale service(thay đổi replicass). Tại manager node

docker@manager:~$ docker service scale nginx=3
docker@manager:~$ docker service ps nginx
ID                  NAME                 IMAGE               NODE                DESIRED STATE               CURRENT STATE                        ERROR               PORTS
5w6pt42lcmj1        nginx.6              nginx:latest        worker1             Running                     Running 20 minutes ago                       
kafdtkh59n8s        nginx.9              nginx:latest        manager             Running                     Running 20 minutes ago                       
j1yw2z2lh27m        nginx.10             nginx:latest        worker2             Running                     Running 20 minutes ago                       

Easy enough 

4. Cấu hình HAProxy

Giới thiệu về HAProxy (các bạn chịu khó dịch nhé): HAProxy, which stands for High Availability Proxy, is a popular open source software TCP/HTTP Load Balancer and proxying solution which can be run on Linux, Solaris, and FreeBSD. Its most common use is to improve the performance and reliability of a server environment by distributing the workload across multiple servers (e.g. web, application, database). It is used in many high-profile environments, including: GitHub, Imgur, Instagram, and Twitter.

  • Tạo file Dockerfile có nội dung như sau:
FROM haproxy:1.7
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
  • Tạo file haproxy.cfg có nội dung
# Configure HAProxy to listen on port 80
frontend http_front
   bind *:80
   stats uri /haproxy?stats
   default_backend http_back

# Configure HAProxy to route requests to swarm nodes on port 8080
backend http_back
   balance roundrobin
   server node1 192.168.99.100:8080 check
   server node2 192.168.99.101:8080 check
   server node3 192.168.99.102:8080 check
   server node3 192.168.99.103:8080 check
  • Ok giờ mình sẽ build image từ các config này
$ docker build -t my_haproxy .
  • Kiểm tra lại
$ docker image ls
REPOSITORY                      TAG                 IMAGE ID                  CREATED              SIZE
myhaproxy                       latest              3c04ae7a8545              1 second ago         136 MB
  • Ok image đã sẵn sàng để khởi tạo container

5. Khởi chạy

$ docker run -d -p 80:80 myhaproxy

Done. Kiểm tra tại http://localhost Vậy là bạn đã hoàn thành tutorial: Chạy multi server, load balance với nginx, docker swarm và haproxy Chúc các bạn thành công!

Nguồn: