Docker giúp đơn giản hóa quá trình quản lý các quy trình ứng dụng bên trong container. Mặc dù container có nhiều điểm tương đồng với máy ảo, nhưng chúng nhẹ hơn và tiết kiệm tài nguyên hơn. Điều này cho phép các nhà phát triển phân tách môi trường ứng dụng thành nhiều dịch vụ được cách ly riêng biệt.
Để triển khai Docker Compose hiệu quả trên Ubuntu 22.04, việc chọn VPS hosting chất lượng là yếu tố then chốt. Với VPS hosting từ các nhà cung cấp uy tín, bạn đảm bảo hiệu suất cao, ổn định, giúp chạy các container mượt mà và tối ưu hóa quy trình phát triển ứng dụng.
Đối với các ứng dụng phụ thuộc vào nhiều dịch vụ, việc điều phối (orchestrate) tất cả các container khởi động, giao tiếp và tắt cùng lúc có thể trở nên phức tạp. Docker Compose là một công cụ cho phép bạn chạy các môi trường ứng dụng đa container dựa trên các định nghĩa được thiết lập trong một tệp YAML. Nó sử dụng định nghĩa dịch vụ để xây dựng các môi trường có thể tùy chỉnh hoàn toàn với nhiều container có thể chia sẻ mạng lưới và volume dữ liệu.
DataOnline hướng dẫn bạn cách cài đặt Docker Compose trên server Ubuntu 22.04 và cách bắt đầu sử dụng công cụ này.
Yêu cầu tiên quyết
Để theo dõi bài viết này, bạn cần có:
● Quyền truy cập vào một máy Ubuntu 22.04 (máy cục bộ hoặc server phát triển) với tư cách người dùng không phải root có quyền sudo. Nếu bạn sử dụng server từ xa, nên đảm bảo rằng firewall đã được cài đặt. Để thiết lập, hãy tham khảo Hướng dẫn Cài Đặt Server Ban Đầu cho Ubuntu 22.04
● Docker đã được cài đặt trên server hoặc máy cục bộ của bạn, theo như các Bước 1 và 2 của bài Cách Cài Đặt và Sử Dụng Docker trên Ubuntu 22.04.
Lưu ý: Bắt đầu từ Docker Compose v2, Docker đã chuyển sang sử dụng lệnh plugin compose CLI, thay vì sử dụng docker-compose gốc như trong phiên bản Ubuntu 20.04 trước đó của bài hướng dẫn. Mặc dù quá trình cài đặt có khác nhau, nhưng về cơ bản cách sử dụng thực tế chỉ đơn giản là bỏ dấu gạch nối khỏi lệnh docker-compose để thành docker compose. Để biết chi tiết về khả năng tương thích đầy đủ, hãy kiểm tra tài liệu chính thức của Docker về sự tương thích lệnh giữa compose mới và docker-compose cũ.
Bước 1 – Cài đặt Docker Compose
Để đảm bảo rằng bạn nhận được phiên bản ổn định mới nhất của Docker Compose, bạn sẽ tải phần mềm này từ kho Github chính thức của nó.
Đầu tiên, hãy xác nhận phiên bản mới nhất có sẵn trên trang Releases của họ. Tại thời điểm viết bài này, phiên bản ổn định hiện tại là 2.3.3
.
Sử dụng lệnh sau để tải về:
mkdir -p ~/.docker/cli-plugins/ curl -SL https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
Tiếp theo, đặt quyền chính xác để lệnh docker compose có thể thực thi được:
chmod +x ~/.docker/cli-plugins/docker-compose
Để xác nhận rằng cài đặt thành công, bạn có thể chạy:
docker compose version
Bạn sẽ thấy đầu ra giống như sau:
Output Docker Compose version v2.3.3
Docker Compose đã được cài đặt thành công trên hệ thống của bạn. Trong phần tiếp theo, bạn sẽ tìm hiểu cách thiết lập tệp docker-compose.yml và khởi chạy một môi trường container hóa bằng công cụ này.
Bước 2 – Thiết lập tệp docker-compose.yml
Để minh họa cách thiết lập tệp docker-compose.yml và làm việc với Docker Compose, bạn sẽ tạo một môi trường máy chủ web sử dụng image Nginx chính thức từ Docker Hub (registry công cộng). Môi trường container này sẽ phục vụ một tệp HTML tĩnh duy nhất.
Bắt đầu bằng cách tạo một thư mục mới trong thư mục home của bạn, sau đó di chuyển vào thư mục đó:
mkdir ~/compose-demo cd ~/compose-demo
Trong thư mục này, tạo một thư mục ứng dụng làm document root cho môi trường Nginx:
mkdir app
Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp index.html
trong thư mục app:
nano app/index.html
Chèn nội dung sau vào tệp app/index.html
:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Docker Compose Demo</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css"> </head> <body> <h1>This is a Docker Compose Demo Page.</h1> <p>This content is being served by an Nginx container.</p> </body> </html>
Lưu và đóng tệp khi hoàn tất. Nếu sử dụng nano
, nhấn CTRL+X
, sau đó Y
và ENTER
để xác nhận.
Tiếp theo, tạo tệp docker-compose.yml
:
nano docker-compose.yml
Chèn nội dung sau vào tệp docker-compose.yml
:
version: '3.7' services: web: image: nginx:alpine ports: - "8000:80" volumes: - ./app:/usr/share/nginx/html
Tệp docker-compose.yml
thường bắt đầu với phần định nghĩa phiên bản, cho Docker Compose biết bạn đang sử dụng phiên bản cấu hình nào.
Tiếp theo là khối services
, nơi bạn thiết lập các dịch vụ thuộc môi trường container này. Trong trường hợp này, bạn có một dịch vụ duy nhất có tên web
. Dịch vụ này sử dụng image nginx:alpine
và thiết lập chuyển tiếp cổng thông qua chỉ thị ports
. Tất cả các yêu cầu đến cổng 8000
trên máy chủ (hệ thống nơi bạn chạy Docker Compose) sẽ được chuyển tiếp đến container web
tại cổng 80
, nơi Nginx đang chạy.
Chỉ thị volumes
sẽ tạo một volume chia sẻ giữa máy chủ và container. Thư mục app
cục bộ sẽ được chia sẻ với container và ánh xạ vào đường dẫn /usr/share/nginx/html
bên trong container, từ đó ghi đè document root mặc định của Nginx.
Lưu và đóng tệp.
Bạn đã thiết lập xong một trang demo và tệp docker-compose.yml
để tạo môi trường máy chủ web container hóa phục vụ trang này. Trong bước tiếp theo, bạn sẽ khởi động môi trường này bằng Docker Compose.
Bước 3 – Chạy Docker Compose
Với tệp docker-compose.yml
đã được thiết lập, bạn có thể chạy Docker Compose để khởi động môi trường:
docker compose up -d
Docker Compose sẽ kiểm tra image được định nghĩa trên hệ thống; nếu không tìm thấy, nó sẽ tải image từ Docker Hub. Bạn sẽ thấy đầu ra giống như sau:
Output Creating network "compose-demo_default" with the default driver Pulling web (nginx:alpine)... alpine: Pulling from library/nginx cbdbe7a5bc2a: Pull complete 10c113fb0c77: Pull complete 9ba64393807b: Pull complete c829a9c40ab2: Pull complete 61d685417b2f: Pull complete Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502 Status: Downloaded newer image for nginx:alpine Creating compose-demo_web_1 ... done
Lưu ý: Nếu bạn gặp lỗi liên quan đến quyền truy cập Docker socket, điều đó có nghĩa là bạn đã bỏ qua Bước 2 của bài Cách Cài Đặt và Sử Dụng Docker trên Ubuntu 22.04 Quay lại và hoàn thành bước đó để cấp quyền chạy lệnh docker mà không cần sudo.
Môi trường của bạn hiện đã được khởi động chạy ở chế độ nền. Để kiểm tra container đang hoạt động, chạy:
docker compose ps
Lệnh này sẽ hiển thị thông tin về các container đang chạy và trạng thái của chúng, cũng như các chuyển tiếp cổng đang được thiết lập:
Output Name Command State Ports ---------------------------------------------------------------------------------- compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp
Giờ bạn có thể truy cập ứng dụng demo bằng cách mở trình duyệt và truy cập localhost:8000
nếu chạy trên máy cục bộ, hoặc your_server_domain_or_IP:8000
nếu chạy trên server từ xa.
Trang web sẽ hiển thị nội dung tĩnh từ tệp index.html
. Volume chia sẻ được thiết lập trong tệp docker-compose.yml
sẽ đồng bộ các file trong thư mục app
với document root của container. Nếu bạn thay đổi nội dung tệp index.html, container sẽ tự động cập nhật và thay đổi đó sẽ được hiển thị trên trình duyệt khi tải lại trang.
Trong bước tiếp theo, bạn sẽ tìm hiểu cách quản lý môi trường container hóa của mình bằng các lệnh của Docker Compose.
Bước 4 – Làm quen với các lệnh Docker Compose
Bạn đã xem cách thiết lập tệp docker-compose.yml
và khởi động môi trường bằng lệnh docker compose up
. Giờ hãy cùng tìm hiểu cách sử dụng các lệnh của Docker Compose để quản lý và tương tác với môi trường container hóa của bạn.
Để xem log
được tạo ra bởi container Nginx, sử dụng lệnh:
docker compose logs
Bạn sẽ thấy đầu ra giống như sau:
Output Attaching to compose-demo_web_1 web_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration web_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh web_1 | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf web_1 | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh web_1 | /docker-entrypoint.sh: Configuration complete; ready for start up web_1 | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"
Nếu bạn muốn tạm dừng môi trường mà không thay đổi trạng thái hiện tại của các container, sử dụng:
docker compose pause
Output Pausing compose-demo_web_1 ... done
Để tiếp tục chạy lại sau khi đã tạm dừng:
docker compose unpause
Output Unpausing compose-demo_web_1 ... done
Lệnh docker compose stop sẽ dừng việc thực thi của container nhưng không xóa dữ liệu liên quan:
docker compose stop
Output Stopping compose-demo_web_1 ... done
Nếu bạn muốn xóa các container, mạng, và volume liên quan đến môi trường container hóa này, sử dụng lệnh docker compose down
:
docker compose down
Output Removing compose-demo_web_1 ... done Removing network compose-demo_default
Lưu ý rằng lệnh này không xóa image cơ sở được sử dụng bởi Docker Compose để khởi động môi trường (trong trường hợp này là nginx:alpine
). Như vậy, khi bạn khởi động lại môi trường với docker compose up
, quá trình sẽ nhanh hơn vì image đã có sẵn trên hệ thống.
Nếu bạn muốn xóa luôn image cơ sở khỏi hệ thống, bạn có thể sử dụng:
docker image rm nginx:alpine
Đầu ra sẽ hiển thị các thông báo như:
Output Untagged: nginx:alpine Untagged: nginx@sha256:b89a6ccbda39576ad23fd079978c967cecc6b170db6e7ff8a769bf2259a71912 Deleted: sha256:7d0cdcc60a96a5124763fddf5d534d058ad7d0d8d4c3b8be2aefedf4267d0270 Deleted: sha256:05a0eaca15d731e0029a7604ef54f0dda3b736d4e987e6ac87b91ac7aac03ab1 Deleted: sha256:c6bbc4bdac396583641cb44cd35126b2c195be8fe1ac5e6c577c14752bbe9157 Deleted: sha256:35789b1e1a362b0da8392ca7d5759ef08b9a6b7141cc1521570f984dc7905eb6 Deleted: sha256:a3efaa65ec344c882fe5d543a392a54c4ceacd1efd91662d06964211b1be4c08 Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a
Lưu ý: Vui lòng tham khảo hướng dẫn Cách Cài Đặt và Sử Dụng Docker để biết thêm chi tiết về các lệnh Docker.
Kết luận
Để tham khảo đầy đủ danh sách các lệnh Docker Compose
có sẵn, hãy xem tài liệu chính thức của Docker Compose.