Docker cho người mới bắt đầu (P2)

Bài viết này giả sử bạn đã đọc Phần 1 trong loạt bài giới thiệu về Docker cho người mới bắt đầu của mình.

Các thành phần cơ bản của Docker

Image

Là file ảnh, file nền của một hệ điều hành, một nền tảng, một ngôn ngữ (vd: ubuntu image, ruby image, rails image, mysql image…)

Từ các image này, bạn sẽ dùng nó để tạo ra các container.

Các image là dạng file-chỉ-đọc (read only file).

Tự bạn cũng có thể tạo image cho riêng mình.

Một image có thể được tạo từ nhiều image khác (vd: bạn tạo 1 image chạy ubuntu, có cài sẵn ruby 2.3rails 5, image này của bạn được tạo nên bởi 3 image khác).

Container

Là một máy ảo, được cấu thành từ 1 image và được đắp thêm 1 lớp “trang trí” writable-file-layer. Các thay đổi trong máy ảo này (cài thêm phần mềm, tạo thêm file…) sẽ được lưu ở lớp trang trí này.

Các container này sẽ dùng chung tài nguyên của hệ thống (RAM, Disk, Network…), chính nhờ vậy, những container của bạn sẽ rất nhẹ, việc khởi động, kết nối, tương tác sẽ rất nhanh gọn.

Nếu ánh xạ sang hướng đối tượng, thì image chính là class, còn container chính là instance-1 thể hiện của class đó. Từ 1 class ta có thể tạo ra nhiều instance, tương tự, từ 1 image ta cũng có thể tạo ra được nhiều container hoàn toàn giống nhau.

Hỏi ngu: Thế tạo ra nhiều container giống hệt nhau để làm gì?

Để tận dụng tài nguyên máy, để xử lý song song, để cân bằng tải cho hệ thống, để…tao thích thế được không?

Docker engine

Chính là thằng quản lý. Nó quản lý việc bạn tạo image, chạy container, dùng image có sẵn hay tải image chưa có về, kết nối vào container, thêm, sửa, xóa imagecontainer, blah blah

Docker Hub

Là 1 trang chia sẻ các image, nó như kiểu github hay bitbucket vậy.

Get rock Docker (vietsub: ném đá Docker đê :v)

Cài đặt

Là thân lập trình viên, không có gì dễ hơn cài đặt phần mềm cả.
Tất cả hướng dẫn cài đặt đều có ở trang chủ cả rồi, hiện Docker hỗ trợ cả 3 nền tảng: Mac, Linux và Windowns. Mình không có điều kiện dùng Win nên trong bài viết này mình sẽ nói ở 2 nền tảng còn lại.

Link hướng dẫn cài đặt cho Linux

Link hướng dẫn cài đặt cho Mac

Link hướng dẫn cài đặt cho Win: tự tìm lấy đê :v

Docker nó hỗ trợ cho Mac tốt hơn. Với Mac, nó đóng gói tất cả các thứ cần thiết trong 1 lần cài đặt luôn: Docker engine, VM VirtualBox, Docker Machine, Docker Compose…

Còn Linux thì khổ hơn chút, phải tự tải và cài bằng dòng lệnh :3

Trong loạt bài viết này mình sử dụng Linux, lâu lâu có chú thích gì cho Mac mình sẽ nói cụ thể.

Còn nhiều nữa

Trong phạm vi bài viết này mình chỉ giới thiệu những thành phần cơ bản nhất để bạn có thể làm việc được với docker, những thành phần khác mình sẽ giới thiệu lần lượt trong các phần sau, hoặc bạn có thể vào docker docs để xem thêm.

Chào hỏi

Khi bạn học một ngôn ngữ mới, đoạn code đầu tiên bạn viết bao giờ cũng là Hello World, Docker cũng vậy, mở terminal lên và gõ:

Lệnh này bảo Docker Engine rằng: tạo và chạy một container từ image có tên là hello-world cho tao!

Docker Engine sẽ tìm trong máy bạn xem có image nào tên là hello-world chưa, nếu có rồi thì nó sẽ tạo và chạy container lên cho bạn. Nếu chưa có, nó sẽ lên Docker Hub và tải image đó về cho bạn.

Lưu ý: Mỗi lần chạy lệnh docker run là nó sẽ tạo mới 1 container.

Đào sâu hơn 1 tý về lệnh trên

Xem qua 1 chút về kết quả của lệnh trên:

  • Dòng 2: Unable to find image 'hello-world:latest' locally: không tìm thấy image nào có tên là hello-world:latest ở dưới máy bạn cả. Ở đây ta thấy thêm cụm từ latest, đây chính là tag của image, giống như là đánh phiên bản vậy thôi. Khi bạn run 1 container từ 1 image, nếu bạn không chỉ định chạy phiên bản nào của image, nó sẽ mặc định lấy bản mới nhất có tag là latest. Nếu muốn chạyubuntu container version 12.04 bạn chạy lệnh sau: $ docker run ubuntu:12.04.
  • Dòng 3->7: tải hello-world image về, đồng thời thông báo tiến trình.
  • Dòng 9-10: kết quả được in ra terminal sau khi chạy container lên.
  • Dòng 12 trở đi: đọc tự mà hiểu lấy 😀

Chi tiết hơn về image

Bạn chạy lệnh:

Lệnh trên sẽ liệt kê tất cả những image mà bạn đang có trong máy cùng các thông số của nó, các thông số hoàn toàn dễ hiểu nên mình không giải thích thêm nhé.

