Thursday, November 21, 2024

Nội dung Talk Show Introduction to Docker

-

1. Slide 1 – What is Docker?

Docker là một nền tảng sử dụng công nghệ container để đóng gói, quản lý và triển khai ứng dụng. Containers là một công nghệ giúp bạn đóng gói và chạy các ứng dụng trong môi trường cô lập và cách biệt, đảm bảo tính nhất quán và tương thích trên các môi trường khác nhau.

Nội dung bài này sẽ theo slide https://wiki.hoanghd.com/wp-content/uploads/16430674.ppt, bạn hãy tải nó về để tiện theo dõi.

  • Packages an application into a container có nghĩa là Docker cho phép bạn đóng gói ứng dụng của mình cùng với tất cả các thành phần và thư viện cần thiết vào một gói gọi là container. Container này chứa tất cả mọi thứ mà ứng dụng cần để chạy mà không cần lo lắng về sự khác biệt giữa các môi trường máy tính.
  • Containers share the host OS kernel có nghĩa là các container chia sẻ kernel của host với nhau. Điều này có nghĩa các container chạy trên cùng một hệ điều hành máy chủ và sử dụng kernel chung. Container cách ly ứng dụng một cách an toàn và sử dụng tài nguyên máy tính một cách hiệu quả, mà không cần một hệ điều hành riêng biệt cho mỗi container.
  • Not a Virtual Machine (each VM has a separate OS) cho biết Docker không giống với Máy ảo (VM). Trong trường hợp của VM, mỗi máy ảo có một hệ điều hành riêng biệt của nó và mỗi máy ảo chạy trên một hypervisor tạo ra sự cách ly hoàn toàn. Trong khi đó, Docker sử dụng container để cách ly ứng dụng, nhưng tất cả các container chia sẻ cùng một hệ điều hành máy chủ và sử dụng kernel chung. Điều này giúp tiết kiệm tài nguyên và giúp ứng dụng chạy nhanh hơn và hiệu quả hơn so với máy ảo truyền thống.

2. Slide 2 – Why Use Docker?

Docker cung cấp nhiều lợi ích quan trọng, từ cải thiện hiệu suất ứng dụng, tối ưu hóa tài nguyên hệ thống, đóng gói ứng dụng dễ dàng và di động giữa các môi trường khác nhau, giúp tăng cường quá trình phát triển và triển khai ứng dụng.

  • Hiệu suất (Performance): Docker giúp cải thiện hiệu suất ứng dụng. Containers chia sẻ kernel hệ điều hành của máy chủ, làm giảm overhead so với máy ảo truyền thống. Điều này có nghĩa ứng dụng chạy trong container thường nhanh hơn và sử dụng ít tài nguyên hệ thống hơn.
  • Tối ưu hóa (Optimization – Infrastructure): Docker giúp tối ưu hóa việc sử dụng tài nguyên hệ thống. Bằng cách đóng gói ứng dụng và thư viện cần thiết trong container, bạn có thể quản lý và triển khai các ứng dụng dễ dàng hơn, tiết kiệm tài nguyên và nguồn lực máy chủ.
  • Đóng gói (Encapsulation – CI/CD, DevOps): Docker giúp đóng gói ứng dụng cùng với tất cả các phụ thuộc và cài đặt vào một container. Điều này tạo ra sự đảm bảo rằng ứng dụng sẽ chạy đúng cách trên mọi môi trường – từ developer đến product. Docker còn hỗ trợ quá trình CI/CD trong mô hình DevOps, giúp giảm thời gian và rủi ro trong quá trình phát triển và triển khai ứng dụng.
  • Khả năng di động (Portability – Cloud): Docker container rất dễ di động giữa các môi trường máy chủ khác nhau và cả cloud. Bạn có thể xây dựng một container trên máy tính cá nhân và triển khai nó trên bất kỳ môi trường hệ thống nào hỗ trợ Docker, bao gồm cả các dịch vụ public cloud. Điều này tạo sự linh hoạt và tiết kiệm thời gian cho việc triển khai ứng dụng trên nhiều nền tảng.

3. Slide 3 – Docker Hub.

Docker Hub là một dịch vụ trực tuyến cung cấp lưu trữ và chia sẻ các images tương tự như GitHub.

Dưới đây là một số điểm quan trọng về Docker Hub:

  • Lưu trữ Images: Docker Hub là một kho lưu trữ trực tuyến cho các images. Bạn có thể tìm kiếm, tải về và sử dụng các images có sẵn trên Docker Hub, bao gồm các images cho các hệ điều hành (như Ubuntu), CSDL như Redis, MySQL, MongoDB, PostgreSQL và các frameworks và ứng dụng (như Node.js).
  • Push và pull Images: Bạn có thể push và pull các images của riêng bạn lên và từ Docker Hub. Điều này cho phép bạn chia sẻ các images mà bạn đã tạo ra với cộng đồng hoặc với đồng nghiệp của mình.
  • Image private và public: Docker Hub cho phép bạn lưu trữ public images mà bất kỳ ai có thể tải về. Tuy nhiên, nếu bạn muốn lưu trữ các private images và chỉ chia sẻ với một số người cụ thể, bạn cần trả phí cho gói lưu trữ private images. Gói miễn phí của Docker Hub thường cho phép bạn lưu trữ các images công khai.
  • Docker Trusted Registry (DTR): Nếu bạn cần kiểm soát hoàn toàn mã nguồn của mình, Docker cung cấp một sản phẩm gọi là Docker Trusted Registry (DTR). DTR cho phép bạn tự quản lý và lưu trữ images trên hệ thống của bạn, đảm bảo tính riêng tư và bảo mật. Điều này thường được sử dụng trong các môi trường doanh nghiệp hoặc những trường hợp cần kiểm soát cao hơn đối với mã nguồn và image container.
    • Giả sử bạn là một doanh nghiệp hoặc tổ chức phát triển ứng dụng nhạy cảm về tính bảo mật hoặc tuân thủ quy định và bạn muốn kiểm soát hoàn toàn sourcecode và images container của mình. DTR có thể giúp bạn thực hiện điều này bằng cách:
      • Quản lý và lưu trữ riêng tư: DTR cho phép bạn tạo và quản lý một kho lưu trữ private images container trên hệ thống của bạn. Điều này có nghĩa bạn có quyền kiểm soát hoàn toàn việc lưu trữ và truy cập vào các images của bạn.
      • Chứng thực và ủy quyền: DTR tích hợp các tính năng chứng thực và ủy quyền mạnh mẽ. Bạn có thể xác định rõ ai có quyền tải lên (push) và tải về (pull) các images từ DTR. Điều này đảm bảo chỉ các người được ủy quyền mới có thể truy cập và sử dụng các images.
      • Bảo mật cao cấp: DTR cung cấp nhiều tính năng bảo mật như mã hóa images, quản lý chứng chỉ SSL, quản lý chứng chỉ dự án và theo dõi hoạt động chi tiết về việc sử dụng images.
      • Quản lý tuân thủ quy định: DTR giúp bạn tuân thủ các quy định về bảo mật và an toàn thông tin do tổ chức hoặc lĩnh vực của bạn đặt ra, như HIPAA, GDPR, hoặc PCI DSS, bằng cách cung cấp các tính năng phù hợp để theo dõi và báo cáo.
      • Quản lý tập trung: DTR tích hợp với công cụ quản lý Docker và cung cấp giao diện quản lý tập trung, giúp bạn dễ dàng quản lý toàn bộ quá trình phát triển, triển khai và quản lý images.

4. Slide 4 – Getting Started.

Bắt đầu với Docker thường bao gồm một loạt các bước cơ bản để build, push và pull images, chạy containers và thực hiện các tác vụ khác.

Dưới đây là một hướng dẫn sơ lược về các bước này:

  • Cài đặt Docker: Trước tiên, bạn cần cài đặt Docker trên máy tính của mình. Cài đặt có sẵn cho nhiều hệ điều hành khác nhau và bạn có thể tải Docker từ trang chính thức của Docker.
  • Xây dựng một Image:
    • Tạo một Dockerfile: Để xây dựng một image, bạn cần tạo một Dockerfile, một file cấu hình cho Docker, chứa các hướng dẫn để xây dựng image.
    • Sử dụng lệnh docker build: Sử dụng lệnh docker build với Dockerfile để xây dựng image từ mã nguồn của bạn.
  • Tải lên (Push) và tải xuống (Pull) images:
    • Sử dụng lệnh docker push để đẩy image lên Docker Hub hoặc một registry khác nếu bạn muốn chia sẻ nó với người khác.
    • Sử dụng lệnh docker pull để kéo image từ registry về máy tính của bạn nếu bạn cần sử dụng image đó.
  • Chạy Container:
    • Sử dụng lệnh docker run để chạy một container từ image. Container sẽ chạy một lệnh cụ thể và dừng khi lệnh đó hoàn thành.
  • Quản lý Containers:
    • Sử dụng lệnh docker start, docker stop, và docker restart để quản lý trạng thái của containers.
    • Sử dụng lệnh docker attach để kết nối vào terminal của container.
    • Sử dụng lệnh docker logs để xem logs của container.
    • Sử dụng lệnh docker inspect để xem thông tin cấu hình của container.
  • Thực hiện Thay Đổi và Commit:
    • Chạy container bằng lệnh docker run -it, trong đó -it cho phép bạn tương tác với container bằng terminal.
    • Thực hiện thay đổi bên trong container.
    • Sau khi hoàn thành thay đổi, sử dụng lệnh docker commit để tạo một image mới dựa trên trạng thái của container sau khi bạn đã thay đổi.
  • Đặt tên (Tag) cho Images:
    • Sử dụng lệnh docker tag để đặt tên (tag) cho image. Điều này giúp bạn có thể dễ dàng tham chiếu đến image khi bạn cần nó.

5. Slide 5 – Process Overview

Docker hoạt động dựa trên mô hình Client-Server, với Docker Client gửi các yêu cầu đến Docker daemon để thực hiện các tác vụ Docker cụ thể, sử dụng các images từ các Registry như Docker Hub.

Quá trình hoạt động của Docker có một số thành phần quan trọng như Client, Docker daemon và Registry.

Dưới đây là một tóm tắt quy trình hoạt động cơ bản:

  • Client: Đây là giao diện terminal hoặc GUI mà người dùng sử dụng để tương tác với Docker. Client gửi các lệnh Docker đến Docker daemon để yêu cầu thực hiện các tác vụ cụ thể như xây dựng image, chạy container, và nhiều tác vụ khác.
  • DOCKER_HOST: Đây là biến môi trường cho Docker Client để xác định nơi Docker daemon đang chạy. Nếu không được xác định, Docker Client sẽ kết nối đến Docker daemon trên máy local.
  • Docker daemon: Docker daemon là một dịch vụ chạy ở nền trên máy tính hoặc máy chủ. Nó thực hiện các tác vụ Docker thực tế như xây dựng images, quản lý container, và tương tác với hệ thống tài nguyên như linux kernel và file system. Docker daemon cũng quản lý các containers đang chạy, tải images từ Registry và thực hiện nhiều công việc quan trọng khác.
  • Registry: Registry là nơi lưu trữ và phân phối các images. Docker Hub là một ví dụ phổ biến về một Registry công cộng. Bạn có thể đẩy (push) images lên Registry để chia sẻ với người khác hoặc kéo (pull) images từ đó để sử dụng. Ngoài Docker Hub, bạn cũng có thể triển khai Registry riêng tư để lưu trữ images của bạn.
  • Quá trình hoạt động cơ bản:
    • Để xây dựng một image, Docker Client sử dụng lệnh docker build và gửi yêu cầu tới Docker daemon.
    • Để tải một image từ Registry, Docker Client sử dụng lệnh docker pull, và Docker daemon sẽ tải image từ Registry về máy tính hoặc máy chủ của bạn.
    • Để chạy một container, Docker Client sử dụng lệnh docker run, và Docker daemon tạo ra một container từ image đã có trên máy và chạy nó. Trong trường hợp này, NGINX là một ví dụ về image mà Docker daemon sẽ sử dụng để tạo container.

6. Slide 6 – Beyond the Basics.

Docker cung cấp nhiều tính năng và khả năng mạnh mẽ khác để quản lý ứng dụng và containers trong các môi trường phức tạp.

Dưới đây là một số trong số các chủ đề liên quan:

  • Chạy Nhiều Lệnh và Quản lý Processes: Bạn có thể sử dụng một công cụ quản lý quá trình như supervisor để chạy và quản lý nhiều lệnh hoặc quy trình bên trong một container. Điều này thường hữu ích khi bạn muốn chạy nhiều dịch vụ hoặc tiến trình trong một container duy nhất.
  • Mạng và Cổng Kết Nối (Port Mapping): Bạn có thể định cấu hình các container để mở các cổng và ánh xạ chúng từ máy host sang container. Điều này cho phép bạn truy cập các dịch vụ và ứng dụng bên trong container từ máy host hoặc từ mạng bên ngoài.
  • Data Volumes và Data Volume Containers: Docker cung cấp cách lưu trữ dữ liệu bên ngoài containers thông qua data volumes. Data volumes là các thư mục hoặc thư mục được chia sẻ giữa máy host và container hoặc giữa các container. Bằng cách sử dụng data volumes, bạn có thể duy trì và truy cập dữ liệu mà không bị mất khi container bị xóa.
  • Dùng Docker Swarm Cho Clustering: Docker Swarm là một công cụ tích hợp cho việc quản lý và triển khai một nhóm các máy chủ Docker thành một cụm (cluster) đơn giản. Swarm cho phép bạn quản lý nhiều container trên nhiều máy chủ và tự động phân phối chúng trên các máy chủ khác nhau. Điều này giúp cải thiện sự tin cậy và khả năng mở rộng của hệ thống Docker của bạn.

Ngoài ra Docker còn cung cấp nhiều tính năng khác như quản lý mạng, tạo Docker Compose cho việc triển khai ứng dụng đa-container, và tích hợp với các dịch vụ lưu trữ dữ liệu bên ngoài. Tùy thuộc vào nhu cầu và tình huống cụ thể của bạn, bạn có thể sử dụng những tính năng này để điều chỉnh và mở rộng quá trình phát triển và triển khai ứng dụng của mình trong Docker.

7. Slide 7 – Configuration as Code

Dockerfile là một phần quan trọng trong việc định cấu hình và xây dựng container image cho ứng dụng của bạn. Nó định rõ các bước và yêu cầu để xây dựng môi trường chạy container. Dockerfile cũng có thể được xem là một phần của “Configuration as Code.” Dưới đây là các yếu tố quan trọng liên quan đến Dockerfile và Docker Compose:

Dockerfile: Dockerfile là file cấu hình chính để xây dựng image của container. Nó chứa danh sách các lệnh và các yêu cầu để tạo image. Ví dụ:

# Sử dụng một image gốc
FROM ubuntu:latest

# Cài đặt các phần mềm và thư viện cần thiết
RUN apt-get update && apt-get install -y python3

# Sao chép ứng dụng của bạn vào container
COPY app /app

# Đặt lệnh mặc định khi container chạy
CMD ["python3", "/app/main.py"]

Docker Compose: Docker Compose là một công cụ để quản lý và triển khai ứng dụng bao gồm nhiều container. Bằng cách sử dụng một file docker-compose.yml, bạn có thể định cấu hình các dịch vụ, networks, và volumes của ứng dụng đa-container. Ví dụ:

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

Abstract Command Line Arguments: Bạn có thể sử dụng các biến môi trường và tham số trong Dockerfile để truyền đối số tới ứng dụng của bạn khi container chạy. Điều này giúp bạn tạo image linh hoạt có thể được định cấu hình tùy ý khi chạy container. Ví dụ:

FROM python:3.8

# Đặt biến môi trường
ENV APP_PORT=80
ENV DB_HOST=mydb

# Sao chép ứng dụng và cài đặt các dependencies
COPY app /app
RUN pip install -r /app/requirements.txt

# Định cấu hình lệnh CMD
CMD ["python", "/app/app.py", "--port=$APP_PORT", "--db=$DB_HOST"]

Khi chạy container, bạn có thể sử dụng -e hoặc --env để định cấu hình các biến môi trường.

Dockerfile và Docker Compose là cách tuyệt vời để “document” các yêu cầu và môi trường của ứng dụng của bạn. Bằng cách cung cấp một cấu hình và file Dockerfile hoàn chỉnh, người khác có thể xây dựng và triển khai ứng dụng một cách dễ dàng và đảm bảo tính nhất quán và tương thích với các môi trường khác nhau.

8. Slide 8 – Docker in the Cloud

Khi bạn muốn triển khai ứng dụng trong môi trường Docker, có một số cách để tiến hành quy trình cài đặt và triển khai. Dưới đây là một số cách thức phổ biến:

  • Cài đặt Docker thủ công và Pull Image: Đây là cách thủ công nhất. Bạn sẽ cài đặt Docker trên máy chủ hoặc máy tính của bạn bằng các hướng dẫn cụ thể cho hệ điều hành của bạn. Sau đó, bạn sử dụng lệnh docker pull để kéo image từ Docker Hub hoặc một registry khác và chạy container từ image đó.
  • Sử dụng Docker Management Tools:
    • Docker Machine: Docker Machine là một công cụ để tạo và quản lý các máy ảo Docker trên nhiều nền tảng. Điều này giúp bạn triển khai Docker trên Windows, macOS hoặc các môi trường cloud như AWS hoặc DigitalOcean.
    • Docker Cloud (Trước đây là Tutum): Docker Cloud là một dịch vụ quản lý Docker containers được tích hợp với Docker Hub. Nó cung cấp các tính năng như triển khai tự động, quản lý cluster, và giám sát containers.
    • Universal Control Plane (UCP): UCP là một giải pháp quản lý Docker containers trên nền tảng cloud hoặc on-premises. Nó cung cấp quản lý và giám sát containers trong các môi trường doanh nghiệp.
  • Sử dụng công cụ riêng của cloud:
    • AWS EC2 Container Service (ECS): AWS ECS là một dịch vụ quản lý containers trên Amazon Web Services (AWS). Nó cho phép bạn triển khai và quản lý các containers trên AWS.
    • Azure Container Service (AKS): AKS là dịch vụ quản lý containers trên Microsoft Azure. Nó cung cấp sự tích hợp với Kubernetes và cho phép bạn triển khai và quản lý containers trên nền tảng Azure.
    • Google Kubernetes Engine (GKE): GKE là dịch vụ quản lý containers trên Google Cloud Platform. Nó là một giải pháp tích hợp với Kubernetes để triển khai và quản lý containers trên GCP.

9. Slide 9 – Quick Demo

9.1. Tham khảo mô hình Docker chạy trên máy ảo.

Bạn hãy tham khảo mô hình Docker chạy trên máy ảo bao gồm 2 dịch vụ Zabbix và WordPress.

9.2. Triển khai Zabbix Monitoring.

Phần tiếp theo chúng ta sẽ triển khai Zabbix trên máy ảo 192.168.13.185.

Tạo Network.

Tham khảo https://wiki.hoanghd.com/docker-phan-4-network-trong-docker/. Đầu tiên hãy tạo network cách ly dịch vụ cho Zabbix bằng lệnh docker network create. Ví dụ:

docker network create --subnet 172.1.101.0/24 --ip-range 172.1.101.0/27 zabbix-net

Lệnh docker inspect network sẽ cho phép bạn xem thông tin chi tiết network vừa tạo. Ví dụ:

docker inspect network zabbix-network

Bạn có thể xóa network bằng lệnh docker network rm. Ví dụ:

docker network rm zabbix-network

Tải Image.

Về Image tham khảo https://wiki.hoanghd.com/docker-phan-2-cap-nhat-image-luu-image-ra-file-va-nap-image-tu-file-trong-docker/. Và để tải một image về máy host, sử dụng lệnh docker pull. Ví dụ:

docker pull mariadb

Chạy các dịch vụ liên quan đến Zabbix Monitoring sử dụng Docker Run.

Về triển khai Zabbix, bạn có thể kết hợp bài này và tham khảo thêm link bài cũ https://wiki.hoanghd.com/trien-khai-zabbix-bang-docker/ vì bài cũ sẽ chi tiết hơn bài hướng dẫn này.

  • Để dịch vụ Zabbix chạy, chúng ta cần có 3 thành phần cơ bản:
    • Database.
    • Zabbix Serever.
    • Zabbix Webserver.

Đầu tiên chúng ta triển khai Database cho dịch vụ.

docker run --name mysql-server -t \
      -e MARIADB_DATABASE="zabbixdb" \
      -e MARIADB_USER="zabbix" \
      -e MARIADB_PASSWORD="Passw0rd" \
      -e MARIADB_ROOT_PASSWORD="StrongPassword" \
      -p 3306:3306 \
      --network=zabbix-net \
      --restart unless-stopped \
      -d mariadb:10.5

Tiếp theo chúng ta triển khai Zabbix Server.

docker run --name zabbix-server -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbixdb" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="Passw0rd" \
      --network=zabbix-net \
      -p 10051:10051 \
      --restart unless-stopped \
      -d zabbix/zabbix-server-mysql:6.4-ubuntu-latest

Và cuối cùng là Zabbix Webserver.

docker run --name zabbix-webserver -t \
      -e ZBX_SERVER_HOST="zabbix-server" \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbixdb" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="Passw0rd" \
      --network=zabbix-net \
      -p 80:8080 \
      --restart unless-stopped \
      -d zabbix/zabbix-web-nginx-mysql:6.4-ubuntu-latest

Sau khi chạy xong 3 lệnh Docker Run trên, Zabbix Monitoring của bạn đã hoạt động.

Chạy các dịch vụ liên quan đến Zabbix Monitoring sử dụng Docker Compose.

cat > docker-compose.yml << 'OEF'
version: '3.8'

services:
  db:
    image: mariadb:10.5
    container_name: zabbix-mysql
    restart: always
    environment:
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      MYSQL_ROOT_PASSWORD: zabbix
    networks:
      - zabbix_network

  server:
    image: zabbix/zabbix-server-mysql:6.4-ubuntu-latest
    container_name: zabbix-server
    restart: always
    environment:
      DB_SERVER_HOST: db
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      MYSQL_DATABASE: zabbix
    depends_on:
      - db
    ports:
      - "10051:10051"
    networks:
      - zabbix_network

  web:
    image: zabbix/zabbix-web-nginx-mysql:6.4-ubuntu-latest
    container_name: zabbix-webserver
    restart: always
    environment:
      DB_SERVER_HOST: db
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      MYSQL_DATABASE: zabbix
      ZBX_SERVER_HOST: server
    depends_on:
      - server
    ports:
      - "80:8080"
    networks:
      - zabbix_network

networks:
  zabbix_network:
    driver: bridge
OEF

Sử dụng lệnh Docker Compose để chạy stack này.

docker-compose up -d

Sau khi chạy xong lệnh Docker Compose trên, Zabbix Monitoring của bạn đã hoạt động.

Sử dụng ổ đĩa với Docker Compose.

Dưới đây là một ví dụ chỉnh sửa trong file Docker Compose để mount thư mục của máy host vào container.

services:
  db:
    image: mariadb:10.5
    container_name: zabbix-mysql
    restart: always
    environment:
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      MYSQL_ROOT_PASSWORD: zabbix
    networks:
      - zabbix_network
    volumes:
      - /home/mysql:/var/lib/mysql

10. Hướng dẫn Build Image Backup thiết bị Cisco bằng Dockerfile.

Dưới đây là một hướng dẫn nhanh về cách chạy một ứng dụng Backup Cisco đơn giản trong một container Docker.

10.1. Viết script backup.

Bước 1 – Tạo 2 Switch để thực hành.

Mình dùng nmap để scand IP còn trống. Bạn có thể xem cách sử dụng Nmap tại đây https://wiki.hoanghd.com/su-dung-nmap-trong-linux/. Bạn hãy lựa chọn sử dụng các IP không có trong danh sách đầu ra.

$ nmap -sn -T4 192.168.13.180-244 -oG -
# Nmap 7.80 scan initiated Tue Oct 31 21:31:51 2023 as: nmap -sn -T4 -oG - 192.168.13.180-244
Host: 192.168.13.180 () Status: Up
Host: 192.168.13.181 () Status: Up
Host: 192.168.13.182 () Status: Up
Host: 192.168.13.183 () Status: Up

<đã bỏ bớt một số kết quả>

Host: 192.168.13.239 () Status: Up
Host: 192.168.13.244 () Status: Up
Host: 192.168.13.225 (pve-node1.hoanghd.com)    Status: Up
# Nmap done at Tue Oct 31 21:31:51 2023 -- 65 IP addresses (39 hosts up) scanned in 0.39 seconds

Mình sử dụng 2 Switch Cisco ảo trong EVE. Nếu bạn đã có một nơi lưu trữ các Image của EVE và có share NFS, hãy tham khảo bài https://wiki.hoanghd.com/them-thiet-bi-vao-eve-sieu-nhanh/ để có thể thêm nhanh các thiết bị vào EVE.

Cấu hình cơ bản cho Switch Demo 1 – 192.168.13.182/23

no ip domain-lookup
ip domain-name hoanghd.com
username admin privilege 15 secret 5 Hoanghd164
enable secret Hoanghd164
no logging console

interface Ethernet0/0
 no switchport
 ip address 192.168.13.182 255.255.254.0

ip route 0.0.0.0 0.0.0.0 192.168.12.5

crypto key generate rsa modulus 1024

line vty 0 4
 password Hoanghd164
 login local
 transport input ssh

Cấu hình cơ bản cho Switch Demo 2 – 192.168.13.183/23

no ip domain-lookup
ip domain-name hoanghd.com
username admin privilege 15 secret 5 Hoanghd164
enable secret Hoanghd164
no logging console

interface Ethernet0/0
 no switchport
 ip address 192.168.13.182 255.255.254.0

ip route 0.0.0.0 0.0.0.0 192.168.12.5

crypto key generate rsa modulus 1024

line vty 0 4
 password Hoanghd164
 login local
 transport input ssh

Bước 2 – Cài đặt Docker.

Để cài đặt Docker bạn hãy xem lại bài này https://wiki.hoanghd.com/docker-phan-1-docker-la-gi/ và với Docker Compose xem lại bài https://wiki.hoanghd.com/cai-dat-docker-compose/ hoặc có thể cài đặt nhanh Docker thông qua Script (script chỉ áp dụng với Ubuntu).

bash -c "$(curl -fsSL https://wiki.hoanghd.com/wp-content/uploads/codes/docker-install.sh)"

Kiểm tra version Docker sau khi cài đặt.

docker -v
Docker version 24.0.6, build ed223bc

Và Docker Compose.

$ docker-compose -v
Docker Compose version v2.6.0

Bước 3 – Thiết kế script backup.

Mình sử dụng theo kịch bản sau:

Đầu tiên chạy 1 container Ubuntu 18.04.

docker run -it --name=backup-cisco -v .:/home ubuntu:18.04 bash

Sau khi vào container hãy thực hiện các lệnh dưới để cài đặt công cụ ssh và xác thực mật khẩu cho ssh.

apt update
apt-get install openssh-client sshpass -y

Mình sử dụng ssh để show nội dung config thiết bị Cisco với tham số StrictHostKeyChecking=no giúp chúng ta tự động xác nhận yes khi ssh vào thiết bị mới. Ví dụ:

ssh -o StrictHostKeyChecking=no admin@192.168.13.183 'show running-config'

Công cụ sshpass giúp chúng ta xác nhận mật khẩu ssh.

sshpass -p Hoanghd164 ssh -o "StrictHostKeyChecking no" admin@192.168.13.183 'show running-config'

File script cơ bản (giải thích chi tiết các bạn xem lại talk show của mình).

cat > ./backup-cisco.sh << 'OEF'
#!/bin/bash

username=${USERNAME}
passwd=${PASSWD}
homeFolder=${HOMEFOLDER}
timeout=${TIMEOUT}
device=(${DEVICE})
current_date=$(date +"%Y-%m-%d")

echo -e """\n######################################################################################################################################
#=========== Author: Ha Dang Hoang ==================================================================================================#
#=========== Email: hoanghd164@gmail.com ============================================================================================#
#=========== Personal Wiki page: https://wiki.hoanghd.com ===========================================================================#
#=========== Linux group on Zalo app: https://zalo.me/g/fmitpl996 ===================================================================#
#=========== Description: This container is used for backing up the configuration and VLANID information of Cisco devices ===========#
######################################################################################################################################\n"""

for device_ipaddr in ${device[@]};do 
    sshpass -p $passwd ssh -o StrictHostKeyChecking=no -o ConnectTimeout=$timeout $username@$device_ipaddr 'show running-config' >/dev/null 2>/dev/null
    if [ $? -eq 0 ];then
        backup_dir=$homeFolder/$current_date/$device_ipaddr

        if [ ! -d $backup_dir ];then mkdir -p $backup_dir; fi

        sshpass -p $passwd ssh -o StrictHostKeyChecking=no -o ConnectTimeout=$timeout $username@$device_ipaddr 'show running-config' > $backup_dir/config.conf 2>/dev/null
        echo -e "- Backup the device configuaration file for $device_ipaddr, the backup file is located at $backup_dir/config.conf\n"

        sshpass -p $passwd ssh -o StrictHostKeyChecking=no -o ConnectTimeout=$timeout $username@$device_ipaddr 'show vlan brief' > $backup_dir/vlan.conf 2>/dev/null
        vlanInfo=$(cat $backup_dir/vlan.conf | grep -E '^[0-9]+' | awk '{if ($1 != 1 && $1 != 1002 && $1 != 1003 && $1 != 1004 && $1 != 1005) print "vlan",$1,"\nname",$2}')
        echo -e "configure terminal\n$vlanInfo" > $backup_dir/vlan.conf 2>/dev/null
        echo -e "- Backup the vlan for $device_ipaddr, the backup file is located at $backup_dir/vlan.conf\n"
    else
        echo -e "- The $device_ipaddr Connection timeout, backup failed."
    fi
