+641

Docker: Chưa biết gì đến biết dùng (Phần 1- Lịch sử)

1. Vì sao nên sử dụng

  • Vào một đêm đẹp trời trăng thanh gió mát,

    Bạn được phân bổ vào dự án mới và tất nhiên là hào khí ngút trời, thế như chẻ tre.

  • Hứng khởi vào đọc README.md một hồi, thấy dự án này sao mà cài cắm nhiều thứ thế.

    Nào là Node.js, React, Redis, PostgreSQL, Elasticsearch ... mỗi thứ lại kèm theo yêu cầu version cụ thể.

    Lẩm bẩm một hồi, giờ search google, cài cắm một tá thứ này thì hết bao lâu ta ?

Sếp ơi, em cần 1 buổi sáng để setup ạ 💪

  • Cài chưa xong đã thấy rối tùm lum, cái nọ xung đột cái kia chẳng hạn, lại còn ảnh hưởng tới những chương trình cũ đã cài đặt trong máy nữa chứ, thôi cài lại luôn cả hệ điều hành cho máy.

Sếp ơi, em cần thêm 1 buổi nữa để setup ạ 🫠🫠🫠

  • Thôi xong, mất thời gian, mệt mỏi với những thao tác phụ mà chưa tập trung được vào việc chính.

  • Đó chính là lúc bạn nên nghĩ tới Docker, mọi thứ sẽ đơn giản hơn nhiều.

Chỉ vài dòng lệnh thôi, cạch cạch cạch, bạn sẽ có thể nhanh chóng tạo được môi trường ảo hóa chứa đầy đủ những cài đặt cần thiết để dự án hoạt động.

  • Một ví dụ đơn giản vậy thôi nhưng không dừng lại ở đó, công dụng của Docker còn khá nhiều, chúng ta cùng tìm hiểu dần nhé !

2. Quá trình hình thành

Trước hết, cùng đọc lịch sử một chút đã:

2.1 Containerlization là gì ?

  1. Ngày lâu lâu rồi, mô hình thường được sử dụng là:

    • Máy chủ vật lý (physical server).
    • Hệ điều hành (operating system, viết tắt là OS).
    • Dự án / phần mềm / ứng dụng (application).

    Nôm na là tất cả các phần mềm đều được cài đặt chung hết vào một hệ điều hành và trên một máy tính.

    • Vấn đề gặp phải ở đây là lãng phí tài nguyên:
      • Một máy chỉ cài được một OS.
      • Cho dù có ổ cứng khủng, ram khủng thì cũng không tận dụng hết lợi thế.
  2. Sau đó ra đời công nghệ ảo hóa virtualization.

    • Có thể bạn đã nghe tới cái tên Virtualbox hay VMware rồi đúng không, đó đó chính nó đó.

    • Với công nghệ này, trên một máy chủ vật lý mình có thể cài đặt được nhiều OS, tận dụng tài nguyên đã tốt hơn.

    • Ví dụ:

      • Bạn đang cài đặt Ubuntu để lập trình, sau đó cài VirtualBox để có thể:
        • Cài thêm Windows - thi thoảng nhớ mùi còn vào làm trận game.
        • Ubuntu thuộc nhánh Debian nên cài thêm CenOS để trải nghiệm nhánh RedHat.
        • Đó, vầy là trên một máy tính, bạn đã cài nhiều hệ điều hành để phục vụ cho những mục đích khác nhau.
    • Nhưng lại nảy sinh vấn đề tiếp:

      • Về tài nguyên:

        • Khi bạn bật máy ảo trên VitualBox, bạn cần cấu hình để cung cấp cố định ngay từ đầu tài nguyên từ máy thật cho máy ảo.
        • Bật máy ảo lên rồi để đó không làm gì thì máy thật cũng không thể tái sử dụng tài nguyên đã cho đi.
        • Ví dụ: Khi tạo một máy ảo ram 2GB trên máy thật ram 6GB, lúc này máy thật sẽ chỉ còn tối đa 6 - 2 = 4 GB RAM , kể cả khi máy ảo không dùng hết 2GB ram được cấp, đó là một sự lãng phí.
      • Về thời gian: Việc khởi động, tắt máy ảo khá lâu, có thể lên tới hàng phút.

  3. Ở bước tiến hóa tiếp theo, người ta sinh ra công nghệ containerlization:

    • Với công nghệ này, trên một máy chủ vật lý, ta sẽ cài đặt được nhiều máy ảo (giống với công nghệ ảo hóa virtualization)

    • Nhưng tốt hơn ở chỗ là các máy con này (Guest OS) đều dùng chung kernel của máy mẹ (Host OS), điều này khác biệt với công nghệ ảo hoá truyền thống vốn chạy Guest OS độc lập với các kernel riêng.

    • Có thể bạn chưa biết thì kernel là phần lõi của một hệ điều hành, chịu trách nhiệm quản lý tài nguyên hệ thống như bộ nhớ, CPU, RAM và các thiết bị ngoại vi. Nó hoạt động như một cầu nối giữa phần cứng và phần mềm, điều phối giao tiếp giữa chương trình ứng dụng và phần cứng của máy tính.

      image.png

    • Có thể hiểu nôm na là khi nào cần tài nguyên thì lấy từ kho tổng, lấy dùng xong trả lại vào kho, rồi khi nào cần thì lại lấy, như vậy việc tận dụng tài nguyên đã tối ưu hơn, không phải chia từ kho tổng ra và cấp phát cố định từ đầu.

    • Điểm nổi bật nhất của containerlization là nó sử dụng container engine để tạo ra các container, và một kĩ sư của Google đã phát biểu rằng:

    • Một công ty hàng đầu về công nghệ đã áp dụng nó, chứng tỏ lợi ích, độ tin cậy của công nghệ này rồi ! Chúng ta cùng áp dụng nó nhé.

