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áccontainer
chia sẻ kernel của host với nhau. Điều này có nghĩa cáccontainer
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ỗicontainer
.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.
- 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:
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ệnhdocker 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 đó.
- Sử dụng lệnh
- 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.
- Sử dụng lệ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.
- Sử dụng lệnh
- 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.
- Chạy container bằng lệnh
- Đặ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ó.
- Sử dụng lệnh
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.
- Để xây dựng một image, Docker Client sử dụng lệnh
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.
- Tham khảo hướng dẫn Docker Push.
- Trường hợp Push Docker Hub:
https://wiki.hoanghd.com/docker-phan-12-push-image-len-docker-hub/
- Trường hợp muốn xây Repo riêng:
https://wiki.hoanghd.com/docker-phan-11-tao-kho-chua-registry-rieng-de-chua-cac-image-docker/
- Trường hợp Push Docker Hub:
docker push hoanghd164/api:1.0.1