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: