Quay lại

Bài 4: Sử dụng docker như thế nào? Chuyên mục Docker    2023-11-26    82 Lượt xem    76 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Bài 4: Sử dụng docker như thế nào?


 Một số công cụ để tương tác với Docker

Khi làm việc với Docker, có nhiều công cụ trình soạn thảo (text editor) mà bạn có thể sử dụng để chỉnh sửa cấu hình Dockerfile, quản lý các tệp tin Docker Compose, và thực hiện các công việc liên quan đến Docker chúng ta sẽ sử dụng Visual Studio Code nhé bởi vì nó rất nhẹ và hỗ trợ nhiều extention:

Visual Studio Code (VSCode):

  • Visual Studio Code là một trình soạn thảo mã nguồn mở và miễn phí, hỗ trợ nhiều ngôn ngữ lập trình và tích hợp tốt với Docker thông qua các extension như "Docker" và "Docker Compose".
  • Download : https://code.visualstudio.com/download

Các câu lệnh quản trị Docker

Kiểm tra trạng thái của docker:

docker -v
  • Lệnh docker -v là một trong những lệnh sử dụng với Docker Command-Line Interface (CLI). Khi bạn chạy lệnh này trong dòng lệnh, nó trả về phiên bản của Docker hiện tại đã được cài đặt trên hệ thống của bạn.
  • Ví dụ, nếu bạn chạy lệnh docker -v và Docker đã được cài đặt, kết quả có thể giống như sau:
  • Docker version 20.10.0, build 7287ab3
  • Ở đây, 20.10.0 là số phiên bản của Docker, và 7287ab3 là mã xây dựng (build). Thông tin này cung cấp cho bạn thông tin về phiên bản cụ thể của Docker mà bạn đang sử dụng. Điều này có thể hữu ích khi bạn làm việc với các tính năng hoặc cấu hình cụ thể có sẵn từ một phiên bản Docker cụ thể.
docker info
  • Lệnh docker info được sử dụng để hiển thị thông tin chi tiết về hệ thống Docker và cấu hình của nó. Khi bạn chạy docker info trong dòng lệnh, nó sẽ cung cấp một loạt các thông số, bao gồm thông tin về số lượng container đang chạy, số lượng images, thông tin về lưu trữ và mạng, và nhiều thông số khác.

    Ví dụ kết quả của docker info có thể như sau:

  • Containers: 5
    Images: 32
    Server Version: 20.10.0
    Storage Driver: overlay2
    ...
  • Thông tin này có thể hữu ích khi bạn cần kiểm tra tình trạng của hệ thống Docker, đặc biệt là khi bạn đang gặp vấn đề hoặc muốn biết thêm chi tiết về cấu hình Docker trên máy tính của mình.

Cú pháp chạy CLI của Docker

docker --help

Khi bạn chạy lệnh docker --help trong dòng lệnh, Docker CLI sẽ hiển thị một bản tóm tắt của tất cả các lệnh và tùy chọn mà Docker hỗ trợ. Điều này là hữu ích khi bạn muốn xem một danh sách đầy đủ của các chức năng và cú pháp mà Docker cung cấp.

Kết quả của docker --help sẽ bao gồm các phần sau:

  • Usage (Sử dụng): Mô tả cách sử dụng cơ bản của lệnh Docker.

  • Commands (Lệnh): Danh sách tất cả các lệnh mà Docker hỗ trợ.

  • Management Commands (Lệnh Quản lý): Các lệnh quản lý hệ thống như info, system,...

  • Commands for Containers (Lệnh cho Container): Các lệnh liên quan đến quản lý và tương tác với container.

  • Commands for Services (Lệnh cho Dịch vụ): Các lệnh liên quan đến quản lý và tương tác với các dịch vụ (services).

  • Commands for Swarm (Lệnh cho Swarm): Các lệnh liên quan đến Docker Swarm, một công cụ quản lý container phân tán.

  • Commands for Images (Lệnh cho Ảnh): Các lệnh liên quan đến quản lý và xử lý ảnh (images).

  • Commands for Networks (Lệnh cho Mạng): Các lệnh liên quan đến quản lý và tạo các mạng Docker.

  • Commands for Volumes (Lệnh cho Thư mục): Các lệnh liên quan đến quản lý và tạo thư mục (volumes).

  • Commands for Plugins (Lệnh cho Plugin): Các lệnh liên quan đến quản lý và sử dụng các plugin Docker.

  • Commands for System (Lệnh cho Hệ thống): Các lệnh liên quan đến quản lý và xem thông tin hệ thống Docker.

  • Options (Tùy chọn): Các tùy chọn chung mà bạn có thể sử dụng với mọi lệnh Docker.

