Phần 1: Docker là gì?

Phần 2: Ai sẽ dùng Docker?

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

Kiến trúc của Docker (Nguồn: docker.com)

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.

Các đối tượng quản lí của Docker Engine (Nguồn: Internet)

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.

Mối quan hệ của Docker Image, Container, Network, Volume (Nguồn: Luis Herrera Benítez)

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

Vòng đời của Container (Nguồn:Internet)

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à:

  1. Chuẩn bị các điều kiện môi trường để start application đúng cách.
  2. Start application.
  3. 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.

  1. 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)
  2. Copy file cấu hình bằng lệnh cp.
  3. 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.
  4. Chạy ứng dụng.
  5. Để ứ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

  1. Luis Herrera Benítez, Docker Captain and AWS Ambassador. Exploring Docker. https://medium.com/@lherrera/mapping-docker-d003aa9017c1
  2. Hệ sinh thái Docker. https://kipalog.com/posts/He-sinh-thai-Docker
  3. Nguyễn Sỹ Thanh Sơn. Docker - Hướng tiếp cận mới của xu thế DevOps, SFD 2016.
  4. Cuong Tran. Docker Image Template. https://github.com/cuongtransc/docker-image-tmpl