Tôi muốn tải thêm các image về thì làm thế nào?

Có 2 cách:
1. Bạn dùng lệnh run 1 container như lúc nãy làm á, Docker Engine sẽ tự tìm và tải về (nếu có)
2. Bạn lên Docker Hub, tìm một image bất kỳ sau đó chạy lệnh $ docker pull {author_name}/{image_name}, vd: docker pull binhcao/docker-whale. Thao tác này tương tự như tải một thư viện trên github về vậy á.

Chi tiết hơn về container

Bạn chạy lệnh:

Lệnh trên liệt kê ra tất cả những container ĐANG CHẠY. Muốn liệt kê cả những container đã dừng, bạn chạy lệnh: $ docker ps -a

Bạn để ý, cả imagecontainer đều có ID. Sau này sẽ dùng tới nhiều.

Chi tiết hơn về lệnh docker run

Tải Ubuntu:14.04 image về:

Ủa, sao thấy lệnh tải image về không có tên tác giả thế?

Ờ, ubuntu image là hàng offical, được chính tác giả của ubuntu tạo ra nên Docker Hub nó tự biết là lấy image từ repo nào. Còn nếu tự bạn tạo ra 1 image cũng tên là ubuntu, thì khi pull, bạn phải thêm tên tác giả vào thì mới lấy đúng image về được: $ docker pull binhcao/ubuntu

Tiếp đến, tạo một container và chạy nó lên:

Tada, không có gì xảy ra cả 😀

Sao lạ vậy hè, nó phải chạy 1 máy Ubuntu lên chứ hè?

Đúng rồi, nó có chạy lên đó, nhưng bạn không nói nó làm gì cả, nên chạy lên xong là nó tắt luôn.
Bạn liệt kê TẤT CẢ các container ra sẽ thấy nó:

Vậy làm sao để chạy nó lên và truy cập vào terminal của nó?

Bạn thêm tham số -i -t vào sau lệnh run:

  • -i là để truy cập vào terminal
  • -t là để show mấy cái kết quả của lệnh bạn chạy ra. (bạn cứ thử bỏ 1 trong 2 tham số đi sẽ thấy rõ tác dụng của nó :D)

-i -t có thể viết gọn lại là -it hoặc -ti

Chạy thử lệnh ls cơ bản nào:

Để thoát ra khỏi container mà giữ cho nó vẫn chạy

Bạn bấm 2 tổ hợp phím Ctrl + P sau đó Ctrl + Q.
Thao tác này gọi là detach.

Để vào lại container (attach), bạn chạy lệnh theo cú pháp: $docker attach {container_id}, container_id thì lấy trong lệnh $docker p á 🙂

Nhớ nhấn 2 lần Enter nghe.

Để thoát ra khỏi container và stop nó

Bạn chạy lệnh exit là xong:

Container đã stop rồi vẫn có thể chạy lại được

container_id này lấy trong lệnh $ docker ps -a á 🙂

Xóa bớt image, container

Vọc vạch 1 lúc thấy máy có hơi nhiều image với container rồi, gần đầy ổ cứng rồi 😀

Xóa 1 container

Ta chỉ xóa được container khi nó đã bị stop thôi.

Xóa từng cái mỏi tay quá 😛
Để xóa TẤT CẢ các container đã stop:

Xóa 1 image

Ta chỉ xóa được image khi KHÔNG CÒN container nào được tạo ra từ image đó nữa. (giống kiểu quan hệ ràng buộc trong cơ sở dữ liệu quan hệ ấy :P)

image_id lấy ở đâu thì biết rồi đúng hơm 😛

Ở bài viết này, ta đã làm quen được với Docker Engine và tương tác được với image, container.
Trong bài tiếp theo, mình sẽ đi sâu hơn về build 1 image cho riêng mình và chia sẻ nó qua Docker Hub, đồng thời liên kết các container với nhau, và blah blah blah thứ khác, mời các bạn đón đọc 😀

Lập trình và hơn thế nữa

Spread the love
  • 15
  •  
  •  
  •  
  •  
    15
    Shares

Leave a Reply

10 Comments on "Docker cho người mới bắt đầu (P2)"

Notify of
avatar
Sort by:   newest | oldest | most voted
Anonymous
Guest

Hóng p3 😀

Anonymous
Guest

Viết tốt lắm bạn 🙂

trackback

[…] nhìn đầu tiên về Docker và những lợi ích mà nó có thể đem lại cho chúng ta. Bài viết tiếp theo, mình sẽ giới thiệu về các thành phần của Docker và cách cài đặt cũng như […]

trackback

[…] viết giả sử bạn đã đọc phần 1 và phần 2 trong loạt bài viết của mình […]

TuanLV
Guest

Úp
Thanks bạn nhiều.

Thám
Guest

Mình bị lỗi này không biết vì sao?
$ winpty docker exec -it ubuntu:14.04 C:/Program Files/Git
Error response from daemon: No such container: ubuntu:14.04

trackback

[…] nhìn đầu tiên về Docker và những lợi ích mà nó có thể đem lại cho chúng ta. Bài viết tiếp theo, mình sẽ giới thiệu về các thành phần của Docker và cách cài đặt cũng như […]

Quang
Guest

hay quá bạn! Tks bạn nhiều lắm :))

Co Nhon
Guest

Get rock Docker (vietsub: ném đá Docker đê :v)

Cai nay khong phai nem da Docker dau nhe 😀