Tóm lại để nhớ được các cú pháp của docker các bạn nên như theo cú pháp chung sau:

docker <Management command> <Action command> [OPTION]

Chạy một Container đầu tiên

Để chạy một container đầu tiên sử dụng image nginx trong Docker, chúng ta có thể thực hiện các bước sau:

  • Tải image Nginx từ Docker Hub (nếu bạn chưa có nó):

    docker pull nginx​

    Lệnh này sẽ tải image nginx từ Docker Hub về máy tính của bạn.

  • Chạy container từ image đã tải về:

    docker run -d -p 80:80 --name my-nginx nginx​
    • -d: Chạy container ở chế độ nền (background).
    • -p 80:80: Mở cổng 80 của máy tính cho container. Điều này có nghĩa là bạn có thể truy cập nginx từ trình duyệt của bạn bằng cách sử dụng http://localhost.
    • --name my-nginx: Đặt tên cho container là my-nginx. Bạn có thể chọn một tên khác theo mong muốn.
  • Kiểm tra container đang chạy:

    docker ps​

    Hoặc

    docker container ls

    Hoặc

    docker container ps

    docker container ps có thể nhìn thấy tất cả các thông tin toàn bộ containers trên nhiều node khác nhau, thường được dùng trong môi trường cluster.

    Các lệnh trên sẽ liệt kê các container đang chạy, và bạn sẽ thấy container với tên là my-nginx và các thông số liên quan.

    Hoặc muốn liệt kê các container đang chạy và không chạy thì dùng cmd

    docker container ls -a
  • Truy cập Nginx từ trình duyệt:
    • Mở trình duyệt và nhập địa chỉ http://localhost. Nếu mọi thứ diễn ra đúng, bạn sẽ thấy trang mặc định của Nginx.
  • Dừng container
    docker stop my-nginx

    Bạn có thể sử dụng container ID hoặc container name Hoặc chỉ cần gõ một vài chữ số đầu của ID container để stop container 

    Nếu bạn muốn xóa container sau khi dừng:

    docker rm my-nginx​

Như vậy, bạn đã chạy một container Nginx đầu tiên trên Docker.

Lưu ý: Nếu bạn chạy trên môi trường Linux và gặp vấn đề quyền truy cập cổng 80, hãy đảm bảo rằng không có dịch vụ nào đang sử dụng cổng 80 trên máy tính của bạn hoặc thử sử dụng cổng khác trong lệnh -p, ví dụ, -p 8080:80.

Container có phải là một Process hay không?

Trong Docker, một container thường được mô tả như là một quy trình (process). Một container Docker là một môi trường chứa các ứng dụng và tất cả các thành phần cần thiết để chạy ứng dụng đó, bao gồm hệ điều hành, thư viện, và các tài nguyên khác. Mô hình container sử dụng các công nghệ ảo hóa nhẹ (lightweight virtualization). Một container chạy trên một môi trường được cô lập, gọi là một namespace, Container chia sẻ kernel của hệ điều hành với host (tức là container không chứa một bản sao của kernel riêng biệt mà sử dụng kernel của hệ điều hành host để thực thi các tiến trình bên trong container.), nhưng có môi trường tách biệt để chạy ứng dụng.

