2.4 Thực hành quy trình Build-Ship-Run
2.4.1 Tạo Image
Bạn thực hiện đóng gói ứng dụng tại máy tính cá nhân (máy phát triển), để tạo Image. Công việc gồm: viết một tập tin Dockerfile (bản hướng dẫn). Khi chạy lệnh docker build, Docker Engine sẽ đọc bản hướng dẫn này để gom: hệ điều hành, thư viện và mã nguồn lại thành một tập tin duy nhất gọi là Image.
Chúng ta cùng thực hành đóng gói một ứng dụng web gồm các thành phần sau:
- Một thư mục dự án
- Trong thư mục dự án có một tập tin mã nguồn HTML, trang index.html, nội dung trang web hiển thị lời chào “Chào bác Tèo”
- Ứng dụng web chạy trên web server Nginx
Các bước thực hiện:
Bước 1. Chuẩn bị các thành phần
- Tạo thư mục dự án teo-docker-project
- Trong thư mục dự án, tạo tập tin index.html với nội dung: <h1>Chào bác Tèo</h1>
Bước 2. Viết tập tin Dockerfile
Một cách dễ hiểu, nếu Container là một cái bánh, thì Dockerfile là tờ giấy viết công thức làm bánh.
Trong Docker, Dockerfile là một tập tin văn bản (text), không có phần mở rộng (đuôi), chứa một tập hợp các câu lệnh (instructions) nối tiếp nhau. Docker sẽ đọc tập này, thực thi các lệnh, để đóng gói thành một Docker Image.
- Trong thư mục teo-docker-project, tạo tập tin Dockerfile (lưu ý: không có đuôi)
- Nhập nội dung sau cho tập tin Dockerfile
[Dockerfile]
# 1. Chọn hệ điều hành rút gọn có sẵn máy chủ web (Nginx)
FROM nginx:alpine
# 2. Chép mã nguồn (tập tin index.html) từ máy tính (máy của lập trình viên) vào đúng vị trí trong Image
COPY index.html /usr/share/nginx/html/index.html
Bước 3. Thực hiện lệnh “build” để tạo Image
Bây giờ, chúng ta sẽ ra lệnh cho Docker Engine đọc và thực thi từng lệnh trong Dockerfile để "gom" mọi thứ lại.
- Mở PowerShell/Command Prompt của hệ điều hành Windows
- Di chuyển vào thư mục dự án của bạn bằng lệnh cd:
cd đường/dẫn/đến/thư-mục/my-docker-project
- Chạy lệnh đóng gói:
docker build -t hello-docker-image:v1 .
Trong đó,
- docker build: lệnh của docker để tạo Image từ Dockerfile
- tham số -t (viết tắt của tag), được sử dụng để gán nhãn cho Image là hello-docker-image
- v1: là phiên bản của Image (v là viết tắt của version)
- . : dấu chấm ở cuối, đại diện cho thư mục hiện hành. Nó báo cho Docker rằng: "Hãy tìm Dockerfile và các tập tin liên quan ngay tại đây".
Bước 4: Kiểm tra thành quả trên Docker Desktop
Sau khi chạy lệnh docker build xong, và không có lỗi, Docker Engine sẽ tạo ra một Image, tên là hello-docker-image. Để kiểm tra:
- Mở ứng dụng Docker Desktop
- Nhấp vào mục Images ở cột bên trái
- Bạn sẽ thấy một bản ghi mới, tên là hello-docker-image với dung lượng rất nhỏ (khoảng vài chục MB)
Giải thích quá trình thực thi lệnh build:
Khi bạn chạy lệnh build, Docker đã thực hiện đúng như nội dung đã viết trong Dockerfile:
- Tải về hệ điều hành alpine có cài sẵn web server nginx
- Lấy tập tin index.html từ máy tính của bạn, đặt vào trong web server
- Tạo ra một tập tin duy nhất, tên là hello-docker-image: đây là một tập tin tĩnh, không thay đổi, chứa tất cả những gì cần thiết (hệ điều hành, web server và một trang index.html) để chạy trang web của bạn ở bất cứ đâu.
2.4.2 Chuyển giao Image sang máy tính khác (Ship)
Khi bạn đã tạo được Image và muốn chuyển nó tới máy tính khác (máy của đồng nghiệp hoặc máy server), có 2 cách làm:
- Gửi Image như một tập tin thông thường
- Dùng Docker Registry
Gửi Image như một tập tin thông thường:
Cách này phù hợp khi bạn muốn chép Image qua đĩa USB, hoặc gửi qua mạng nội bộ mà không muốn tải lên mạng, hoặc bạn không muốn sử dụng hệ thống Docker Registry.
Chúng ta sẽ xuất Image thành một tập tin:
- Sử dụng lệnh docker save
docker save -o hello-image.tar hello-docker-image:v1
Trong đó:
- docker save: lệnh của docker để xuất Image thành tập tin
- Tham số -o: viết tắt của output (xuất)
- hello-image.tar: tên của tập tin kết quả, nén theo kiểu tar
- hello-docker-image:v1: tên của Image sẽ được xuất thành tập tin
Nếu chạy lệnh docker save thành công, bạn sẽ thấy xuất hiện tập tin hello-image.tar tại thư mục teo-docker-project.
Bạn có thể chép tập tin hello-image.tar sang máy tính khác bằng đĩa USB, mạng nội bộ, Google Drive, Zalo,...v.v.
Nạp Image vào Docker tại máy nhận
Tại máy nhận, bạn mở chương trình cửa sổ dòng lệnh (CMD, chạy lệnh docker load:
docker load i hello-image.tar
Trong đó:
- docker load: lệnh của docker để nạp Image đang ở dạng tập tin nén
- i là viết tắt của input (nhập)
- hello-image.tar: tên của tập tin nén đang chứa Image
docker load -i hello-image.tar
Sau khi chạy thành công, bạn sẽ thấy Image xuất hiện trong cửa sổ của Docker Engine, giống như bạn vừa build nó
(Nếu bạn thực hành trên một máy tính, thì bạn phải xóa Image có tên là hello-docker-image trong Docker Engine, sau đó thực hiện docker load để thấy Image mới)
Dùng Docker Registry:
Đây là cách chuyên nghiệp, được sử dụng nhiều. Cách này giống như khi bạn đẩy mã nguồn lên Github.
Bạn sẽ đẩy Image lên một “kho” chung trên mạng, rồi các máy tính khác sẽ tải về.
Gắn thẻ (tag) cho Image:
Bạn nên hiểu là Image là một thùng hàng, trên thùng hàng này, bạn sẽ dán thêm các thẻ tùy ý, để dùng trong việc vận chuyển, lưu kho, …v.v.
Bạn sẽ gắn thêm thẻ mới cho Image, thẻ này chứa tên tài khoản và tên của Image, để khi đẩy lên mạng, hệ thống sẽ biết được đẩy Image này vào tài khoản của bạn. Cấu trúc của thẻ mới là: <tên_tài_khoản>/<tên_image>:<tag>
Ví dụ, sử dụng lệnh docker tag để gắn thêm thẻ:
docker tag hello-docker-image:v1 username/hello-docker-image:v1
Trong đó:
- docker tag: là tên lệnh
- hello-docker-image:v1: tên của Image sẽ được gắn thẻ
- username/hello-docker-image:v1: tên của thẻ gắn thêm, username là tên tài khoản trên Docker Hub
Đăng nhập vào Docker Hub:
(Bạn phải có tài khoản trên Docker Hub, nếu chưa có bạn phải tạo tài khoản để thực hành tiếp. Vào trang https://hub.docker.com/ để tạo tài khoản)
Tại cửa sổ dòng lệnh, nhập lệnh:
docker login
Nhập username và mật khẩu
Đẩy Image lên (Push):
docker push username/hello-docker-image:v1
Ví dụ:
D:\Demos\teo-docker-project>docker push conglg/hello-docker-image:v1
The push refers to repository [docker.io/conglg/hello-docker-image]
6b7b6c7061b7: Pushed
5e7756927bef: Pushed
399d0898a94e: Pushed
589002ba0eae: Pushed
5507cfe23e78: Pushed
1b2e1c54005d: Pushed
955a8478f9ac: Pushed
6d397a54a185: Pushed
bca5d04786e1: Pushed
3e2c181db1b0: Pushed
v1: digest: sha256:aea402027e6a468f3f623b497b83c714d64cbd07c22ec33939bbb6c431ff8e43 size
Tại máy tính khác:
Bạn chỉ cần chạy lệnh sau để lấy Image về máy:
docker pull username/hello-docker-image:v1