4.Docker container ứng dụng kiến trúc microservice - phần Giới thiệu Bài viết docker container ứng dụng kiến trúc microservice, đề cập tới nội dung sau: Docker container gì? Sự khác biệt container máy ảo Container ứng dụng kiến trúc microservice Thao tác với docker container Xây dựng chạy ứng dụng docker container Cách viết Dockerfile tạo docker image Cách tạo docker image tối ưu Ở phần viết đề cập tới nội dung 1, 2, Trong viết tìm hiểu nội dung lại Xây dựng ứng dụng python Các ứng dụng lộ trình học python cho kỹ sư backend viết dựa ý tưởng cơng ty khởi nghiệp House3D Các bạn xem lại Tổng quan lộ trình học python cho kỹ sư backend để có nhìn tổng quan lộ trình Trong viết tơi xây dựng ứng dụng đơn giản, thực việc chuyển đổi ảnh màu sang ảnh đen trắng Trong trình chuyển đổi màu ảnh, ảnh gốc chia thành ảnh nhỏ trước chuyển đổi màu ghép lại thành ảnh đen trắng lớn Ứng dụng ứng dụng sở mở rộng dần viết sau, mục đích để mô nhiệm vụ phân tải hệ thống House3D Ứng dụng bao gồm bước sau: B1 Cắt ảnh gốc thành ảnh nhỏ B2 Chuyển màu ảnh B2 Ghép ảnh nhỏ chuyển màu thành ảnh lớn Mỗi bước thực hàm tương ứng Từ bước tới bước ứng dụng có hàm tương ứng image_cut, convert_to_grayscale, image_merge Ngồi hàm cịn có hàm show_img, hàm có nhiệm vụ hiển thị ảnh, giúp ta kiểm tra bước thực có mong muốn hay không Hàm show_img Đầu vào hàm ảnh dạng ma trận biến chứa tên khung ảnh, mặc định tên biến "TEST".Đầu cửa sổ hiển thị ảnh đầu vào kèm theo tên cửa sổ gắn đỉnh khung Mã nguồn hàm show_img: def show_img(img, winname="TEST"): from matplotlib import pyplot pyplot.figure() pyplot.imshow(img, cmap='gray') pyplot.title(winname) pyplot.show() Khi chương trình gọi đến hàm show_img, chương trình dừng chạy khung ảnh lên, đóng khung ảnh đó, chương trình chạy tiếp đoạn mã Hình Khung hiển thị ảnh hàm show_img Chú ý: Ảnh chuyển sang dạng ma trận cách sử dụng thư viện opencv Để sử dụng thư viện opencv cho python, trước tiên cần phải cài thư viện cách sử dụng lệnh pip3 install opencv-python Ở ta dùng pip3 để cài gói cho python3, pip3 python3 cài dùng lếnh sau (ubuntu): sudo apt-get install python3 python3-pip Hướng dẫn cài đặt chi tiết trình bày github repo viết Sau cài đặt thư viện opencv, chương trình python sử dụng thư viện câu lệnh import cv2, Để chuyển ảnh từ định dạng png jpg tif sang dạng ma trận sử dụng hàm imread thư viện opencv Hàm nhận đầu vào đường dẫn tương đối tuyệt đối tới ảnh, đầu ảnh dạng ma trận Ví dụ: import cv2 img = cv2.imread("images/input_sample.jpg") Hàm image_cut image_cut(img, num=10): Hàm nhận tham số đầu vào ảnh dạng ma trận số đại diện cho số lượng ảnh nhỏ cắt từ ảnh đầu vào đó, số có giá trị mặc định 10 Đầu hàm danh sách ảnh nhỏ chuyển màu Trên thực tế hàm image_cut thực hai công việc cắt ảnh lớn thành ảnh nhỏ chuyển màu ảnh nhỏ Ở bước chuyển màu ảnh, hàm image_cut gọi tới hàm convert_to_grayscale() để chuyển màu cho ảnh, việc chuyển màu thực thực hàm convert_to_grayscale() def image_cut(img, num=10): print("Hien thi anh goc") show_img(img, "Anh dau vao") small_imgs_dic = list() high = img.shape[0] smal_high = high // num for i in range(num): if i < num - 1: simage = img[i * smal_high:(i + 1) * smal_high:, :, :] small_imgs_dic.append(convert_to_grayscale(simage)) else: simage = img[i * smal_high:, :, ] small_imgs_dic.append(convert_to_grayscale(simage)) print("Hien thi anh da duoc cat va chuyen mau {}".format(i+1)) show_img(small_imgs_dic[i], "Anh nho {}".format(i+1)) return small_imgs_dic Trong hàm có sử dụng số kiến thức liên quan tới xử lý ảnh thư viện opencv, phức tạp với bạn chưa làm quen với xử lý ảnh Nếu bạn chưa hiểu rõ đoạn code xử lý ảnh, bạn tạm thời bỏ qua nó, cần hiểu chức hàm cách sử dụng đủ Hàm convert_to_grayscale Hàm thực việc chuyển đổi ảnh màu sang ảnh grayscale (có thể coi grayscale dạng ảnh đen trắng, thực tế ảnh grayscale khác ảnh đen trắng có nhiều mức xám hơn, phạm vi lộ trình coi chúng một) Hàm nhận đầu vào ảnh màu dạng ma trận, đầu hàm ma trận ảnh đen trắng def convert_to_grayscale(image): converted_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return converted_img Hàm image_merge Hàm có nhiệm vụ ghép ảnh nhỏ thành ảnh lớn theo thứ tự Đầu vào hàm danh sách ma trận ảnh, đầu hàm ma trận ảnh lớn ghép lại từ ảnh nhỏ def image_merge(images): return np.concatenate(images, axis=0) Mã nguồn hoàn chỉnh ứng dụng sau import cv2 import numpy as np def show_img(img, winname="TEST"): from matplotlib import pyplot pyplot.figure() pyplot.imshow(img, cmap='gray') pyplot.title(winname) pyplot.show() def image_cut(img, num=10): print("Hien thi anh goc") show_img(img, "Anh dau vao") small_imgs_dic = list() high = img.shape[0] smal_high = high // num for i in range(num): if i < num - 1: simage = img[i * smal_high:(i + 1) * smal_high:, :, :] small_imgs_dic.append(convert_to_grayscale(simage)) else: simage = img[i * smal_high:, :, ] small_imgs_dic.append(convert_to_grayscale(simage)) print("Hien thi anh da duoc cat va chuyen mau {}".format(i+1)) show_img(small_imgs_dic[i], "Anh nho {}".format(i+1)) return small_imgs_dic def convert_to_grayscale(image): converted_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return converted_img def image_merge(images): return np.concatenate(images, axis=0) if name == ' main ': img = cv2.imread("images/input_sample.jpg") print('Cut anh goc anh nho hon') cut_image = image_cut(img, num=3) print('Ghep lai cac anh nho da duoc cat va chuyen mau') merged_img = image_merge(cut_image) print("Hien thi anh sau da chuyen mau") show_img(merged_img, "Anh sau da duoc xu ly") print("Luu anh da chuyen doi vao cung thu muc voi anh goc") cv2.imwrite("images/output_sample.jpg", merged_img) print("Hoan viec chuyen mau cho anh") Tất mã nguồn ứng dụng đặt github đường dẫn sau: https://github.com/vimentor-com/pythonbackenddemo Các bạn dùng git để clone ứng dụng máy lệnh: git clone https://github.com/vimentor-com/pythonbackenddemo Github repo ứng dụng public nên tải máy chạy Hướng dẫn chạy ứng dụng mô tả chi tiết file README.md Hãy clone ứng dụng thử chạy để hiểu hoạt động chương trình Nếu có lỗi xảy trình chạy ứng dụng, bình luận viết, tơi hỗ trợ trường hợp bạn gặp khó khăn chạy chương trình Có ý chạy ứng dụng này, có cửa sổ hiển thị ảnh mở lên, chương trình tạm thời bị dừng lại bạn tắt cửa sổ Chạy ứng dụng bên docker container Trong phần viết này, giới thiệu docker lệnh để thao tác với docker container Trong phần thực hành việc tạo docker container chạy ứng dụng docker container Nếu bạn chưa quen với docker chưa đọc qua phần viết này, bạn nên dành thời gian để đọc trước tiếp tục phần Các bước tạo docker container chạy ứng dụng bao gồm: Bước 1: Khởi chạy ubuntu docker container Trong bước nên đặt tên cho docker container cho dễ nhớ dễ thao tác sau, khơng đặt tên cho docker container docker sinh tên ngẫu nhiên cho container đó, nhiên tên ngẫu nhiên không dễ nhớ ý nghĩa tên mà chủ động đặt Do docker container cô lập tất bên với mơi trường máy thật bên nên liệu sinh bên container truy cập vào container nhìn thấy Mà bên docker container môi trường không đồ họa nên khó để kiểm tra xem đầu chương trình (các file ảnh) có mong muốn hay khơng Có cách để xem file ảnh chép file máy thật, docker đưa cách tiện lợi để mount thư mục máy thật vào docker container cách sử dụng tùy chọn "-v :" Khi dùng tùy chọn này, bên docker container xuất thư mục có đường dẫn , liệu xuất thư mục tìm thấy đường dẫn ngồi máy thật Trong ví dụ tơi tạo file check_existence.txt thư mục máy thật Sau container khởi chạy, vào thư mục để kiểm tra tồn file check_existence.txt Nếu file tồn việc mount thư mục thành công HOME=~ mkdir -p $HOME/Desktop/demo_output touch $HOME/Desktop/demo_output/check_existence.txt sudo docker run -it name='pythonbackenddemo' -v $HOME/Desktop/demo_output:/root/demo_output ubuntu:18.04 bash Hình Khởi chạy ubuntu docker container Sau chạy lệnh này, docker tìm ubuntu docker image máy local bạn, khơng tìm thấy kéo image từ dockerhub tạo docker container có tên pythonbackenddemo Bước 2: Cài gói phụ trợ thiết lập mơi trường Trước cài gói phụ trợ, cần cài đặt timezone, gói phụ trợ chương trình yêu cầu làm điều ln -s /usr/share/zoneinfo/Etc/GMT+7 /etc/localtime Dùng lệnh sau để cài gói phụ trợ cần thiết cho việc chạy ứng dụng apt update && apt install -y git python3 python3-pip libsm6 libxext6 libfontconfig1 libxrender1 python3-tk Bước 3: Clone chạy ứng dụng git clone https://github.com/vimentor-com/pythonbackenddemo.git cd pythonbackenddemo/ pip3 install -r requirements.txt Ở docker container, môi trường mặc định không đồ họa non-GUI nên hàm show_img không hoạt động báo lỗi Để tránh lỗi, cần thiết lập hàm show_img bỏ qua việc hiển thị hình ảnh mkdir -p ~/.config/matplotlib/ touch ~/.config/matplotlib/matplotlibrc echo "backend: Agg" > ~/.config/matplotlib/matplotlibrc Chạy chương trình: python3 house3d_worker_demo.py Hình Clone chạy ứng dụng pythonbackenddemo Do thiết lập để bỏ qua hoạt động hàm show_img mơi trường khơng có đồ họa, nên chương trình chạy mạch mà không bị dừng lại hàm show_img Sau chạy chương trình, thư mục images xuất thêm file ảnh output_sample.jpg Đó ảnh chuyển đổi màu từ ảnh đầu vào input_sample.jpg Ở bước Tôi mount thư mục máy thật vào docker container, ta kiểm tra file ảnh đầu cách chép file vào thư mục /root/demo_output máy thật, truy cập vào thư mục $HOME/Desktop/demo_output để xem file ảnh đầu Nếu muốn khỏi docker container bạn dùng tổ hợp phím ctrl+p,ctrl+q, tổ hợp phím giúp bạn khỏi docker container đưa container dạng chạy ngầm Hoặc dùng lệnh exit từ bên để thoát khỏi dừng docker container Cách viết Dockerfile tạo docker image Dockerfile file văn chứa lệnh giúp docker tự động tạo docker image theo ý người dùng Khi phát triển xong ứng dụng, lập trình viên đóng gói ứng dụng docker container muốn chuyển docker container tới tay khách hàng, họ làm theo hai cách Cách 1: Viết Dockerfile chứa tất câu lệnh để thiết lập môi trường, cài đặt gói phụ trợ, clone mã nguồn chuyển cho khách hàng, sau nhận Dockerfile, khách hàng dùng lệnh docker build để build docker image từ Dockerfile nhận Ưu điểm: Dockerfile thường có kích thước nhỏ, dễ để chuyển từ nơi qua nơi khác Nội dung Dockerfile tường minh, giúp lập trình viên khách hàng họ kiểm sốt thành phần chứa docker image Nhược điểm: Việc build docker image từ Dockerfile gặp lỗi bị lỗi mạng, repo chứa gói phần mềm, mã nguồn bị thay đổi Cách 2: Build sẵn docker image chứa đầy đủ thành phần mà khách hàng cần chuyển cho họ Ưu điểm: Đảm bảo docker container chạy được, docker image kiểm tra kỹ kiểm thử Không sợ bị thiếu thành phần nào, tất đóng gói vào docker image Nhược điểm: Kích thước docker image thường lớn, khó maintain kiểm tra thành phần bên Trong project thực tế, thường maintain Dockerfile docker image Dockerfile lưu trữ github với mã nguồn, Sau build docker image từ Dockerfile đẩy docker image lên dockerhub để lưu trữ Việc đảm bảo đồng Dockerfile docker image Giúp người phát triển kiểm sốt thành phần docker image, tránh việc cài đặt thiếu gói trùng lặp gói phần mềm, việc thiết lập mơi trường sau xung đột với thiết lập trước Dockerfile cho ứng dụng xây dựng phần sau: FROM ubuntu:18.04 RUN ln -s /usr/share/zoneinfo/Etc/GMT+7 /etc/localtime RUN apt update \ && apt install -y git python3 \ python3-pip \ libsm6 \ libxext6 \ libfontconfig1 \ libxrender1 \ python3-tk RUN git clone https://github.com/vimentor-com/pythonbackenddemo.git RUN cd pythonbackenddemo && \ pip3 install -r requirements.txt RUN mkdir -p ~/.config/matplotlib/ RUN touch ~/.config/matplotlib/matplotlibrc RUN echo "backend: Agg" > ~/.config/matplotlib/matplotlibrc Cú pháp Dockerfile dễ hiểu tường minh Tơi có viết cú pháp Dockerfile sau, nhiên bạn tìm hiểu trước thông qua tài liệu trang chủ docker: Dockerfile reference Để build docker image từ Dockerfile, bạn cần lưu tất nội dung khung vào file có tên Dockerfile dùng lệnh sudo docker build -t demoimg:v0.1 Khi docker tìm thư mục xem có file tên Dockerfile khơng, thấy đọc lệnh từ Dockerfile này, thực việc build image gắn tên cho image demoimg:v0.1 (v0.1 tag version docker image) Khi build thành công bạn thấy xuất dòng log sau: Successfully built a49e524f78b6 Successfully tagged demoimg:v0.1 Như hoàn thành việc build image từ Dockerfile Lúc khởi chạy docker container từ image chạy ứng dụng mà không cần thực bước thiết lập mơi trường, cài đặt gói phụ trợ clone mã nguồn, tất bước lưu docker image (xem Hình 4) sudo docker run -it name='pythonbackenddemo1' -v $HOME/Desktop/demo_output:/root/demo_output demoimg:v0.1 bash Hình Chạy docker container từ image kiểm tra hoạt động Cách tạo docker image tối ưu Trong hệ thống Microservice triển khai tự động, docker image lưu trữ docker hub (dockerhub.com, quay.io ) thêm phiên (version) Trong trình phát triển phần mềm, mã nguồn cập nhật liên tục, kèm theo docker image liên tục cập nhật Nếu docker image lớn làm cho việc triển khai trở lên khó khăn lưu lượng truyền tải mạng lớn hơn, cần nhiều thời gian để hoàn thành gây tốn dung lượng ổ đĩa để lưu trữ, qua tăng chi phí hệ thống Việc tối ưu docker image việc cần thiết Chúng ta cần kiểm tra xóa bỏ tồn gói phần mềm, liệu không cần thiết khỏi docker image, dùng base image có kích thước nhỏ alpine image Khi xóa bỏ gói phần mềm phụ trợ, cần chạy lại chương trình để đảm bảo khơng xóa nhầm gói phụ trợ cần thiết Kết luận Sử dụng microservice container trở thành xu cơng nghệ mới, chúng thích hợp cho việc xây dựng hệ thống website lớn có khả mở rộng cao dễ dàng quản lý Đóng gói ứng dụng vào container không phục vụ cho việc triển khai hệ thống microservice mà giải vấn đề khác biệt môi trường, xung đột thư viện, làm cho phần mềm chạy ổn định nơi, máy khác Công nghệ container công nghệ đột phá giúp tăng suất phát triển phần mềm, ứng dụng vào hệ thống microservice cịn làm cho hệ thống trở lên đáng tin cậy thông qua việc kết hợp với công cụ quản lý hạ tầng, tự động tích hợp, tự động triển khai (CI-CD) Bài viết bao gồm kiến thức docker cách chạy ứng dụng bên docker container Nội dung viết mở rộng, giống trình mở rộng phần mềm từ mơ hình ngun khối tới mơ hình microservice Mã nguồn viết tồn lộ trình maintain project thực tế github: https://github.com/vimentor-com/pythonbackenddemo Trong trình chạy phần mềm xảy lỗi bạn bình luận viết tham gia group Python Backend Learning Path để nhận nhiều hỗ trợ Tham khảo [1] https://www.linode.com/docs/applications/containers/deploying-microservices-with-docker/ [2] https://www.docker.com/solutions/microservices [3] https://rubygarage.org/blog/advantages-of-using-docker-for-microservices ... https://www.linode.com/docs/applications/containers/deploying-microservices-with-docker/ [2] https://www.docker.com/solutions/microservices [3] https://rubygarage.org/blog/advantages-of-using-docker-for-microservices ... sổ Chạy ứng dụng bên docker container Trong phần viết này, giới thiệu docker lệnh để thao tác với docker container Trong phần thực hành việc tạo docker container chạy ứng dụng docker container. .. docker chưa đọc qua phần viết này, bạn nên dành thời gian để đọc trước tiếp tục phần Các bước tạo docker container chạy ứng dụng bao gồm: Bước 1: Khởi chạy ubuntu docker container Trong bước nên đặt