Hướng dẫn sử dụng docker

0. Mục tiêu của docker

Tạo một môi trường máy ảo để đóng gói code. Sau này mang code đi sử dụng ở bất kỳ máy nào khác chỉ cần chạy file docker là xong, không cần có các thao tác cài đặt lại.

Hướng dẫn được thực hiện ở trên máy Ubuntu 20.04 LTS, chú ý rằng các dịch vụ máy ảo như Google Colab hay Paperspace không sử dụng được Docker.

Trước hết phân biệt khái niệm:

1. Các bước cài đặt docker

Có thể cần dùng đến quyền sudo

sudo apt-get update
sudo apt-get install docker.io

Sau khi cài đặt xong cần chạy thêm dòng lệnh dưới đây để khởi động docker:

systemctl start docker

Sau khi thực hiện hai bước trên, thực hiện lệnh dưới đây để đảm bảo việc cài đặt được hoàn thành không có lỗi:

sudo docker run -it hello-world

Nếu bạn nhận được dòng phản hồi dưới đây đồng nghĩa với việc cài đặt đã hoàn tất:

2. Tải image ubuntu

Docker có chuẩn bị sẵn image ubuntu, chúng ta có thể tải về và làm việc trên container này.

sudo docker run -it ubuntu

Sau dòng lệnh này thì image ubuntu sẽ tự động được tải về từ máy chủ.

Tải thành công:

Sau bước này thì docker đã tự động tạo ra một máy ảo, cụ thể có Container ID là 17b889396950. Chúng ta có thể tạm thời thoát ra container này, về lại terminal chính bằng cách Ctrl + D hoặc gõ Exit.

3. Thực hiện chạy một container

Bây giờ chúng ta sẽ tạo lại một container bằng cách làm y chang bước 2.

sudo docker run -it ubuntu

Mở ra 1 terminal khác, gõ lệnh sau:

sudo docker ps

Có thể thấy container chúng ta vừa tạo có ID là 87164a4ceea0, docker image có name là ubuntu

Như vậy, chúng ta giữ 1 cửa sổ terminal để làm việc từ bên ngoài (user gốc của máy) . Một cửa sở để làm việc bên trong image.

Có thể coi Docker image là máy ảo, container giống như chúng ta mở terminal của máy ảo đó vậy.

4. Các bước gói source code vào docker

4.1. Copy code vào docker

Ở terminal user gốc, chúng ta thực hiện lệnh dưới đây để copy source code vào container.

cp <thư mục code ở user gốc> <id container>:<đường dẫn muốn copy vào trong docker image>

Ví dụ, toàn bộ code nằm trong folder source, trong folder này có một file hello.py có nội dung như sau:

print("Hello world. Su dung docker that vui")

Ta tiến hành cp từ ngoài vào docker image:

sudo docker cp WORKING/DDocker/source 87164a4ceea0:/source

Command line trên sẽ copy folder source từ ngoài vào folder source bên trong docker image.

Sau khi copy ta commit lại:

sudo docker commit <container ID> <image name>

Cụ thể:

sudo docker commit 87164a4ceea0 ubuntu

Bây giờ chúng ta chuyển sang terminal docker image kiểm tra thử xem đã có thư mục source trong docker chưa

root@87164a4ceea0:/# ls

Kết quả:

Như vậy chúng ta đã có folder source bên trong docker.

Thử vào thư mục source và kiểm tra:

cd source
ls

Như vây là đã có file hello.py của chúng ta, tiến hành chạy thử file này trong docker:

python3 hello.py

Đến đây chúng ta đã hiểu sơ được cách docker hoạt động.

Thường sử dụng docker chúng ta sẽ chuẩn bị một file bash để chạy end-to-end source code của chúng ta. Tiến hành thử tạo một file bash để chạy file hello.py.

File bash này đặt tên là run.sh

cd source #cd vào thư mục source python3 hello.py #Chạy file hello.

Chúng ta tiến hành cp fle này vào folder source trong docker image

sudo docker cp WORKING/DDocker/source/run.sh 87164a4ceea0:/source

4.2. Cài đặt environment cần thiết trong image.

Ở terminal container, chúng ta tiến hành dùng lệnh pip cài đặt các thư viện cần dùng cho source code của chúng ta.

Tuy nhiên, docker image ta đang dùng có thể chưa cài pip, trước hết chúng ta cài pip.

  1. apt update trước:
apt update
  1. cài đặt pip3:
apt install python3-pip

Sau khi cài đặt xong chúng ta sẽ tiến hành cài toàn bộ thư viện cần thiết để chạy code của chúng ta. Cài đặt như thông thường:

pip3 install <thư viện>

Ví dụ muốn cài thu viện numpy:

pip3 install numpy

Tiến hành cài đặt thư viện numpy bình thường như ở bên ngoài:

Hoặc ta có thể cp file requirements.txt hay .yml từ bên ngoài vào trong docker image, rồi chạy cài đặt thư viện gắn flag -r vào.

pip3 install -r requirements.txt

Các lỗi trên docker image cũng như các lỗi trên máy linux bình thường. Gặp lỗi gì cứ stackoverflow.

4.3 Verify lại code trong docker.

Ta tiến hành chạy lại source đã copy vào docker image để verify lại mọi thứ đều đúng.

Tiến hành chạy lại file bash run.sh trong docker image xem có chạy được không bằng dòng lệnh:

sudo docker run <image name> /bin/bash <đường dẫn file bash>

Ví dụ cụ thể:

sudo docker run ubuntu /bin/bash source/run.sh

Kết quả:

Như vậy ta đã chắc rằng docker image hoạt động tốt.

5. Xuất docker image

Sau khi hoàn thành các bước trên, ta tiến hành xuất file image ra.

Ta kiểm tra image id

sudo docker images

Ta sử dụng image id của <lastest>, là image id chúng ta commit mới nhất.

Xuất image:

sudo docker save -o <name output> <image_id> 

Thường chúng ta lưu docker image ở đuôi .tar:

sudo docker save -o test.tar 3bd5fce5bc3e

Sau khi lưu sẽ có file output test.tar được tạo, đây là docker image chứ code, môi trường mà nãy giờ chúng ta tạo.

6. Load thử image

Sau khi xong xuôi, để chắc chắn docker hoạt động tốt ta load lại docker image

sudo docker load -i <docker image name>

cụ thể:

sudo docker load -i test.tar

Kiểm tra lại ta thấy có một docker image mới được thêm

Lấy image id ra và chạy lại thử file bash trong image

sudo docker run 3bd5fce5bc3e /bin/bash source/run.sh

Kết quả như mong đợi:

Bài viết trên hướng dẫn sử dụng docker chưa dùng GPU.