Docker chạy trăn

Ở phần 1 của bài viết này, tôi đã đề cập đến các nội dung 1, 2, 3 và 4. Trong bài viết này chúng ta sẽ cùng đi tìm hiểu những nội dung còn lại

Xây dựng ứng dụng python cơ bản

Các ứng dụng trong lộ trình học python cho kỹ sư phụ trợ được viết dựa trên ý tưởng của một công ty khởi nghiệp House3D. Các bạn có thể xem lại bài Tổng quan lộ trình học python cho kỹ sư backend để có cái nhìn tổng quan hơn về lộ trình

Trong bài viết này, tôi xây dựng một ứng dụng đơn giản, thực hiện việc chuyển đổi ảnh màu sang ảnh đen trắng. Trong quá trình chuyển đổi màu ảnh, ảnh gốc được chia thành ảnh nhỏ trước khi được chuyển đổi màu và ghép lại thành ảnh đen trắng lớn. Ứng dụng này sẽ là ứng dụng cơ sở và sẽ được mở rộng dần dần trong các bài viết sau, mục đích là để mô phỏng nhiệm vụ phân tải trong hệ thống của House3D

Ứng dụng bao gồm các bước sau

B1. Cắt ảnh gốc  thành các ảnh nhỏ

B2. Chuyển màu ảnh

B2. Ghép các ảnh nhỏ đã được chuyển màu thành ảnh lớn

Từng bước như trên sẽ được thực hiện trong một hàm tương ứng. Từ bước 1 tới bước 3 ứng dụng sẽ có các hàm tương ứng là image_cut, convert_to_grayscale và image_merge. Ngoài 3 hàm chính trên còn có một hàm show_img, hàm này có nhiệm vụ hiển thị ảnh, giúp ta có thể kiểm tra các bước thực hiện có đúng như mong muốn hay không

Hàm show_img

Đầu vào của hàm này là một ảnh dưới dạng ma trận và một biến chứa tên của các khung ảnh, mặc định tên của biến này là "KIỂM TRA". Đầu ra là một cửa sổ hiển thị hình ảnh đầu tiên kèm theo tên của cửa sổ này được gắn ở các đỉ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 sẽ dừng chạy khi một khung ảnh hiện lên, khi đóng khung ảnh đó, chương trình sẽ chạy tiếp các đoạn mã tiếp theo

Hình 1. Khung hiển thị ảnh của hàm show_img

Chú thích. Ảnh có thể được chuyển sang định dạng ma trận bằng 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 đặt thư viện này bằng cách sử dụng lệnh

pip3 install opencv-python

Ở đây ta dùng pip3 để cài đặt các gói cho python3, pip3 và python3 được cài đặt bằng lếnh sau [ubuntu]

sudo apt-get install python3 python3-pip 

Hướng dẫn cài đặt chi tiết cũng được trình bày trong github repo của bài viết này

Sau khi đã cài đặt thư viện opencv, chương trình python có thể sử dụng thư viện này bằng câu lệnh nhập cv2, Để chuyển ảnh từ định dạng. png. jpg. tif. sang dạng ma trận chúng ta có thể sử dụng hàm imread của thư viện opencv. Hàm này nhận đầu vào là đường dẫn tương thích hoặc tuyệt đối với ảnh, và đầu ra là một ảnh dưới 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 này nhận các tham số đầu vào là ảnh dưới dạng ma trận và một số đại diện cho lượng ảnh nhỏ được cắt từ ảnh đầu vào đó, con số này có giá trị mặc định là 10. Đầu ra của hàm là một danh sách các ảnh nhỏ đã được chuyển màu

Trên thực tế hàm image_cut thực hiện hai công việc chính là cắt ảnh lớn thành ảnh nhỏ và 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 sự được thực hiện trong 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 một số kiến ​​thức liên quan đến xử lý ảnh và thư viện opencv, nó có thể hơi phức tạp với những bạn chưa làm quen với xử lý ảnh bao giờ. Nếu bạn chưa hiểu những đoạn mã về lý ảnh, bạn hãy tạm thời bỏ qua nó, chúng ta chỉ cần hiểu chức năng của hàm và cách sử dụng nó là đủ

Hàm convert_to_grayscale

Hàm thực hiện việc chuyển đổi màu ảnh sang ảnh thang độ xám [có thể coi thang độ xám như một dạng ảnh đen trắng, thực tế thì ảnh thang độ xám khác ảnh đen trắng vì nó có nhiều độ xám hơn, nhưng trong phạm vi lộ trình này tôi coi chúng

Hàm này nhận đầu vào là một ảnh màu có định dạng ma trận, đầu ra của hàm là một ả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 này có nhiệm vụ ghép các ảnh nhỏ thành ảnh lớn theo đúng thứ tự

Đầu vào của hàm là một danh sách các ảnh chụp, đầu ra của hàm là một ảnh chụp lớn đã được ghép lại từ các ảnh nhỏ

def image_merge[images]:

    return np.concatenate[images, axis=0]

Mã nguồn hoàn chỉnh của ứng dụng như 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 thanh 3 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 khi da chuyen mau"]
    show_img[merged_img, "Anh sau khi 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 thanh viec chuyen mau cho anh"]

Tất cả mã nguồn của ứng dụng được đặt trên github trong đường dẫn sau

https. //github. com/vimentor-com/pythonbackenddemo. Các bạn có thể sử dụng git để sao chép ứng dụng này về máy bằng lệnh

________số 8

Github repo của ứng dụng này là công khai nên ai cũng có thể tải nó về máy và chạy. Hướng dẫn chạy ứng dụng được mô tả chi tiết trong tệp README. md. Vui lòng sao chép ứng dụng về và thử chạy để hiểu được hoạt động của chương trình. Nếu có bất kỳ lỗi nào xảy ra trong quá trình chạy ứng dụng, hãy bình luận dưới bài viết, tôi sẽ hỗ trợ trong trường hợp các bạn gặp khó khăn khi chạy chương trình

Có một lưu ý là khi chạy ứng dụng này, sẽ có những cửa sổ hiển thị hình ảnh mở lên, chương trình sẽ tạm thời bị dừng lại cho đến khi bạn tắt cửa sổ đó đi

Chạy ứng dụng bên trong docker container

Trong phần 1 của bài viết này, tôi đã giới thiệu về docker và các lệnh cơ bản để thao tác với một docker container. Trong phần này, chúng ta sẽ cùng thực hiện việc tạo docker container và chạy ứng dụng ở trên docker container đó. Nếu các bạn chưa quen với docker và chưa đọc qua phần 1 của bài viết này, các bạn nên dành thời gian để đọc nó trước khi tiếp tục các phần tiếp theo

Các bước tạo docker container và chạy ứng dụng bao gồm

Bước 1. Khởi chạy một docker container ubuntu

Trong bước này chúng ta nên đặt tên cho docker container để dễ nhớ và dễ thao tác về sau, nếu không đặt tên cho docker container thì docker cũng sẽ sinh ra một tên ngẫu nhiên cho container đó, tuy nhiên tên ngẫu nhiên này không dễ dàng

Docker container cô thiết lập tất cả những gì bên trong nó với môi trường máy bên ngoài nên những dữ liệu sinh ra bên trong container thì chỉ khi truy cập vào container mới nhìn thấy. Mà bên trong docker container là môi trường không đồ họa nên rất khó để kiểm tra xem đầu ra của chương trình [các file ảnh] có đúng như mong muốn hay không

Có một cách để chúng ta có thể xem được các tệp ảnh là sao chép tệp này ra bên ngoài máy thật, docker đưa ra một cách thuận tiện để gắn thư mục của máy thật vào trong docker container bằng cách sử dụng tùy chọn "-v. ". Khi sử dụng tùy chọn này, bên trong bộ chứa docker sẽ xuất ra một thư mục có đường dẫn, mọi dữ liệu xuất hiện trong thư mục này có thể được tìm thấy ở đường dẫn bên ngoài máy thật

Trong ví dụ này, tôi tạo ra một tệp check_existence. txt trong thư mục của máy thật. Sau khi container được khởi động, chúng ta có thể vào thư mục để kiểm tra sự tồn tại của file check_existence. txt. If this file tồn tại, 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 2. Khởi chạy một docker container ubuntu

Sau khi chạy lệnh này, docker sẽ tìm hình ảnh docker ubuntu trên máy cục bộ của bạn, nếu không tìm thấy nó sẽ kéo hình ảnh này từ dockerhub về và tạo ra một docker container có tên là pythonbackenddemo.                                                                                                                                                                                                                                                      

Bước 2. Cài đặt các gói phụ trợ và thiết lập môi trường

Trước khi cài đặt các gói phụ trợ, chúng ta cần cài đặt múi giờ, bởi vì trong một gói phụ trợ của chương trình yêu cầu làm điều này

pip3 install opencv-python
0

Sử dụng lệnh sau để cài đặt các gói phụ trợ cần thiết cho việc chạy ứng dụng

pip3 install opencv-python
1

Bước 3. Sao chép và chạy ứng dụng

pip3 install opencv-python
2

Ở trong bộ chứa docker, môi trường mặc định là không đồ họa không phải GUI nên hàm show_img sẽ không hoạt động và báo lỗi. Để tránh lỗi, chúng ta cần thiết lập để cho hàm show_img bỏ qua việc hiển thị hình ảnh

pip3 install opencv-python
3

Run program

pip3 install opencv-python
4

Hình 3. Sao chép và chạy ứng dụng pythonbackenddemo

Do chúng ta đã thiết lập để bỏ qua hoạt động của hàm show_img trong môi trường không có đồ họa, nên chương trình sẽ chạy một mạch mà không bị dừng lại ở hàm show_img. Sau khi chạy chương trình, thư mục hình ảnh xuất hiện thêm một tệp ảnh output_sample. jpg. Đó chính là ảnh đã được chuyển đổi màu từ ảnh đầu vào input_sample. jpg

Ở bước 1. Tôi đã gắn thư mục máy thật vào trong docker container, do đó ta có thể kiểm tra tệp ảnh đầu ra bằng cách sao chép tệp đó vào thư mục /root/demo_output rồi ra ngoài máy thật, truy cập vào thư mục $HOME/

Nếu muốn thoát khỏi docker container, bạn có thể sử dụng tổ hợp phím ctrl+p,ctrl+q, tổ hợp phím này sẽ giúp bạn thoát khỏi docker container và đưa container về dạng chạy chậm. Hoặc sử dụng lệnh exit từ bên trong để thoát và dừng luôn docker container

Cách viết Dockerfile và tạo docker image

Dockerfile là một tệp văn bản chứa các lệnh trợ giúp docker có thể tự động tạo ra một hình ảnh docker theo ý người dùng

Khi phát triển xong một ứng dụng, nếu các thành viên lập trình đóng gói ứng dụng đó trong một docker container và muốn chuyển docker container này tới tay khách hàng, họ có thể làm theo hai cách

Cách 1. Viết Docker mộtfile chứa tất cả các câu lệnh để thiết lập môi trường, cài đặt các gói phụ trợ, sao chép mã nguồn rồi chuyển cho khách hàng, sau khi nhận được Dockerfile, khách hàng sẽ sử dụng lệnh docker build để xây dựng một hình ảnh docker từ Dockerfile

ưu điểm. Dockerfile thường có kích thước rất nhỏ, rất dễ dàng để chuyển từ nơi này qua nơi khác. Nội dung của Dockerfile rất thông minh, giúp cả lập trình viên và khách hàng của họ kiểm soát được những thành phần có chứa gì trong docker image

nhược điểm. Việc xây dựng hình ảnh docker từ Dockerfile có thể gặp lỗi khi bị lỗi mạng hoặc các repo chứa các gói phần mềm, mã nguồn bị thay đổi

cách 2. Xây dựng sẵn một docker image đã chứa đầy đủ các thành phần mà khách hàng cần và chuyển cho họ

ưu điểm. Bảo đảm vùng chứa docker sẽ luôn chạy được, nếu hình ảnh docker đã được kiểm tra kỹ càng và đã được kiểm tra. Không sợ bị thiếu bất kỳ thành phần nào, tất cả đều đã được đóng gói vào docker image

nhược điểm. Kích thước của docker image thường rất lớn, khó duy trì và kiểm tra các thành phần bên trong nó

Trong các dự án thực tế, tôi thường duy trì cả Dockerfile và docker image. Dockerfile được lưu trữ trên github cùng với mã nguồn, Sau đó build docker image từ Dockerfile rồi đưa docker image lên dockerhub để lưu trữ. Việc làm này đảm bảo sự đồng bộ giữa Dockerfile và docker image. Giúp người phát triển có thể kiểm tra các thành phần trong docker image, tránh việc cài đặt thiếu gói hoặc sao chép gói phần mềm, cũng như việc thiết lập môi trường sau xung đột với các thiết lập trước đó

Dockerfile cho ứng dụng đã được xây dựng ở những phần trên sẽ như sau

pip3 install opencv-python
5Cú pháp trong Dockerfile khá dễ hiểu và tường minh. Tôi sẽ có một bài viết về cú pháp của Dockerfile sau, tuy nhiên các bạn có thể tìm hiểu trước thông qua tài liệu trên trang chủ của docker. tài liệu tham khảo Dockerfile

Để xây dựng hình ảnh docker từ Dockerfile, bạn cần lưu tất cả nội dung trong các khung vào một tệp có tên là Dockerfile và sử dụng lệnh

pip3 install opencv-python
6

Khi này docker sẽ tìm thấy trong thư mục hiện tại xem có tên tệp nào là Dockerfile không, nếu thấy nó sẽ đọc lệnh từ Dockerfile này, thực hiện công việc xây dựng hình ảnh và gắn tên cho hình ảnh là demoimg. v0. 1 [v0. 1 là phiên bản thẻ của hình ảnh docker]

Khi xây dựng thành công, bạn sẽ thấy xuất hiện các dòng nhật ký như sau

pip3 install opencv-python
7

Như vậy chúng ta đã hoàn thành việc build image từ Dockerfile. Lúc này chúng ta có thể khởi động một docker container từ image này và chạy ứng dụng mà không cần thực hiện các bước thiết lập môi trường, cài đặt các gói phụ trợ và sao chép mã nguồn, bởi vì tất cả các bước trên đã được thực hiện

pip3 install opencv-python
8

Hình 4. Run a docker container from new image and check active

Cách tạo hình ảnh docker tối ưu

Trong hệ thống Microservice được phát triển tự động, các docker image được lưu trữ trên một docker hub [dockerhub. com, quay. io. ] and are more version [phiên bản]. Trong quá trình phát triển phần mềm, mã nguồn được cập nhật or liên tục, kèm theo đó là các docker image cũng sẽ liên tục được cập nhật or

Nếu một hình ảnh docker quá lớn sẽ làm cho quá trình phát triển trở nên khó khăn hơn do lưu lượng truyền tải trên mạng lớn hơn, cần nhiều thời gian hơn để hoàn thành và nó cũng gây ra dung lượng ổ đĩa để lưu trữ, qua đó tăng lên

Việc tối ưu hình ảnh docker là công việc cần thiết. Chúng ta cần kiểm tra và xóa toàn bộ các gói phần mềm, dữ liệu không cần thiết phải thoát khỏi docker image, cũng như sử dụng các base image có kích thước nhỏ như alpine image

Khi xóa các 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 các gói phụ trợ cần thiết

Kết luận

Sử dụng microservice và container đang trở thành xu thế công nghệ mới, chúng thích hợp cho việc xây dựng hệ thống trang web có khả năng mở rộng cao và quản lý dễ dàng. Đóng gói ứng dụng vào trong vùng chứa không chỉ phục vụ cho việc phát triển hệ thống microservice mà còn giải quyết các vấn đề về khác biệt môi trường, xung đột thư viện, làm cho phần mềm chạy ổn định ở mọi nơi, trên máy tính . Công nghệ container là một công nghệ xung đột giúp tăng cường khả năng phát triển phần mềm và khi ứng dụng vào hệ thống microservice thì nó còn làm cho hệ thống trở nên đáng tin cậy hơn thông qua việc kết hợp với các công cụ quản lý

Bài viết bao gồm các kiến ​​thức cơ bản về docker và cách chạy ứng dụng bên trong docker container. Nội dung bài viết này sẽ được mở rộng, giống như quá trình mở rộng của phần mềm từ khối nguyên mô hình tới mô hình microservice. Mã nguồn của bài viết cũng như toàn bộ lộ trình được duy trì như một dự án thực tế trên github. https. //github. com/vimentor-com/pythonbackenddemo. Trong quá trình chạy phần mềm, nếu xảy ra lỗi các bạn có thể bình luận dưới bài viết này hoặc tham gia nhóm

Chủ Đề