2.2 Container là gì ?

  • Trước hết, cần nói về Container Engine là một phần mềm sử dụng công nghệ containerlization để đóng gói phần mềm của chúng ta cùng với tất cả phụ thuộc của nó (như thư viện, mã nguồn, cấu hình ...) vào trong một môi trường riêng biệt gọi là container, nó sẽ quản lývận hành các container này để phần mềm của chúng ta có thể chạy ở trong đó.

  • Container sẽ chứa tất cả mọi thứ mà phần mềm đó cần để chạy, giữ cho cấu hình phần mềm luôn được nhất quán trên mọi môi trường, từ máy tính cá nhân cho đến máy chủ, VPS, Cloud ...

  • Hạn chế tình trạng các lập trình viên đang làm việc trong cùng một team và:

    • Hỏi: Sao máy anh chạy được mà máy chú thì không ?

    • Trả lời: Có thể do phiên bản MySQL, ở máy của em cài version x.x.x còn máy của a cài verion y.y.y

  • Hoặc:

    • Hỏi: Sao code ở local thì chạy mà trên production thì không ?
    • Trả lời: Thì lộn cái bàn 🫠🫠🫠

    image.png

  • Ngoài ra, các tiến trình (process) trong một container bị cô lập, tách biệt với các tiến trình của các container khác trong cùng hệ thống và cũng tách biệt luôn với môi trường Host OS bên ngoài.

  • Container sẽ không bị ảnh hưởng từ bên ngoài vào và cũng không gây ảnh hưởng ra ngoài nếu chúng ta không cho phép. Chúng ta chỉ cấu hình để mở một số cổng giao tiếp nhất định giữa các container với nhau và container với Host OS.

  • Ví dụ: Cấu hình container mysql mở cổng 3456 và cho phép container java app kết nối tới để lấy dữ liệu trong database.

