Thứ Sáu, 25 tháng 8, 2017

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.3 và rails 5image 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 image và container, 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 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ả image và container đề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 Hubnó 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 imagecontainer.
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 😀