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.
Mục lục [ẩn]
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 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 image
và container
, blah blahDocker 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:
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ấyimage
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ủaimage
, giống như là đánh phiên bản vậy thôi. Khi bạnrun 1 container từ 1 image
, nếu bạn không chỉ định chạy phiên bản nào củaimage
, 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
2. Bạn lên Docker Hub, tìm một
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 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
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àoterminal
-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
Thao tác này gọi là
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
Để 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
Trong bài tiếp theo, mình sẽ đi sâu hơn về build 1
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