Khi bạn chạy một container Docker, thực tế là bạn đang chạy một quy trình (process) trong container đó. Mỗi container chứa một hoặc nhiều quy trình, tùy thuộc vào cách bạn cấu hình ứng dụng và container đó.

Do đó, có thể nói rằng container Docker có thể được coi là một hoặc nhiều quy trình chạy trong một môi trường tách biệt. Container cung cấp một cách để đóng gói và triển khai ứng dụng cùng với tất cả các phụ thuộc của nó mà không cần quan tâm đến cấu hình chi tiết của hệ điều hành hoặc môi trường chạy.

Công nghệ Container cung cấp nhiều tính năng và lợi ích của VM, bao gồm cả thực thi các ứng dụng độc lập, khả năng mở rộng linh hoạt cùng với một số các lợi ích như sau:

  • Dung lượng: Tương tự VM, Container không chứa toàn bộ OS và chỉ bao gồm một vài Process và thành phần cần thiết của OS, dùng để thực thi code. Dung lượng của Container lên tới GB giúp sử dụng Hardware hiệu quả và khởi động nhanh hơn.
  • Sử dụng tài nguyên: Đối với các Container, bạn có thể chạy nhiều bản copy của ứng dụng trên cùng một máy chủ, giúp giảm chi phí khi sử dụng hạ tầng Cloud.
  • Hiệu suất: So với VM, các Container có thể triển khai nhanh hơn và dễ dàng provision, khởi động lại ứng dụng. Chính vì thế, nó được sử dụng trong quá trình CI/CD và phù hợp với phương pháp Agile và DevOPS.

Hãy thử so sánh container và VM machine có gì khác nhau :

Container và máy ảo (VM - Virtual Machine) là hai khái niệm khác nhau trong việc ảo hóa tài nguyên máy tính. Dưới đây là một số khác biệt chính giữa chúng:

  1. Kiến trúc và tài nguyên:

    • Container: Chia sẻ kernel của hệ điều hành với host và chứa ứng dụng và các thư viện cần thiết. Containers chia sẻ tài nguyên với host và containers khác thông qua cơ chế cgroups và namespaces.
    • Máy ảo: Bao gồm một hệ điều hành đầy đủ và ảo hóa phần cứng. Mỗi máy ảo có kernel của riêng mình và không chia sẻ tài nguyên trực tiếp với host.
  2. Khởi động và thời gian triển khai:

    • Container: Khởi động nhanh vì chúng chia sẻ kernel với host và không cần phải tạo máy ảo đầy đủ. Containers có thể triển khai trong vài giây.
    • Máy ảo: Yêu cầu thời gian khởi động và triển khai lâu hơn vì cần tạo máy ảo đầy đủ với kernel riêng.
  3. Tài nguyên:

    • Container: Tiêu thụ ít tài nguyên hơn so với máy ảo vì chia sẻ kernel và sử dụng các cơ chế ảo hóa nhẹ như namespaces và cgroups.
    • Máy ảo: Tốn nhiều tài nguyên hơn vì mỗi máy ảo đều có hệ điều hành và kernel đầy đủ.
  4. Ứng dụng di động:

    • Container: Dễ di động và có thể chạy trên bất kỳ môi trường nào có hỗ trợ Docker hoặc containerization.
    • Máy ảo: Di động khó khăn hơn do cần môi trường ảo hóa (hypervisor) tương ứng trên mỗi host.
  5. Bảo quản hệ điều hành:

    • Container: Chia sẻ kernel, do đó ít tiêu tốn tài nguyên và dễ quản lý.
    • Máy ảo: Đòi hỏi nhiều tài nguyên và có thể phức tạp trong việc quản lý nếu có nhiều máy ảo chạy trên một host.

Tùy thuộc vào yêu cầu cụ thể của ứng dụng và môi trường triển khai, người ta có thể lựa chọn sử dụng container hoặc máy ảo.

Để chứng mình container là 1 tiến trình mà ko phải 1 cái mini VM ta có thể dụng cmd sau: 

Lệnh docker container top trong Docker được sử dụng để hiển thị các quy trình đang chạy trong một container. Cú pháp cơ bản của lệnh này như sau:

docker container top <container_id_or_name>

Kết quả của lệnh này sẽ hiển thị một bảng thông tin, trong đó mỗi hàng đại diện cho một quy trình trong container. Các cột thường bao gồm PID (Process ID), TTY (Terminal Type), TIME (Thời gian CPU), và CMD (Command - lệnh mà quy trình đang chạy). Thông tin này có thể giúp bạn theo dõi các hoạt động của quy trình bên trong container.

Hoặc

ps aux | grep <container_name>

Bạn chạy lệnh này thì bạn sẽ hiểu khi 1 container được tạo ra thì trên OS sẽ có thêm 1 tiến trình với name là tên của container của bạn mới tạo.

2 điều trên đã chứng minh rằng container là 1 prosess.

Kiểm tra runtime log của một Container

Để kiểm tra runtime log của một container Docker, bạn có thể sử dụng lệnh docker logs. Điều này giúp bạn xem các thông báo log từ container đó. Dưới đây là cách sử dụng lệnh này:

docker logs [container_id]​

Trong đó, [container_id] là ID của container bạn muốn xem log. Hoặc, nếu bạn muốn theo dõi logs liên tục khi container đang chạy, bạn có thể sử dụng tùy chọn -f:

docker logs -f [container_id]​

Ngoài ra, đôi khi log của ứng dụng trong container được ghi vào các tệp log trên hệ thống tệp của container. Bạn có thể truy cập các tệp này bằng cách sử dụng lệnh docker cp để sao chép chúng từ container vào hệ thống máy host.

Lưu ý rằng việc có thể xem được log từ container phụ thuộc vào cách ứng dụng trong container được cấu hình để ghi log. Một số ứng dụng có thể sử dụng stdout/stderr để ghi log, trong khi các ứng dụng khác có thể ghi log vào các tệp cụ thể trong container.

Container và Image khác gì nhau?

Container và image là hai khái niệm quan trọng trong Docker, một công nghệ ảo hóa dựa trên container.

  1. Image:
    • Image là một bản "snapshot" tĩnh của một hệ điều hành và ứng dụng cũng như các dependency cần thiết để chúng chạy.
    • Image được sử dụng để tạo ra các container, tức là các thực thể thực tế chạy các ứng dụng.
    • Một image có thể chứa mọi thứ từ mã nguồn ứng dụng, thư viện, file cấu hình, và hệ điều hành.

Ví dụ: Bạn có thể tải một image Ubuntu để chạy một container Ubuntu như sau:

docker pull ubuntu​
  1. Container:
    • Container là một phiên bản thực tế đang chạy dựa trên một image. Nó bao gồm cả hệ điều hành, ứng dụng, và môi trường thực thi để chúng có thể chạy.
    • Containers cung cấp một cách để đóng gói và triển khai ứng dụng một cách có độc lập và di động.
    • Mỗi container thì khác nhau, nhưng chúng có thể được tạo ra từ cùng một image.

Ví dụ: Bạn có thể tạo một container từ image Ubuntu đã tải bằng cách sử dụng lệnh:

docker run -it ubuntu​

Trong ví dụ này, lệnh docker run tạo ra một container từ image Ubuntu và mở một phiên terminal tương tác (-it). Container sẽ được tạo, chạy và sau khi bạn thoát khỏi terminal, container sẽ dừng lại (vì bạn không có ứng dụng nào đang chạy trong đó).

Những lần trước chúng ta đã được học về docker container ls hay docker ps rồi đúng không, để so sánh 1 cách tốt hơn mình đưa thêm 1 lệnh tương tự nhưng mà nó dùng để liệt kê tất cả các Docker images đang tồn tại trên máy host Docker.

Lệnh docker image ls (hoặc docker images) được sử dụng để liệt kê tất cả các Docker images đang tồn tại trên máy host Docker. Khi bạn chạy lệnh này, bạn sẽ thấy danh sách các images cùng với thông tin như REPOSITORY (tên image), TAG (thẻ), IMAGE ID (ID của image), CREATED (thời gian tạo), và SIZE (kích thước).

Dưới đây là một ví dụ về cách sử dụng lệnh này:

docker images​

Hoặc có thể sử dụng phiên bản tắn gọn là docker image ls:

docker image ls​

Kết quả có thể trông giống như sau:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              20.04               1234abcd5678        2 weeks ago         123MB
nginx               latest              abcd5678efgh        3 months ago        132MB​

Trong ví dụ này, bạn có hai images: một với tên là "ubuntu" và tag "20.04" và image khác với tên là "nginx" và tag "latest". Mỗi image có một ID duy nhất (IMAGE ID), thời gian tạo (CREATED), và kích thước (SIZE).

Ôn tập câu lệnh docker container run

Dưới đây là các bước của 1 docker container run các bạn cùng xem và ôn luyện lại nhé !

Bài tập 1 - Sử dụng container

Cách để giám sát một container

Giám sát container là một phần quan trọng của quản lý hạ tầng ứng dụng, đặc biệt là khi sử dụng các hệ thống dựa trên Docker hoặc các nền tảng container khác. Dưới đây là một số cách để giám sát một container:

  1. Docker Stats:

    • Sử dụng lệnh docker stats [container_id] để xem thông tin về tài nguyên sử dụng của container như CPU, bộ nhớ, I/O.
  2. Docker Logs:

    • Sử dụng lệnh docker logs [container_id] để xem logs của container. Điều này hữu ích để theo dõi các sự kiện và lỗi trong container.
  3. Container Health Checks:

    • Docker hỗ trợ kiểm tra sức khỏe container thông qua health checks. Bạn có thể định nghĩa một health check script và sử dụng lệnh docker inspect để xem trạng thái sức khỏe của container.
    • docker inspect là một lệnh trong Docker được sử dụng để trích xuất thông tin chi tiết về một hoặc nhiều đối tượng Docker, chẳng hạn như container, Image, mạng, hoặc thậm chí là một volume. Lệnh này trả về một đầu ra JSON chứa tất cả các thông tin chi tiết về đối tượng được yêu cầu.
    • docker inspect container_name_or_id
    • Kết quả sẽ là một đầu ra JSON chứa tất cả thông tin chi tiết về container đó, bao gồm cả cấu hình, mạng, thư mục, biến môi trường, và nhiều thông tin khác.
  4. Container Orchestration Tools:

    • Nếu bạn sử dụng các công cụ quản lý container như Kubernetes hoặc Docker Swarm, các công cụ này thường cung cấp giao diện giám sát tích hợp.
  5. Container Monitoring Tools:

    • Sử dụng các công cụ giám sát chuyên sâu như Prometheus, Grafana, cAdvisor để theo dõi và hiển thị thông tin chi tiết về container.
  6. Tracing và Profiling:

    • Sử dụng các công cụ như OpenTracing hoặc Jaeger để theo dõi các yêu cầu qua các thành phần của ứng dụng và xác định hiệu suất.
  7. Alerting:

    • Thiết lập cảnh báo để được thông báo khi container hoặc ứng dụng không hoạt động đúng cách. Các công cụ như Prometheus thường đi kèm với khả năng cảnh báo tích hợp.
  8. Security Scanning:

    • Sử dụng công cụ quét bảo mật container để kiểm tra container và các phần mềm bên trong container có lỗ hổng bảo mật hay không.
  9. Continuous Monitoring:

    • Kết hợp việc giám sát trong quá trình triển khai liên tục để đảm bảo rằng container đang hoạt động một cách đúng đắn trong môi trường sản xuất.

Tương tác với Shell của container như thế nào

Câu lệnh đầu tiền: là khi tạo ra 1 container và bạn muốn vào bash shell của container ngay lập tức.

Tùy chọn -it khi sử dụng lệnh docker run là để tạo một liên kết tương tác (interactive) với terminal của container. Cụ thể:

  • -i: Cho phép bạn tương tác với tiến trình của container bằng cách giữ mở stdin.
  • -t: Tạo một terminal (TTY) trong container.

Khi bạn kết hợp cả hai tùy chọn -i-t, bạn tạo ra một phiên tương tác với container, giúp bạn có thể nhập lệnh trực tiếp vào terminal của container và xem đầu ra từ các lệnh đó.

Ví dụ:

docker run -it ubuntu /bin/bash​

Trong ví dụ này, docker run được sử dụng để chạy một container từ Iamge Ubuntu và mở một phiên tương tác với terminal của container bằng cách sử dụng /bin/bash làm shell. Khi bạn nhập lệnh này, bạn sẽ thấy một shell của Ubuntu trong terminal của bạn, và bạn có thể thực hiện các lệnh trong container này như bạn đang thực hiện trên một máy tính Ubuntu thông thường.

Note thêm: Thường thì những Image là OS trắng như là (ubuntu hay centos...) thì khi tạo mới các container sẽ chạy bash là mặc định luôn nghĩa là sau khi vào container nó sẽ có bash luôn để chúng ta thực thi các cmd. Còn những container như (nginx, http, mysql...) thì cần phải thêm bash đằng sau nữa ví dụ

docker run -it nginx bash

Câu lệnh thứ 2:

Lệnh docker container exec được sử dụng để thực thi một lệnh bên trong một container Docker đang chạy. Tùy chọn -it có ý nghĩa tương tự như đã mô tả trước đó.

docker container exec -it container_name_or_id bash

Lệnh bash ở cuối thường được sử dụng để chỉ định rằng bạn muốn thực hiện một phiên làm việc Bash bên trong container.

Trong đó:

  • container_name_or_id: Tên hoặc ID của container mà bạn muốn thực thi lệnh bên trong.
  • bash: Shell mà bạn muốn sử dụng (trong trường hợp này là Bash).

Ví dụ: Nếu bạn muốn thực hiện lệnh Bash trong container có tên là "my_container", bạn có thể sử dụng lệnh sau:

docker container exec -it my_container bash

Sau khi thực hiện lệnh này, bạn sẽ nhập một phiên làm việc Bash bên trong container "my_container" và có thể thực hiện các lệnh Bash bình thường như bạn làm trên máy chủ.

Thoát kết nối terminal bên trong container 

Khi bạn đang thực hiện một kết nối vào terminal bên trong một container Docker và muốn thoát khỏi terminal mà không làm tắt container, bạn có thể sử dụng các phím tắt phổ biến. Phương pháp cụ thể có thể phụ thuộc vào loại terminal bạn đang sử dụng:

  1. Sử dụng Phím Tắt:

    • Phương pháp phổ biến nhất là sử dụng tổ hợp phím tắt Ctrl + P và sau đó Ctrl + Q. Nhấn Ctrl + P để giữ lại quyền kiểm soát của terminal và sau đó nhấn Ctrl + Q để thoát khỏi terminal mà không làm tắt container.
  2. Sử dụng Ctrl + D hoặc exit:

    • Bạn cũng có thể sử dụng Ctrl + D hoặc gõ lệnh exit để thoát khỏi terminal. Tuy nhiên, lưu ý rằng nếu bạn sử dụng exit, điều này có thể dẫn đến tắt container nếu không có các quy tắc khác được đặt ra.
  3. Kết hợp Tắt Container và Đang Chạy Nền:

    • Nếu container không chạy ở chế độ nền (detached), bạn có thể sử dụng Ctrl + C để dừng container và thoát khỏi terminal. Nếu container đang chạy ở chế độ nền, sử dụng docker attach để quay lại terminal của container.

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday