Phần 3: Làm việc với Docker thế nào?
Phần 4: Có thể dùng Docker trong các trường hợp nào?
3.1 Kiến trúc của Docker
Docker là có kiến trúc Client-Server, gồm:
- Docker Daemon: chạy ở trên host, đóng vai trò server, nhận các RESTful requests từ Docker Client và thực thi.
- Docker CLI: có vai trò là client, cung cấp giao diện tương tác với người dùng (command line) và gửi các RESTful requests tương ứng đến Docker Daemon.
- Docker Registry: private hay public registry, là nơi lưu trữ và chia sẻ các Docker Image.
Docker Daemon (còn gọi là Docker Engine) là một lightweight runtime giúp build, run và quản lí các containers và các thành phần liên quan.
Docker Engine quản lí 4 đối tượng chính. Tất cả các đối tượng đều có tên và ID.
- Image: là read-only template dùng để tạo containers. Được cấu tạo theo dạng layers, và tất cả các layers là read-only. Có thể tạo Docker Image bằng cách buid từ Dockerfile hoặc commit từ Docker Container.
- Container: là một runnable instance của một Docker Image. Khi chạy một container từ một Image, sẽ có một wriable layer được tạo ra và tất cả các thay đổi về dữ liệu sẽ diễn ra ở layer này. Lúc này, có thể sử dụng lệnh commit một container để tạo ra một image mới.
- Network: cung cấp private network (VLAN) để các container trên một host có thể liên lạc được với nhau, hoặc các container trên nhiều hosts có thể liên lạc được với nhau (multi-host networking).
- Volume: dùng để lưu trữ các dữ liệu độc lập với vòng đời của container và giúp cho các containers có thể chia sẻ dữ liệu với nhau và với host.
Sơ đồ minh họa các lệnh phổ biến của Docker Client và mối quan hệ của 4 đối tượng trên.
3.2 Một số câu lệnh cơ bản của Docker
Nhóm câu lệnh | Câu lệnh | Câu lệnh |
---|---|---|
Image | docker image pull <image_name> |
Pull một image từ Docker Hub |
docker image ls |
Liệt kê các images hiện có | |
docker image rm <image_name> |
Xóa một image | |
docker image build -t <image_name> . |
Build một image từ Dockerfile | |
docker image history <image_name> |
Xem lịch sử build của một image | |
Container | docker container run <image_name> |
Tạo một container |
docker container start <container_name> |
Start một container | |
docker container stop <container_name> |
Stop một container | |
docker container rm <container_name> |
Xóa một container | |
docker container ps |
Liệt kê các container đang chạy | |
docker container diff <container_name> |
Xem các thay đổi trên container |
3.3 Docker Container
Docker Container có đặc điểm là chóng tàn (emphemeral), nghĩa có thể khởi tạo nhanh và cũng có thể xóa nhanh. Không nên lưu dữ liệu trong container. Nếu cần lưu thì nên sử dụng Volume.
Docker Container sử dụng cơ chế process-based. Người dùng có thể tạo Docker Container bằng:
docker run <image_name> <command>
docker run <image_name>
Khi thực hiện một trong hai cách trên, một Docker Container sẽ được tạo và thực thi câu lệnh truyền vào hoặc câu lệnh mặc định đã được định nghĩa trong Docker Image. Câu lệnh này sẽ sinh process có pid = 1
.
Nếu process này kết thúc thì Docker Container kết thúc. Khi đó, tất cả các process con của pid = 1
sẽ bị kill.
Vấn đề được đặt ra: Làm sao để start, stop application trong container đúng cách?
3.3 Docker Image
Để có thể chạy ứng dụng với Docker, bước đầu tiên cần làm là đóng gói ứng dụng vào Docker Image.
Ở đây, có một số điểm cần lưu ý, ví dụ như cần đóng gói ứng dụng như thế nào để ứng dụng có thể start, stop đúng cách.
Sử dụng entrypoint để quản lí việc start, stop application:
Một kịch bản được sử dụng khi build Docker Image là: sử dụng entrypoint
để thực hiện các thao tác để chuẩn bị các điều kiện, start, stop application đúng cách.
Cụ thể, nhiệm vụ của entrypoint là:
- Chuẩn bị các điều kiện môi trường để start application đúng cách.
- Start application.
- Thực hiện các thao tác để stop application đúng cách.
Sử dụng shell để làm entrypoint
: nhận và xử lí các command được truyền vào khi chạy Docker Container.
- Sử dụng
python jinja2
để sinh ra các file cấu hình từ template.File cấu hình = jinja2(file cấu hình, tham số truyền vào bằng biến ENV)
- Copy file cấu hình bằng lệnh
cp
. - Thực hiện các lệnh để khởi tạo ứng dụng,
chown
quyền các file cần thiết. Đảm bảo ứng dụng có thể start được. - Chạy ứng dụng.
- Để ứng dụng
handle SIGTERM
hoặc sử dụng shell script để handle SIGTERM. Đảm bảo tắt ứng dụng đúng cách.
(Còn tiếp ...)
Tài liệu tham khảo
- Luis Herrera Benítez, Docker Captain and AWS Ambassador. Exploring Docker. https://medium.com/@lherrera/mapping-docker-d003aa9017c1
- Hệ sinh thái Docker. https://kipalog.com/posts/He-sinh-thai-Docker
- Nguyễn Sỹ Thanh Sơn. Docker - Hướng tiếp cận mới của xu thế DevOps, SFD 2016.
- Cuong Tran. Docker Image Template. https://github.com/cuongtransc/docker-image-tmpl