Ưu điểm:

  • Tiện lợi: Rất hữu dụng để xây dựng, chuyển giao và chạy các phần mềm, làm mọi thứ dễ dàngnhanh chóng hơn.
    • Ví dụ: bạn có một phần mềm code bằng java, bạn sẽ không cần cài đặt JDK vào máy thật để chạy phần mềm đó, hoặc node js thì cũng không cần cài npm , python cũng không cần lên google đi search cách cài python.
    • Mà chỉ cần dùng container đã được setting tương ứng cho phần mềm đó,
    • Tải nó về, bật nó lên, cho phần mềm chạy bên trong môi trường container đó, vậy là được.
    • Khi không sài nữa thì tắt hoặc xóa bỏ container đó đi, không ảnh hưởng gì nhiều tới host OS của bạn.
  • Linh động: Dễ dàng triển khai hơn do sự phụ thuộc của ứng dụng vào tầng OS cũng như cơ sở hạ tầng được giảm thiểu.
  • Nhanh: Do chia sẻ host OS nên container có thể được tạo gần như một cách tức thì. Điều này khác với vagrant - tạo môi trường ảo ở level phần cứng nên khi khởi động mất nhiều thời gian hơn.
  • Nhẹ: Container cũng sử dụng chung các images nên cũng không tốn nhiều disks.
  • Đồng nhất: Khi nhiều người cùng phát triển trong một dự án sẽ không bị sự sai khác về mặt môi trường.
  • Đóng gói: Đóng gói tất cả cài đặt cần thiết của dự án, người mới tham gia vào dự án hoặc nhận bàn giao không cần thực hiện setup từng phần nhỏ, nhàm chán và mất thời gian.

Nhược điểm:

Xét về tính an toàn:

  • Do dùng chung OS nên nếu có lỗ hổng nào đấy ở kernel của host OS thì nó sẽ ảnh hưởng tới toàn bộ container có trong host OS đấy.
  • Ngoài ra hãy thử tưởng tượng với host OS là Linux, nếu trong trường hợp ai đấy hoặc một ứng dụng nào đấy có trong container chiếm được quyền superuser, điều gì sẽ xảy ra? Về lý thuyết thì tầng OS sẽ bị hack và ảnh hưởng trực tiếp tới máy host bị hack cũng như các container khác trong máy đó (hacker sử dụng quyền chiếm được để lấy dữ liệu từ máy host cũng như từ các container khác trong cùng máy host bị hack chẳng hạn).
  • Bạn có thể đọc thêm về Docker Security

Sự khác nhau giữa container và VM (virtual machine - máy ảo):

  • VM là một hệ điều hành thực thụ, riêng biệt, chứa nhân hệ điều hành (kernel) và các phần mềm

    -> Tách biệt hoàn toàn, tiêu thụ nhiều tài nguyên và thời gian.

  • Container được chia sẻ kernel, nó chỉ như một process, một tiến trình chạy trên máy host os.

    -> Nhẹ hơn, nhanh hơn do không có hệ điều hành riêng, do đó linh hoạt hơn. Mức độ cô lập thấp hơn so với VM nhưng vẫn đủ tốt để cô lập môi trường ứng dụng.

2.3 Docker ra đời

  • Công nghệ ảo hóa (virtualization) thì ta có thể dùng công cụ Virtualbox hay VMware thế còn đối với containerlization thì dùng gì đây ? Google họ dùng gì ?

  • Oh, mình không biết được, mỗi một ông lớn có một cách để áp dụng công nghệ này và họ private source code của họ. Như Google đã tham gia vào cuộc chơi này rất sớm với dự án nội bộ Borg, chính là tiền thân của Kubernetes.

    image.png

  • Gần đây, mà cũng lâu rồi 😙 Có một công ty tiến hành public source code của họ về công nghệ này, họ tung ra sản phẩm mang tên Docker và nhận được nhiều sự chú ý.

  • Sau đó công ty cũng đổi tên thành Docker luôn, sologan hiện tại là Develop faster, Run anywhere. Cũng có thể xem đây là hai giá trị lớn nhất mà sản phẩm này mang tới cho cộng đồng, thật ngắn gọn.

    image.png

    Chi tiết hơn sẽ gồm Build, Share, Run, Verify, Test.

    image.png

  • Công ty này cung cấp công cụ Docker free nhưng họ kiếm được rất nhiều tiền từ những dịch vụ khác đi kèm với nó.

    image.png

  • Hệ sinh thái nhà Docker cũng có nhiều cái hay ho.

    image.png

  • Với sự bùng nổ của việc sử dụng container cùng với những lợi ích lớn mà nó mang lại, gã khổng lồ phần mềm Microsoft không muốn bỏ qua cơ hội màu mỡ này với việc cho ra mắt tính năng mới có tên Windows Container.

    • Các bạn có thể tham khảo, áp dụng công cụ Windows Container của công ty Microsoft cho Windows tại đây.
    • Còn phạm vi bài viết này xin giới hạn lại áp dụng sản phẩm Docker của công ty Docker nhé các bạn !

