Docker là một nền tảng container hóa, giúp chuẩn hóa môi trường làm việc, giúp quy trình triển khai ứng dụng trở nên đồng nhất. Đối với nhà phát triển, Docker cho phép bạn mô phỏng môi trường sản xuất trên máy local bằng cách chạy các thành phần ứng dụng trong các container độc lập. Những container này có thể được tự động hóa dễ dàng với Docker Compose, bất kể loại ứng dụng hay hệ điều hành cơ sở.
Hướng dẫn này sẽ sử dụng Docker Compose để tự động hóa quy trình CI, thông qua việc:
-
Tạo một ứng dụng Python đơn giản dạng “Hello World”,
-
Viết một script kiểm thử Bash,
-
Xây dựng ứng dụng Python trong hai container:
-
Một container chạy ứng dụng,
-
Một container Redis dùng làm cơ sở dữ liệu.
-
-
Chuyển toàn bộ môi trường kiểm thử vào docker-compose.test.yml, đảm bảo mỗi lần kiểm thử đều được chạy trong một môi trường đồng nhất và hoàn toàn mới.
Cách tiếp cận này giúp bạn xây dựng môi trường kiểm thử tách biệt nhưng giống hệt môi trường chạy thực tế, bao gồm cả các dependency, mà không phụ thuộc vào ứng dụng hoặc hạ tầng bên dưới.
Yêu Cầu
Trước khi bắt đầu, bạn cần:
-
Một máy chủ Ubuntu 16.04 với tài khoản người dùng không phải root và có quyền
sudo
. Xem hướng dẫn Thiết lập máy chủ ban đầu với Ubuntu 16.04. -
Docker, cài đặt theo Bước 1 và 2 của hướng dẫn Cách Cài Đặt và Sử Dụng Docker trên Ubuntu 16.04.
-
Docker Compose, cài đặt theo Bước 1 của hướng dẫn Cách Cài Đặt Docker Compose trên Ubuntu 16.04.
Bước 1 – Tạo ứng dụng Python “Hello World”
Tạo thư mục mới cho ứng dụng:
cd ~ mkdir hello_world cd hello_world
Tạo và chỉnh sửa file app.py bằng nano:
nano app.py
Thêm nội dung sau:
app.py from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host="redis") @app.route("/") def hello(): visits = redis.incr('counter') html = "<h3>Hello World!</h3>" \ "<b>Visits:</b> {visits}" \ "<br/>" return html.format(visits=visits) if __name__ == "__main__": app.run(host="0.0.0.0", port=80)
Khi bạn hoàn tất, hãy lưu và thoát tệp.
app.py
là một ứng dụng web dựa trên Flask kết nối với dịch vụ dữ liệu Redis. Dòng visits = redis.incr('counter')
sẽ tăng số lượt truy cập và lưu trữ giá trị này trong Redis. Cuối cùng, một thông báo “Hello World” kèm theo số lượt truy cập sẽ được trả về dưới dạng HTML.
Ứng dụng của chúng ta có hai thư viện phụ thuộc là Flask và Redis, như bạn có thể thấy ở hai dòng đầu tiên. Những thư viện này cần được khai báo trước khi chúng ta có thể chạy ứng dụng.
Tạo file requirements.txt để khai báo các dependency:
nano requirements.txt
Thêm nội dung:
requirements.txt Flask Redis
Lưu và đóng file. Bây giờ chúng ta đã sẵn sàng Dockerize ứng dụng này.
Bước 2 – Dockerize ứng dụng “Hello World”
Tạo và chỉnh sửa file Dockerfile:
nano Dockerfile
Thêm nội dung:
Dockerfile FROM python:2.7 WORKDIR /app ADD requirements.txt /app/requirements.txt RUN pip install -r requirements.txt ADD app.py /app/app.py EXPOSE 80 CMD ["python", "app.py"]
Giải thích:
-
FROM python:2.7
: Sử dụng image chính thức của Python 2.7, -
WORKDIR /app
: Đặt thư mục làm việc trong container, -
ADD requirements.txt /app/requirements.txt
: Thêm file requirements.txt, -
RUN pip install -r requirements.txt
: Cài đặt các dependency, -
ADD app.py /app/app.py
: Thêm mã nguồn ứng dụng, -
EXPOSE 80
: Mở cổng 80, -
CMD ["python", "app.py"]
: Chạy ứng dụng khi container khởi động.