Deploy Portainer và Traefik

Khi làm việc với Docker Swarm, chúng ta nên sử dụng Portainer để dễ dàng quản lý Docker environment. Bên cạnh đó chúng ta cũng cần sử dụng một reverse-proxy cũng như là load balancer, vậy nên ta sẽ sử dụng Traefik.

Trong bài tập này, ta sẽ deploy hai service này lên. Trong đây đã có sẵn một file là reverse-proxy chứa cấu hình traefik và một file protainer-agent-stack chứa cấu hình của portainer.

Yêu cầu

Deploy thành công hai service. Mở được giao diện của hai service này trên browser của máy thật bằng đường dẫn:

  • Portainer: domain.lc:9000

  • Traefik: domain.lc:8889

1. Sửa đổi file hosts

Để có thể theo vào được giao diện của portainertraefik một cách trực quan nhất, ta sẽ truy cập thông qua browser trên máy thật. Nhưng thay vì cứ phải nhập địa chỉ ip 192.168.56.101 thì ta sẽ đổi nó thành một tên miền, cụ thể ở đây là domain.lc

Bây giờ các bạn cần sửa file /etc/hosts trên máy thật của các bạn để có thể mở được các subdomain này.

1.1 Với hệ điều hành linux/macOS thì cần sửa dưới quyền root với câu lệnh:

nano /etc/hosts

1.2 Với hệ điều hành windows

Các bạn cần mở file hosts trong đường dẫn C:\Windows\System32\drivers\etc:

alt

Bởi vì file này chỉ được chỉnh sửa dưới quyền admin, vậy nên các bạn có thể mở CMD hoặc Terminal dưới quyền admin lên để sửa:

terminal-admin

Sau đó dùng lệnh:

nano hosts

1.3. Nội dung chỉnh sửa

Vào chỉnh sửa file hosts, ta sẽ thêm hai subdomain ở trên với cú pháp:

<địa chỉ ip> <tên miền>

Ví dụ ở đây tôi đặt tên miền là domain.lc

edit-hosts

2. Deploy reverse-proxy stack

Trước hết chúng ta cần tạo ra một network tên là traefik-net:

docker network create -d overlay traefik-net

Bây giờ chúng ta sẽ vào trong máy ảo manager01, sau đó cd vào folder /home/vagrant/. Từ các bài sau trở đi, ta sẽ thao tác chủ yếu ở folder này. Các bạn tạo một file tên là reverse-proxy.yml với lệnh:

vim reverse-proxy.yml

Rồi copy nội dung bên dưới đây vào file này:

version: '3.8'

services:
  traefik:
    image: "traefik:v2.5"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:8889"
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
    ports:
      - "80:80"
      - "443:443"    
      - "8889:8080"
    networks:
      - traefik-net
    deploy:
      mode: global
      placement:
        constraints:
          - node.role == manager
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`domain.lc`)"
      - "traefik.http.routers.traefik.entrypoints=web"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=auth"

networks:
  traefik-net:
    external: true

Sau đó bấm phím Esc và gõ ZZ để lưu file đối với Vim.

Sau khi có file reverse-proxy.yml thì ta sẽ deploy stack này lên với lệnh:

docker stack deploy -c reverse-proxy.yml reverse-proxy

3. Deploy Protainer

Tiếp theo là đến portainer. Ta tạo file portainer-agent-stack.yml với nội dung:

version: '3.2'

services:
  agent:
    image: portainer/agent:2.19.3
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer-ce:2.19.3
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9443:9443"
      - "9000:9000"
      - "8000:8000"
    volumes:
      - portainer_data:/data
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay
    attachable: true

volumes:
  portainer_data:

Sau đó deploy stack lên:

docker stack deploy -c portainer-agent-stack.yml portainer

4. Kết quả

Bây giờ các bạn sử dụng browser ở máy thật, nhập địa chỉ domain.lc:9000 thì sẽ có kết quả:

portainer

Nhập địa chỉ domain.lc:8889 thì có kết quả:

traefik

Như vậy là truy cập thành công.
Sau khi tạo tài khoản thì ta đăng nhập vào portainer.

Đây là giao diện của portainer:

portainer-dashboard

Ta có thể dễ dàng xem các services, containers, images, networks, v.v… mà không cần phải gõ lệnh nhiều lần:

portainer-menu

5. Kết

Vậy là ta đã thực hành xong bước tiếp theo trong bài tập thực hành Docker Swarm. Cảm ơn các bạn đã dành thời gian đọc bài viết của mình. Nếu có vấn đề gì thắc mắc, hãy bình luận phía dưới nhé.