Giới thiệu
Docker là gì ? Tại sao dùng Docker ? Nếu tìm kiếm trên internet sẽ có khá nhiều thông tin, tài liệu về Docker và trước đây mình gặp một chút khó khăn khi tiếp cận, một phần do chỉ đọc lý thuyết chưa có cơ hội dùng chúng trong thực tế. Dưới phần thực hành mình có một bài tập nhỏ nếu bạn mới tìm hiểu về Docker có thể lấy về thực hành
Docker là gì ?
Sau kì thực tập mình thấy Docker được dùng vào các công việc như sau:
- Dùng để chạy đồng nhất các môi trường dùng trong dự án (Ví dụ: quy định dùng chung JDK 21 trong Java, Postgres 17, ...) và giúp lập trình viên không cần phải cài thủ công nhiều môi trường
- Dùng deploy chương trình của chúng ta, thay vì chạy "main" rồi treo máy để chương trình hoạt động, dữ liệu sinh ra (Ví dụ: dữ liệu Log, dữ liệu trong các table trong database) khi chúng ta test sẽ chỉ được lưu riêng tại từng máy của các thành viên trong nhóm thay vào đó nếu dùng Docker kết hợp với Woodpecker có thể giải quyết vấn đề trên.
Đó là một số lợi ích mà mình thấy được khi dùng Docker, nếu mọi người biết thêm về các lợi ích khi dùng Docker hãy chia sẻ với mình nhé.
1. Thành phần trong Docker
services: postgres: image: postgres:17 container_name: local-postgres ports: - "5432:5432" environment: POSTGRES_USER: admin POSTGRES_PASSWORD: //thêm password tại đây POSTGRES_DB: sample volumes: - ./data/postgres:/var/lib/postgresql/data - ./initdb:/docker-entrypoint-initdb.d networks: - local-net redis: image: redis:7.4.2 container_name: local-redis ports: - "6379:6379" command: ["redis-server", "--requirepass", "//thêm password tại đây"] volumes: - ./data/redis:/data networks: - local-net # OpenSearch opensearch: image: opensearchproject/opensearch:2.19.1 container_name: opensearch restart: unless-stopped environment: - cluster.name=opensearch-cluster - node.name=opensearch - discovery.type=single-node - bootstrap.memory_lock=true - OPENSEARCH_JAVA_OPTS=${OPENSEARCH_JAVA_OPTS} - OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD} - plugins.security.ssl.http.enabled=false - logger.level=WARN ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 deploy: resources: limits: memory: 2g volumes: - ${OPENSEARCH_DATA}:/usr/share/opensearch/data - ./logs:/usr/share/opensearch/logs networks: - local-net ports: - "9200:9200" # OpenSearch Dashboards opensearch-dashboards: image: opensearchproject/opensearch-dashboards:2.19.1 container_name: ${OPENSEARCH_DASHBOARD_CONTAINER} ports: - "5601:5601" volumes: - ./config/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml - ./logs:/usr/share/opensearch-dashboards/logs networks: - local-net depends_on: - opensearch restart: unless-stopped networks: local-net: driver: bridge
Phía trên là một "Dockerfile" chúng ta sẽ cùng khám phá file này để hiểu về Docker
Docker Image
Docker Image giống như một bản vẽ, khuân mẫu để tạo container. Theo Dockerfile phía trên image là "postgres:17", "redis:7.4.2", ....
Docker Container
Container là một instance của Image, giống như một ngôi nhà thực tế được xây từ bản vẽ - docker image, chúng ta có thể đặt tên cho container bằng cách sử dụng container_name.
Docker Network
Trong Dockerfile phía trên chứa các image khi chạy thành công sẽ tạo ra các container Postgres, Redis, OpenSearch. Các container này muốn giao tiếp với nhau cần nằm trong cùng một network, network giống như một con đường kết nối giữa các ngôi nhà (container). Chúng ta có thể quy định tên, trong Dockerfile phần network được quy định bằng biến networks, tên là local-net.
Volumes trong Docker
Đây là phần chỉ định nơi nào trong ổ cứng lưu dữ liệu được tạo ra từ container
- Ví dụ:
volumes: - ${OPENSEARCH_DATA}:/usr/share/opensearch/data - ./logs:/usr/share/opensearch/logs
${OPENSEARCH_DATA} và ./logs là các vị trí trong ổ cứng máy tính của chúng ta, /usr/share/opensearch/data và /usr/share/opensearch/logs là những nơi dữ liệu được sinh ra trong container. Khi cấu hình volumes như trên data trong container sẽ được lưu vào các folder chỉ định trong ổ cứng.
Các câu lệnh cơ bản
Phía trên là các phần cơ bản trong Docker, các bạn có thể tìm hiểu sâu hơn thông qua các tài liệu. Dưới đây là một số câu lệnh cơ bản:
- docker compose up -d: đây là câu lệnh chạy Dockerfile để khởi tạo các phần ứng với file môi trường ".env". Ngoài ra, nếu bạn sử dụng file môi trường được quy định tên (Ví dụ : docker.env) thì câu lệnh sẽ khác một chút, bạn cần chỉ định file môi trường trong câu lệnh.
- docker compose down -v: câu lệnh này sẽ dừng và xóa dữ liệu trong các container
- docker ps: câu lệnh dùng để hiển thị các container trong docker
- docker logs <container_name>: lệnh này dùng để xem log của một container nào đó, nếu có lỗi chúng ta có thể biết đó là lỗi gì.
2. Thực hành
-
Các bạn lấy bài tập trong link github và thực hiện chạy lệnh docker compose up -d sau đó chạy lệnh docker ps dựa vào cột "Status" để xem các container có hoạt động bình thường không, nếu thấy lỗi ở container nào đó các bạn vào xem log và sửa lỗi sau đó chạy lại lệnh docker compose down -v để xóa dữ liệu cũ và chạy lại docker compose up -d
-
Khi chạy thành công các bạn sẽ truy cập được vào OpenSearch và Opensearch Dashboard tại http://localhost:5601/ và http://localhost:9200/ .
-
Lưu ý: một số phần trong file docker vẫn còn thiếu cần sửa, thêm các biến cần thiết trong file "env" để có thể hoạt động bình thường
Chúc các bạn thành công❤️