Đó, dân ta phải biết sử Tây là thế đó, chứ cứ lao vào học Docker luôn rồi cũng chẳng biết nó sinh đẻ thế nào, từ đâu mà ra, có anh em họ hàng gì không ?

Nhân tiện đa tạ công ty Docker đã đóng góp một phần lớn công sức để công nghệ container hoá không còn là điều xa xỉ mà đã trở thành tiêu chuẩn, giúp cho hàng triệu nhà phát triển và tổ chức có thể dễ dàng tối ưu hoá quy trình làm việc.

3. Cài đặt ra sao ?

  • Docker hỗ trợ Linux, Windows và cả Mac.

    • Lưu ý là ban đầu nó được xây dựng trên nền tảng Linux. Vì Docker cần can thiệp vào phần lõi, phần nhân kernel của OS trong khi đó Linux là mã nguồn mở, gọi là cần gì có nấy.

    • Đến khi thấy Docker hay quá, bác Windows ngỏ lời, thế là công ty Docker và công ty Microsoft hợp tác với nhau nhưng nghe chừng chưa khả quan lắm bởi vì nhân Windows có nhưng thứ không public được (bản quyền mà, mình đoán thế 😅), Mac OS có lẽ cũng zị =))

    • Cho tới hiện tại khi cài Docker trên Windows hay Mac thì Docker sẽ cài một máy ảo Linux trên máy thật và Docker hoạt động dựa trên máy ảo Linux đó, còn tương lai về sau thì ai biết được.

    • Mà cũng do vậy, nên khi dùng Docker trên Mac hoặc Windows thì hiệu năng sẽ thấp hơn, không tận dụng được toàn bộ sức mạnh của host os.

    • Có lần mình hướng dẫn một bạn sinh viên mới tới công ty thực tập, setup dự án với Docker trên Linux thì chạy khá mượt.

      • Thời gian sau bạn cần cài sang Windows để làm luận án và máy cũng bị lỗi gì đó không cài song song Windows với Ubuntu được.
      • Thế là phải cài dự án với Docker trên Windows, build cái React rất lâu, trong lúc dev rất lag và khó làm.
      • Vốn dĩ cấu hình laptop của bạn ấy cũng không cao sẵn rồi, giờ còn phải share tài nguyên để chạy con máy ảo Linux nữa.

3.1 Mac OS

  • Với Mac OS, thì bạn nên cài đặt Docker Desktop, việc cài đặt cũng khá đơn giản.

    image.png

  • Docker Desktop là một ứng dụng có giao diện đồ hoạ (GUI), dành cho các dev muốn dễ dàng chạy Docker trên máy tính cá nhân với đầy đủ công cụ cần thiết trong một trình cài đặt duy nhất

    Docker Desktop = Docker Engine (Docker Daemon + Docker CLI) + Docker Extensions + Docker Scout + ...

    Vào Settings của Docker Desktop bạn sẽ cấu hình được tài nguyên tối đa của máy ảo Linux mà chúng ta có nhắc tới ở trên.

    image.png

  • Để kiểm tra xem cài đặt thành công chưa thì bạn chạy câu lệnh

    docker run hello-world
    

    Nếu xuất hiện dòng chữ Hello from Docker! như hình bên dưới tức là đã cài đặt thành công.

    image.png

3.2 Windows

  • Tương tự, bạn nên cài Docker Desktop for Windows

    Khác một chút là nếu muốn cấu hình lượng tài nguyên (CPU, RAM, Disk, Swap) tối đa mà Docker được sử dụng thì phải thông qua wslconfig file

    image.png

  • Ở khu vực hiển thị dưới cùng bên trái của Docker Desktop, bạn sẽ nhìn thấy lượng RAM, CPU và DiskDocker đang sử dụng bên trong máy ảo Linux.

3.3 Linux

  • Trên Linux, bạn có thể cài song song Docker DesktopDocker Enginedùng docker context để chọn dùng cái nào. Tuy nhiên, để tránh xung đột có thể xảy ra thì chỉ nên chọn một trong hai. Docker Desktop tích hợp nhiều công cụ đi kèm, Docker Engine phù hợp cho những người chỉ cần dùng Docker thuần tuý hoặc trên VPS, máy chủ ...

  • Với Linux OS, mặc dù trên Linux sẵn rồi nhưng Docker Desktop sẽ vẫn cài một máy ảo Linux và hoạt động trên đó để quản lý tài nguyên tốt hơn, đảm bảo tính nhất quán trên mọi nền tảng và tách biệt với môi trường Docker sẵn có trên máy trước đó nếu có ... Nên nếu muốn tận dụng hết tối đa sức mạnh Host OS thì khuyến khích cài Docker Engine nha các bạn.

  • Hướng dẫn cài đặt cho Docker EngineDocker Desktop thì trên trang docs cũng khá đầy đủ rồi.

  • Lưu ý là nếu bạn cài và sử dụng Docker Engine trực tiếp trên Linux với tài khoản người dùng thông thường mà không dùng sudo thì sẽ gặp lỗi Manage Docker as a non-root user

    • Thông báo lỗi như sau:

      Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock ...
      
    • Thì Docker có chia sẻ về lỗi này tại Linux post-installation steps for Docker Engine

      The Docker daemon binds to a Unix socket, not a TCP port. By default it's the root user that owns the Unix socket, and other users can only access it using sudo. The Docker daemon always runs as the root user.
      
    • Lý do là Docker Engine yêu cầu quyền root để tương tác với hệ thống, vì nó trực tiếp điều khiển các container và cần truy cập các tài nguyên như mạng và hệ thống file.

    • Cách xử lý thứ nhất là chạy câu lệnh với quyền sudo, để cấp quyền cho docker thao tác những việc trên.

      docker run hello-world            # Got permission denied while trying to connect to the Docker daemon socket at unix ...
      => sudo docker run hello-world    # Successfully !
      
    • Cách xử lý thứ hai là:

      If you don't want to preface the docker command with sudo, create a Unix group called docker and add users to it. When the Docker daemon starts, it creates a Unix socket accessible by members of the docker group. On some Linux distributions, the system automatically creates this group when installing Docker Engine using a package manager. In that case, there is no need for you to manually create the group.
      
      sudo usermod -aG docker $(whoami)               # Thêm user hiện tại vào group docker
      newgrp docker / reboot / logout and login back  # Chọn một trong ba cách: Chạy câu lệnh `newgrp docker` hoặc câu lệnh `reboot` hoặc logout ra rồi login lại để cập nhật sự thay đổi cho group.
      

4. Nhược điểm của Docker

Cũng không nên thần thánh hoá cái gì đó quá =))

  • Hiệu năng trên một số hệ điều hành chưa cao:

    • Khi sử dụng Docker trên MacOS hoặc Windows, Docker phải chạy trên một máy ảo Linux để đảm bảo tính tương thích với công nghệ container. Điều này dẫn tới không thể tận dụng tối đa tài nguyên phần cứng đặc biệt trên máy cấu hình thấp.
    • Ví dụ, khi build ứng dụng React app, thời gian xử lý trên Docker trên Windows, MacOS có thể chậm hơn nhiều so với khi dùng Docker Engine trực tiếp trên Linux.
  • Hạn chế về môi trường container hoá:

    • Docker chỉ hỗ trợ tạo container trên nền Linux (Ubuntu, CentOS, ...) Các ứng dụng yêu cầu môi trường Windows đặc thù sẽ không thể chạy trực tiếp trong contaner Docker.

    • Với VMware hoặc VirtualBox thì khi cài đặt máy ảo, bạn có thể chọn file cài đặt để tạo ra máy ảo Windows hoặc Linux tuỳ ý đúng không. Nhưng với Docker thì ta chỉ có thể tạo ra container Linux, do vậy, phần mềm của bạn sẽ chạy trong môi trường Linux.

  • Yêu cầu hiểu biết cơ bản về Linux:

    • Bạn cũng cần nắm được một số kiến thức cơ bản về OS này, các câu lệnh như:

      • ls -la: liệt kê danh sách file trong thư mục

      • mkdir: tạo thư mục mới ...

    • Để hiểu thêm về hệ điều hành này thì có thể đọc thêm Linux bắt nguồn từ đâu.

5. Hoạt động như thế nào ?

Để hiểu luồng hoạt động của Docker, ta có thể tham khảo sơ đồ:

image.png