done
OEF

Bước 4 .Thiết kế Dockerfile.

Dưới đây là nội dung Dockerfile, bạn xem lại bài https://wiki.hoanghd.com/docker-phan-6-dockerfile/ để biết cách build image bằng Dockerfile.

cat > ./Dockerfile << 'OEF'
FROM ubuntu:18.04

ENV TIMEOUT=5
ENV HOMEFOLDER=/backup-cisco

RUN apt-get update
RUN apt-get install openssh-client tree sshpass -y

COPY ./backup-cisco.sh /usr/local/bin/backup-cisco

RUN chmod +x /usr/local/bin/backup-cisco

ENTRYPOINT [ "/usr/local/bin/backup-cisco" ]
OEF

Trường hợp nếu bạn build gặp lỗi dưới là do repo của Ubuntu có vấn đề chứ không phải lỗi code, lý do lỗi là Dockerfile không bỏ qua được khi build image. Và nếu để ý logs bạn sẽ thấy thông báo invalid for another 18h 25min 13s, tức là yêu cầu bạn chờ 19 tiếng nữa mới có thể build được, vậy bạn có thể chờ 19 tiếng hoặc bạn hãy đọc tiếp để biết cách vượt lỗi này.

$ docker build -t backup-cisco:1.0.1 --force-rm -f Dockerfile .
[+] Building 9.0s (6/9)                                                                                                                                                                                               docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                            0.0s
 => => transferring dockerfile: 339B                                                                                                                                                                                            0.0s
 => [internal] load .dockerignore                                                                                                                                                                                               0.1s
 => => transferring context: 2B                                                                                                                                                                                                 0.0s
 => [internal] load metadata for docker.io/library/ubuntu:18.04                                                                                                                                                                 0.0s
 => CACHED [1/5] FROM docker.io/library/ubuntu:18.04                                                                                                                                                                            0.0s
 => [internal] load build context                                                                                                                                                                                               0.0s
 => => transferring context: 2.42kB                                                                                                                                                                                             0.0s
 => ERROR [2/5] RUN apt-get update --allow-releaseinfo-change                                                                                                                                                                   8.8s
------                                                                                                                                                                                                                               
 > [2/5] RUN apt-get update --allow-releaseinfo-change:                                                                                                                                                                              
0.832 Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]                                                                                                                                                    
0.977 Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]                                                                                                                                                               
2.164 Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]                                                                                                                                                      
2.442 Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [83.3 kB]                                                                                                                                                    
2.717 Get:5 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
3.320 Get:6 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
5.200 Get:7 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
5.438 Get:8 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
7.921 Reading package lists...
8.682 E: Release file for http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease is not valid yet (invalid for another 18h 20min 44s). Updates for this repository will not be applied.
8.682 E: Release file for http://archive.ubuntu.com/ubuntu/dists/bionic-updates/InRelease is not valid yet (invalid for another 18h 22min 47s). Updates for this repository will not be applied.
8.682 E: Release file for http://archive.ubuntu.com/ubuntu/dists/bionic-backports/InRelease is not valid yet (invalid for another 18h 25min 13s). Updates for this repository will not be applied.
------
Dockerfile:6
--------------------
   4 |     ENV HOMEFOLDER=/backup-cisco
   5 |     
   6 | >>> RUN apt-get update --allow-releaseinfo-change
   7 |     RUN apt-get install openssh-client tree sshpass -y
   8 |     
--------------------
ERROR: failed to solve: process "/bin/sh -c apt-get update --allow-releaseinfo-change" did not complete successfully: exit code: 100

Hãy run 1 container, vào container tiến hành apt update xong rồi stop container này và commit thành 1 image khác.

docker commit <id_container> <define_image_name>:<define_image_version>

Ví dụ.

docker commit fc08afaea5c6 ubuntu-custom:1.0.1

Xóa bỏ RUN apt-get update đi và đổi tên image mới ubuntu-custom:1.0.1, sau đó hãy build lại Dockerfile.

FROM ubuntu-custom:1.0.1

ENV TIMEOUT=5
ENV HOMEFOLDER=/backup-cisco

RUN apt-get install openssh-client tree sshpass -y

COPY ./backup-cisco.sh /usr/local/bin/backup-cisco

RUN chmod +x /usr/local/bin/backup-cisco

ENTRYPOINT [ "/usr/local/bin/backup-cisco" ]

Xong rồi, tiến hành run container thôi.

docker run --name=my_backup_container --rm \
    -e USERNAME=admin \
    -e PASSWD=Hoanghd164 \
    -e DEVICE='192.168.13.182 192.168.13.183 192.168.13.184' \
    -v /home/cisco-backup-config/vnpt:/backup-cisco \
    backup-cisco:1.0.1

Kết quả.

$ docker run --name=my_backup_container --rm \
>     -e USERNAME=admin \
>     -e PASSWD=Hoanghd164 \
>     -e DEVICE='192.168.13.182 192.168.13.183 192.168.13.184' \
>     -v /home/cisco-backup-config/vnpt:/backup-cisco \
>     backup-cisco:1.0.1

######################################################################################################################################
#=========== Author: Ha Dang Hoang ==================================================================================================#
#=========== Email: hoanghd164@gmail.com ============================================================================================#
#=========== Personal Wiki page: https://wiki.hoanghd.com ===========================================================================#
#=========== Linux group on Zalo app: https://zalo.me/g/fmitpl996 ===================================================================#
#=========== Description: This container is used for backing up the configuration and VLANID information of Cisco devices ===========#
######################################################################################################################################

- Backup the device configuaration file for 192.168.13.182, the backup file is located at /backup-cisco/2023-10-21/192.168.13.182/config.conf

- Backup the vlan for 192.168.13.182, the backup file is located at /backup-cisco/2023-10-21/192.168.13.182/vlan.conf

- Backup the device configuaration file for 192.168.13.183, the backup file is located at /backup-cisco/2023-10-21/192.168.13.183/config.conf

- Backup the vlan for 192.168.13.183, the backup file is located at /backup-cisco/2023-10-21/192.168.13.183/vlan.conf

- The 192.168.13.184 Connection timeout, backup failed.

11. Hướng dẫn Build Image thực thi lệnh Linux bằng API bằng Dockerfile.

Với ứng dụng này bạn có thể tắt mở server từ xa, sử dụng tất các lệnh trong Linux từ xa bằng API, giúp bạn có thể điều khiển chúng khi không ngồi máy tính.

Mình sẽ tạo một thư mục với cấu trúc file và thư mục như dưới.

../
└── api
    ├── app.py
    ├── Dockerfile
    ├── entrypoint
    └── requirements.txt

1 directory, 4 files

Đầu tiên hãy tạo thư mục api vào folder cha nào đó.

mkdir -p /home/api

Tiếp theo tạo nội dung của ứng dụng (chi tiết ứng dụng bạn hãy xem lại live của mình).

cat > /home/api/app.py << 'OEF'
from flask import Flask
import paramiko

app = Flask(__name__)

username='root'
password='mb@834228'

def execute_ssh_command(hostname, username, password, command):
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname, username=username, password=password)

        stdin, stdout, stderr = ssh_client.exec_command(command)
        
        output = stdout.read().decode("utf-8")

        ssh_client.close()

        return output

@app.route('/')
def hello_world():
    return "<h1>Hello, World</h1>"

@app.route("/<string:target_ipaddr>/<string:command>/", methods=['GET'])
def linux_command(target_ipaddr,command):
    result_command = execute_ssh_command(target_ipaddr, username, password, command)

    return result_command

@app.route("/<string:target_ipaddr>/<string:action>/<int:vmid>", methods=['GET'])
def action_vm(target_ipaddr,action,vmid):
    command = 'pct %s %s' %(action,vmid) 
    result_command = execute_ssh_command(target_ipaddr, username, password, command)

    return result_command

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=5000)
OEF

Dưới đây là nội dung Dockerfile, tương tự bạn xem lại bài https://wiki.hoanghd.com/docker-phan-6-dockerfile/ để biết cách build image bằng Dockerfile.

cat > /home/api/Dockerfile << 'OEF'
FROM ubuntu:22.04

LABEL maintainer="HaDangHoang <hoanghd164@gmail.com>"
RUN apt-get update && apt-get install -y vim python3.10 python3-setuptools python3-pip python3.10-venv gcc libmysqlclient-dev python3-dev mysql-client curl iputils-ping telnet
RUN apt install pkg-config -y
COPY requirements.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt

COPY app.py /api/app.py
COPY entrypoint /usr/local/bin/entrypoint
RUN chmod +x /usr/local/bin/entrypoint

WORKDIR /api

ENTRYPOINT ["entrypoint"]
OEF

Nội dung entrypoint của container.

cat > /home/api/entrypoint << 'OEF'
#!/bin/bash
python3 /api/app.py
tail -f /dev/null
OEF

Các module cần thiết cho ứng dụng.

cat > /home/api/requirements.txt << 'OEF'
Flask
Flask-SQLAlchemy
Flask-Bcrypt
mysqlclient
netmiko
python-dotenv
flask-marshmallow
wheel
asterisk
wikidata
pyst2
Flask-CORS
jsonpath_ng
graypy
OEF

Hãy chạy các câu lệnh dưới để build và sử dụng ứng dụng nhé.

docker build -t hoanghd164/api:1.0.1 --force-rm -f Dockerfile .
docker run -itd --name=api -v /home:/alerts -p 5000:5000 hoanghd164/api:1.0.1 bash
docker exec -it api bash
docker logs api

Nếu muốn push lên Docker Hub, hãy sử dụng lệnh Docker Push.

docker push hoanghd164/api:1.0.1

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories