Phần 1 – Làm quen Docker & Container

Mở đầu: Cơn ác mộng “Chạy được trên máy em”

Nếu bạn từng làm data, dev, hay deploy dashboard — chắc hẳn bạn đã nghe (hoặc nói) câu này:

“Em chạy thử trên máy em được mà anh, sao trên server lại lỗi?”

Một câu nghe quen thuộc, nhưng là khởi nguồn của hàng trăm giờ debug vô nghĩa.
Cùng một đoạn code, cùng một thư viện, nhưng khi lên môi trường khác — lại lỗi.

Tại sao vậy?
Bởi vì ứng dụng không chỉ cần code, mà còn cần môi trường chạy: phiên bản Python, Java, Node, gói thư viện, OS, biến môi trường, cấu hình network...
Và chỉ cần một điểm khác biệt — mọi thứ có thể đổ bể.

Đó là lý do Docker ra đời.
Một công cụ giúp bạn đóng gói cả ứng dụng lẫn môi trường của nó vào trong một chiếc hộp gọi là container — và chạy được mọi nơi.

Câu chuyện ra đời của Docker

Năm 2013, công ty dotCloud (sau đổi tên thành Docker Inc.) tung ra Docker – một nền tảng mới dựa trên công nghệ containerization vốn đã tồn tại trong Linux từ lâu.

Điều làm Docker trở nên đặc biệt là:

  • đơn giản hóa quá trình tạo và quản lý container.
  • chuẩn hóa cách đóng gói ứng dụng.
  • Và quan trọng nhất: mang tính di động cực caobuild một lần, chạy mọi nơi.

    Trước đó, việc triển khai ứng dụng giống như việc chuyển nhà:

    Bạn gói đồ, chuyển sang nhà mới, rồi phát hiện ra ổ điện không khớp, nước không chảy, mạng không vào…
    Docker giống như có một “container” đóng gói trọn căn phòng của bạn – di chuyển tới đâu cũng chạy được như cũ.

    Container là gì?

    Hãy tưởng tượng bạn đang chạy một ứng dụng Python.
    Bạn cần Python 3.10, cần Flask, Pandas, vài file config, và một port mở 5000.

    Thay vì cài từng thứ trên máy thật, bạn dùng Docker để tạo một “thùng chứa” – container – có sẵn mọi thứ bạn cần.

    Container là một môi trường độc lập, cô lập với máy chủ, nơi ứng dụng của bạn chạy như thể nó đang ở “máy riêng”.
    Nó không làm ảnh hưởng tới hệ điều hành chính, không chiếm nhiều tài nguyên, và có thể bật tắt trong vài giây.

    Docker hoạt động như thế nào?

    Docker có hai phần chính:

    Thành phần Vai trò
    Docker Engine Phần mềm cốt lõi để chạy container (gồm daemon, CLI, API)
    Docker Hub / Registry Kho chứa image (giống GitHub cho code)

    Quy trình cơ bản:

    1. Bạn viết Dockerfile – mô tả cách tạo image.
    2. Docker build file đó thành một image (giống snapshot của môi trường).
    3. Khi bạn chạy image, Docker tạo ra container từ image đó.
    4. Container chạy độc lập, nhưng có thể kết nối với bên ngoài (port, volume, network).

    5. Container vs Virtual Machine (VM)

    Nhiều người nhầm container là “máy ảo” thu nhỏ, nhưng thực ra không phải.
    Cùng nhìn bảng sau:

    Tiêu chí Virtual Machine Docker Container
    Cần hệ điều hành riêng Có (Windows/Linux…) Dùng chung kernel với host
    Dung lượng Hàng GB Vài trăm MB
    Tốc độ khởi động Vài phút Vài giây
    Mức tiêu thụ tài nguyên Cao Thấp
    Tính di động Khó Cao
    Tình huống dùng Chạy nhiều OS khác nhau Triển khai app cùng môi trường

    Ví dụ:
    Nếu bạn chỉ muốn chạy ứng dụng Python, bạn không cần cài một Ubuntu hoàn chỉnh.
    Docker chỉ cần chia sẻ kernel, nạp phần cần thiết – nhanh hơn rất nhiều.

    6. Cài đặt Docker


    Windows

    Tải Docker Desktop tại:
    https://docs.docker.com/desktop/install/windows/

    Sau khi cài, mở PowerShell và kiểm tra:

    docker --version
    

    Mac

    Tương tự, dùng link:
    https://docs.docker.com/desktop/install/mac/

    Ubuntu / Linux

    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io
    sudo systemctl start docker
    sudo systemctl enable docker
    

    Nếu chạy được lệnh dưới và thấy dòng “Hello from Docker!” là thành công:

    docker run hello-world
    

    7. Chạy container đầu tiên

    Sau khi cài xong, hãy thử:

    docker run hello-world
    

    Docker sẽ:

    • Tải image hello-world từ Docker Hub.
    • Tạo container mới.
    • Chạy đoạn code in ra dòng chào mừng.

    Kết quả:

    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    

    Xin chúc mừng, bạn vừa chạy container đầu tiên trong đời.

    8. Cấu trúc cơ bản của Docker

    Docker có 3 “lớp” quan trọng:

    1. Image – là mẫu đóng gói, chứa hệ điều hành, code, và cấu hình.
    2. Container – là instance được tạo ra khi bạn chạy image.
    3. Dockerfile – là bản hướng dẫn để tạo image.

    Ví dụ:

    Dockerfile -> docker build -> Image -> docker run -> Container
    

    9. Viết Dockerfile đầu tiên


    Tạo file Dockerfile trong thư mục dự án của bạn:

    # Sử dụng image Python cơ bản
    FROM python:3.10-slim
    
    # Đặt thư mục làm việc
    WORKDIR /app
    
    # Sao chép code vào container
    COPY . /app
    
    # Cài thư viện cần thiết
    RUN pip install flask
    
    # Chạy ứng dụng
    CMD ["python", "app.py"]
    

    Rồi chạy:

    docker build -t my_flask_app .
    docker run -p 5000:5000 my_flask_app
    

    Truy cập http://localhost:5000 → ứng dụng Flask của bạn đã chạy trong container.

    10. Các lệnh Docker cơ bản

    Lệnh Mô tả Ví dụ
    docker ps Xem container đang chạy docker ps
    docker ps -a Xem tất cả container (kể cả đã dừng) docker ps -a
    docker images Xem danh sách image docker images
    docker run Chạy container từ image docker run nginx
    docker stop Dừng container docker stop <id>
    docker rm Xoá container docker rm <id>
    docker rmi Xoá image docker rmi nginx
    docker exec -it Truy cập bên trong container docker exec -it <id> bash

    Pro tip: Dùng docker ps --format "{{.ID}} {{.Image}} {{.Status}}" để xem gọn thông tin container.

    1. Làm quen với Docker Hub

    Docker Hub là kho lưu trữ hàng triệu image miễn phí.

    Bạn có thể tìm image của:

    • nginx
    • mysql
    • postgres
    • redis
    • python
    • node
    • pandas, airflow, v.v.

    Ví dụ chạy Nginx:

    docker pull nginx
    docker run -d -p 8080:80 nginx
    

    Rồi mở trình duyệt:
    http://localhost:8080

    Bạn đang chạy web server Nginx trong container, không cài đặt gì thêm!

    12. Volume và Network – hai khái niệm cần biết sớm


    📁 Volume

    Container bị xóa → dữ liệu bên trong cũng mất.
    Nếu bạn cần lưu dữ liệu, hãy gắn volume:

    docker run -d -v /data/mysql:/var/lib/mysql mysql
    

    /data/mysql trên máy thật được gắn vào container.

    🌐 Network

    Muốn các container giao tiếp với nhau (ví dụ app ↔ database), bạn có thể tạo mạng riêng:

    docker network create my_network
    docker run -d --name db --network my_network mysql
    docker run -d --name app --network my_network my_flask_app
    

    13. Tại sao Docker quan trọng với dân Data?

    Docker không chỉ dành cho dev, mà là vũ khí bắt buộc cho dân Data/BI/ML:

    • Reproducibility: Model chạy giống nhau ở mọi môi trường.
    • Data pipeline stable: Không còn lỗi “module not found” khi deploy Airflow hoặc Jupyter.
    • Environment isolation: Nhiều project Python cùng tồn tại mà không conflict version.
    • Deployment dễ dàng: Build xong image → push lên server hoặc cloud.

    Ví dụ:
    Bạn tạo image Airflow, Postgres và Redis riêng → ghép chúng bằng docker-compose.yml
    => Toàn bộ hệ thống chạy chỉ với 1 lệnh docker compose up.

    14. Một ngày làm việc không Docker sẽ thế nào?

    • Setup Jupyter → lỗi kernel.
    • Cài Airflow → lỗi dependency.
    • Deploy Flask → lỗi version.
    • Chạy job cron → lệch timezone.
    • Copy sang máy khác → lỗi môi trường.

    Còn với Docker, bạn chỉ cần:

    docker build -t my_app .
    docker run -d my_app
    

    Không quan tâm OS, package, hay thư viện.
    Mọi thứ “như cũ”, gói gọn trong một hộp.

    15. Khi nào KHÔNG nên dùng Docker?

    Docker rất mạnh, nhưng không phải lúc nào cũng hợp:

    • Ứng dụng cực kỳ nhỏ, chạy một lần là xong.
    • Môi trường bị hạn chế quyền root (ví dụ laptop công ty).
    • Ứng dụng có GUI hoặc cần truy cập phần cứng (GPU, camera) mà chưa setup driver phù hợp.

    Tuy nhiên, đa phần các dự án data, backend, BI đều rất phù hợp với Docker.

    16. Debug và thực hành nhỏ

    Nếu bạn build Dockerfile bị lỗi, dùng:

    docker build -t my_app . --progress=plain
    

    hoặc mở terminal container:

    docker run -it my_app /bin/bash
    

    Tại đây bạn có thể test trực tiếp như trong môi trường thật.

    17. Docker vs Conda, Virtualenv, Venv?

    Công cụ Phạm vi Mục đích
    venv, virtualenv Python environment Quản lý thư viện Python
    conda Python + system lib Quản lý cả thư viện & environment
    docker Toàn bộ hệ thống Đóng gói toàn bộ app + OS + lib

    Docker bao trùm hết: có thể chứa Conda bên trong container nếu cần.

    18. Lời khuyên cho người mới học

    • Đừng học Docker như học syntax, hãy hiểu vì sao nó tồn tại.
    • Hãy thử container hóa một ứng dụng bạn từng chạy thủ công.
    • Khi gặp lỗi, đọc log với docker logs <id> – gần như luôn có lời giải.
    • Dành thời gian hiểu Dockerfile layer, vì đó là cách tối ưu build image.
    • Khi bạn hiểu container, bạn đang bước sang thế giới DevOps – nơi mọi thứ có thể tái tạo bằng code.

    19. Thực hành nhỏ: Container hóa Flask App

    1. Tạo file app.py

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def home():
        return "Hello Docker!"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    

    2. Tạo file Dockerfile

    FROM python:3.10-slim
    WORKDIR /app
    COPY . .
    RUN pip install flask
    CMD ["python", "app.py"]
    

    3. Build & Run

    docker build -t my_flask_app .
    docker run -p 5000:5000 my_flask_app
    

    4. Mở trình duyệt:
    http://localhost:5000
    → Bạn thấy “Hello Docker!”

    Chúc mừng, bạn đã tự tay container hóa ứng dụng đầu tiên 🎉

    20. Kết luận: Docker không chỉ là công cụ – nó là tư duy

    Docker giúp bạn thay đổi cách nhìn về “môi trường triển khai”.
    Trước đây, bạn phải cấu hình server để chạy code.
    Giờ thì ngược lại — bạn đóng gói môi trường vào code, rồi mang nó đi bất cứ đâu.

    Build once, run anywhere.

    Với dân Data & BI, đây là bước đầu tiên để tiến tới:

    • Automation pipelines (Airflow, dbt)
    • Cloud deployment (AWS ECS, GCP Cloud Run)
    • Reproducible ML experiments (MLflow, Hugging Face)

      Nếu bạn hiểu container, bạn đã nắm nền móng của mọi hệ thống hiện đại.

      Tóm tắt cuối bài

      Khái niệm Giải thích ngắn
      Docker Nền tảng container hóa ứng dụng
      Image Mẫu đóng gói ứng dụng + môi trường
      Container Phiên bản đang chạy của image
      Dockerfile File mô tả cách tạo image
      Volume Lưu trữ dữ liệu bền vững
      Network Cho container giao tiếp
      Docker Hub Kho chia sẻ image
      Lợi ích chính Nhanh, nhẹ, di động, tái tạo được


      Bài tập gợi ý

      1. Cài Docker Desktop và chạy hello-world.
      2. Chạy nginx và mở trên trình duyệt.
      3. Container hóa một script Python có pandas hoặc flask.
      4. Dừng, xóa container, rebuild lại — đảm bảo kết quả y hệt.
      5. Viết 1 dòng note: “Nếu không có Docker, tôi sẽ phải làm thế nào để chạy lại app này?”

      Ví dụ thực tế trên máy bạn

      # 1. Dừng tất cả container docker stop $(docker ps -aq) # 2. Xóa toàn bộ container docker rm $(docker ps -aq) # 3. Xóa image cũ docker rmi my_flask_app # 4. Build lại từ đầu docker build -t my_flask_app . # 5. Chạy lại docker run -p 5000:5000 my_flask_app


        Đăng nhận xét

        0 Nhận xét