Cơ bản nhất, Docker hoạt động qua 3 bước chính:

  • Build: Từ Dockerfile tạo ra docker image.
  • Run: Từ docker image tạo ra docker container
  • Vận hành: Sử dụng docker container để chạy ứng dụng ở bên trong.

Bạn còn nhớ bức ảnh này không, có BuildRun:

image.png

5.1 Dockerfile - Khởi đầu của mọi thứ

Dockerfile là một file văn bản chứa các hướng dẫn để Docker biết cách tạo ra docker image theo mong muốn của bạn. Ví dụ:

  • Sử dụng hệ điều hành nào (Ubuntu, CentOS)
  • Cài đặt các thư viện cần thiết gì (Node.js, Python, ...)
  • Sao chép mã nguồn, thiết lập cụ thể chạy ứng dụng như thế nào ...

5.2 Docker Image - Khuôn mẫu của container

  • Docker image là sản phẩm được tạo ra từ Dockerfile, là nền tảng bất biến để khởi chạy docker container.

  • Nếu nói với phong cách lập trình hướng đối tượng, thì docker imageclass, còn docker container là thực thể, instance, thể hiện của class đó.

  • Nếu so sánh với việc cài đặt Windows, thì docker image giống file .gho để ghost máy, cho phép xây dựng nhanh hệ điều hành với các cấu hình có sẵn.

  • Tuy vậy, docker image không phải là một file vật lý như file .png, .mp3 ... có thể copy vào USB, mà nó chỉ tồn tại trong Docker, được lưu trữ và chia sẻ qua Docker Hub

  • Cấu trúc của docker image gồm nhiều layers (tầng), mỗi tầng ứng với 1 thay đổi như cài thêm thư viện mới, chỉnh sửa file ... Các tầng này được tái sử dụng để giảm dung lượng và tăng tốc độ build.

5.3 Docker container - Môi trường chạy ứng dụng

  • Khi chạy docker image, bạn tạo ra một docker container, đây là môi trường thực tế để ứng dụng hoạt động.
  • Nếu docker image là bê tông cốt thép bên trong của ngôi nhà thì docker container là ngôi nhà hoàn chỉnh, đã được trát vữa, sơn, lắp thêm nội thất để sẵn sàng sử dụng.
  • Container là phiên bản động, có thể khởi động, dừng, xoá mà không ảnh hưởng gì đến docker image.
  • Như ngôi nhà có thể sơn lại màu sắc ở ngoài cùng còn bên trong cùng bê tông cốt thép thì cố định. Docker image là chuỗi các layers bất biến (no write) xếp chồng, xếp thêm layes (can write) lên trên cùng thì thành container hoạt động.

6. Các câu lệnh trong Docker

  • Chúng ta cần nắm được các câu lệnh để:

    • Một là từ Dockerfile tạo docker image

    • Hai là từ docker image dựng lên docker container

      Đó là hai việc cơ bản nhất khi làm với Docker.

      Bài cũng đã dài, chúng ta sẽ tìm hiểu phần tạo docker image từ Dockerfile ở phần 2, thay vào đó bây giờ chỉ đơn giản là pull image về từ Docker Hub về và sài nhé.

  • Các câu lệnh cho docker image:

    • Pull image:

      docker pull <image_name>
      

      Ví dụ:

      docker pull ubuntu:22.04
      
      • ubuntu là tên của image, 22.04 là tag (version), nếu dùng docker pull ubuntu thì tag mặc định là latest

      • Khi thực hiện câu lệnh trên, docker sẽ kiểm tra xem image này đã tồn tại trong máy hay chưa, nếu chưa thì từng layer của image sẽ được tải về từ kho lưu trữ Docker Hub. image.png

      • Bạn chạy câu lệnh trên thêm một lần, sẽ thấy không cần tải lại image về nữa.

      image.png

    • Liệt kê danh sách image:

      docker images
      

      image.png

      • Pull thêm một image mới nữa

        docker pull mysql
        

        rồi kiểm tra lại danh sách

        docker images
        

      image.png

    • Xoá image:

      docker rmi <image_name>
      

      Ví dụ:

      docker rmi mysql
      

      image.png

      • Bạn có thể dùng Docker Desktop để kiểm tra dưới dạng GUI:

      image.png

    • Xoá tất cả images

      docker rmi -f $(docker images -aq)
      

      image.png

  • Các câu lệnh cho Docker Container

    • Bật docker contaner từ docker image:

      docker run 
          -it           # Hẹn các bạn phần 2 sẽ tìm hiểu kỹ hơn nhé
          <image_name>  # Tên của image mà mình muốn dùng để bật container lên
          /bin/bash     # Tên của Linux shell mà bạn muốn sử dụng (sh, bash, szh ...), cái này cần chút kiến thức về Linux OS để hiểu
      
      • Ví dụ 1:

        docker pull ubuntu
        docker run -it ubuntu /bin/bash
        

        image.png

        Bây giờ bạn đã dựng thành công một môi trường ubuntu ảo rồi đó:

        Bên trong container, bạn có thể thực hiện các câu lệnh với một Linux system như ls, mkdir ...

        image.png

        Ngoài ra, có một câu lệnh khá hay:

        uname -a
        

        ChatGPT xem câu lệnh này dùng để làm gì nhé !

        image.png

        uname -a ở bên trong container và sau đó ấn Ctrl + C để thoát ra ngoài máy host os và gõ uname -a tiếp.

        Nếu bạn dùng Docker engine trực tiếp trên Linux thì sẽ thấy kết quả câu lệnh này ở bên trong container và ở ngoài host os giống nhau

        image.png

        Như trường hợp của mình:

        Container: Linux 8fd145beef6a 6.8.0-44-generic #44-Ubuntu SMP PREEMPT_DYNAMIC Tue Aug 13 13:35:26 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

        Host OS: Linux bamboo-Nitro-AN515-51 6.8.0-44-generic #44-Ubuntu SMP PREEMPT_DYNAMIC Tue Aug 13 13:35:26 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

        Do container được dùng chung kernel của host os luôn mà.

        Nếu bạn dùng Docker Desktop thì thông tin sẽ là của máy ảo Linux được tạo ra khi cài Docker Desktop mà chúng ta đã nhắc tới trước đó.

        image.png

        Do đó bạn sẽ thấy sự khác biệt giữa hai kết quả.

      • Ví dụ 2:

        docker pull mysql
        docker run -it mysql /bin/bash
        

        image.png

        Gõ tiếp:

        mysql --verison  # Kiểm tra mysql version
        

        kết quả là

        mysql  Ver 9.0.1 for Linux on aarch64 (MySQL Community Server - GPL)
        

        Đó, không cần cài mysql vào host os và vẫn có mysql để dùng rồi.

        Tương tự, không cần cài Node.js, Python hay Java thủ công từng bước một như xưa nhưng bạn sẽ vẫn có môi trường coding này để sử dụng.

    • Liệt kê container:

      docker ps                      # Danh sách containers đang chạy
      docker ps -a                   # Danh sách containers đang chạy và đã tắt
      docker start <container_name>                    # Khởi động một container 
      docker exec -it <container_name> /bin/bash       # Truy cập vào bên trong container đang chạy
      
    • Xoá container:

      docker rm -f {container_id/name}: Xóa một container
      

7. Updating ...

  • Phần 1 này chủ yếu giới thiệu về lý thuyết, để mình cùng nhau hiểu Docker là gì và bản chất của Docker đã.

  • Trong quá trình viết bài mình cần tìm hiểu thêm nhiều và cũng nhận ra nhiều điều mới. Nếu có ý kiến đóng góp gì, bạn vui lòng comment bên dưới nhé !

  • Trong phần 2 mình sẽ:

    • Cách tạo Dockerfile, đi sâu hơn vào docker image.
    • Giải thích chi tiết hơn các câu lệnh (-it nghĩa là gì, /bin/bash nghĩa là gì,..)
    • Cách tạo Docker Compose, cấu hình,... Mời các bạn đón đọc.

Tài liệu tham khảo:

  1. https://viblo.asia/u/thangtd90

  2. https://docs.docker.com

  3. https://www.google.com.vn

  4. http://blog.appconus.com/2016/04/15/docker-cho-nguoi-moi-bat-dau-p1

                      😊 😊 😊 Thank for your attention 😊 😊 😊 
    

########################################################

Mình đã viết Docker: Chưa biết gì đến biết dùng (Phần 2), mời các bạn đọc tiếp.


All rights reserved

Bình luận

Đang tải thêm bình luận...
Avatar
+641
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí