Docker đơn giản hóa quá trình quản lý các quy trình ứng dụng trong vùng chứa. Các vùng chứa giống với máy ảo trong một số điểm, chúng nhẹ hơn và thân thiện với tài nguyên hơn. Điều này cho phép các nhà phát triển chia nhỏ môi trường ứng dụng thành nhiều dịch vụ riêng biệt.
Đối với các ứng dụng phụ thuộc vào một số dịch vụ, việc sắp xếp tất cả các vùng chứa để khởi động, giao tiếp và tắt cùng nhau có thể trở nên khó sử dụng. Docker Compose là một công cụ cho phép bạn chạy các môi trường ứng dụng multi-container (nhiều vùng chứa) dựa trên các định nghĩa được đặt trong tệp YAML. Nó sử dụng các định nghĩa dịch vụ để xây dựng các môi trường hoàn toàn có thể tùy chỉnh với nhiều vùng chứa, có thể chia sẻ mạng và data volumes.
Trong hướng dẫn này, bạn sẽ được hướng dẫn cách cài đặt Docker Compose trên máy chủ Ubuntu 20.04 và cách bắt đầu sử dụng công cụ này.
Để thực hiện theo bài viết này, bạn sẽ cần:
Lưu ý: Bài viết này sẽ hướng dẫn bạn cài đặt Docker Compose v1, sử dụng docker-compose
. Với Docker Compose v2, Docker đã chuyển sang sử dụng lệnh compose
CLI plugin như được ghi lại trong phiên bản Ubuntu 22.04 mới nhất của hướng dẫn này và khác với bản gốc docker-compose
. Mặc dù cách cài đặt khác nhau, nhưng nhìn chung, việc sử dụng thực tế liên quan đến việc bỏ dấu gạch nối từ cách gọi docker-compose
trở thành docker compose
. Để biết đầy đủ chi tiết về khả năng tương thích, hãy kiểm tra tài liệu Docker chính thức về khả năng tương thích của lệnh giữa compose
mới và docker-compose
cũ.
Để đảm bảo có được phiên bản Docker Compose ổn định nhất được cập nhật, bạn sẽ tải xuống phần mềm này từ kho lưu trữ Github chính thức của nó.
Trước tiên, hãy xác nhận phiên bản mới nhất hiện có trong trang phát hành của họ. Tại thời điểm viết bài này, phiên bản ổn định nhất hiện tại là 1.29.2
.
Lệnh dưới đây sẽ tải xuống bản phát hành 1.29.2
và lưu tệp thực thi tại /usr/local/bin/docker-comp
, điều này sẽ làm cho phần mềm có thể truy cập toàn cầu dưới dạng docker-compose
:
- sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Tiếp theo, hãy đặt các quyền chính xác để lệnh docker-compose
có thể thực thi được:
- sudo chmod +x /usr/local/bin/docker-compose
Để xác minh 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 tương tự như sau:
Outputdocker-compose version 1.29.2, build 5becea4c
Docker Compose hiện đã đượ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ẽ thấy cách thiết lập tệp docker-compose.yml
, thiết lập một môi trường chứa và chạy với công cụ này.
docker-compose.yml
Để trình bày 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ôi trường máy chủ web bằng cách sử dụng hình ảnh Nginx chính thức từ Docker Hub, cơ quan đăng ký Docker công khai. Môi trường được chứa này sẽ phân phát 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 chính của bạn, sau đó chuyển nó vào:
- mkdir ~/compose-demo
- cd ~/compose-demo
Trong thư mục này, hãy thiết lập một thư mục ứng dụng để làm tài liệu gốc cho môi trường Nginx của bạn:
- 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
mới trong thư mục app
:
- nano app/index.html
Đặt nội dung dưới đây vào tệp này:
<!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>3
Lưu và đóng tệp khi bạn hoàn tất. Nếu bạn đang sử dụng nano
, bạn có thể làm điều đó bằng cách gõ CTRL + X
, sau đó là 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
của bạn:
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 bằng version
. Thao tác này sẽ cho Docker Compose biết bạn đang sử dụng phiên bản cấu hình nào.
Sau đó, bạn có khối services
, nơi bạn thiết lập các dịch vụ là một phần của môi trường này. Trong trường hợp của bạn, bạn có một dịch vụ duy nhất được gọi là web
. Dịch vụ này sử dụng hình ảnh nginx:alpine
và thiết lập chuyển hướng cổng với chỉ thị ports
. Tất cả các yêu cầu trên cổng 8000
của máy chủ (hệ thống từ nơi bạn đang chạy Docker Compose) sẽ được chuyển hướng đến vùng chứa web
trên cổng 80
, nơi Nginx sẽ chạy.
Chỉ thị volumes
sẽ tạo một shared volume giữa máy chủ và bộ chứa. Thao tác này sẽ chia sẻ thư mục cục bộ app
với vùng chứa, và volume sẽ được đặt tại /usr/share/nginx/html
bên trong vùng chứa, sau đó sẽ ghi đè lên tài liệu gốc mặc định cho Nginx.
Lưu và đóng tập tin.
Bạn đã thiết lập một trang demo và một tệp docker-compose.yml
để tạo một môi trường máy chủ web được chứa đựng để phục vụ nó. Trong bước tiếp theo, bạn sẽ xây dựng môi trường này với Docker Compose.
Với tệp docker-compose.yml
, bây giờ bạn có thể thực hiện Docker Compose để đưa môi trường của bạn lên. Lệnh dưới đây sẽ tải xuống các hình ảnh Docker cần thiết, tạo vùng chứa cho dịch vụ web
và chạy môi trường được chứa trong chế độ nền:
- docker-compose up -d
Docker Compose trước tiên sẽ tìm kiếm hình ảnh đã xác định trên hệ thống cục bộ của bạn và nếu nó không thể tìm thấy hình ảnh, nó sẽ tải xuống từ Docker Hub. Bạn sẽ thấy đầu ra như thế này:
OutputCreating 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 quyền liên quan đến Docker socket, điều này có nghĩa là bạn đã bỏ qua Bước 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 20.04. Quay lại và hoàn thành bước đó để cho phép quyền chạy các lệnh của docker mà không cần sudo
.
Môi trường của bạn hiện đang hoạt động trong nền. Để xác minh rằng vùng chứa đang hoạt động, bạn có thể chạy:
- docker-compose ps
Lệnh này sẽ hiển thị cho bạn thông tin về các vùng chứa đang chạy và trạng thái của chúng, cũng như bất kỳ chuyển hướng cổng nào hiện đang diễn ra:
Output Name Command State Ports
----------------------------------------------------------------------------------
compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp
Giờ đây, bạn có thể truy cập ứng dụng demo bằng cách trỏ trình duyệt của mình tới localhost: 8000
nếu bạn đang chạy bản demo này trên máy cục bộ của mình hoặc your_server_domain_or_IP: 8000
nếu bạn đang chạy bản demo này trên máy chủ từ xa.
Bạn sẽ thấy một trang như thế này:
Shared volume mà bạn đã thiết lập trong tệp docker-compose.yml
giữ các tệp thư mục ứng dụng của bạn đồng bộ hóa với tệp gốc tài liệu của vùng chứa. Nếu bạn thực hiện bất kỳ thay đổi nào đối với tệp index.html
, chúng sẽ được vùng chứa tự động chọn và do đó được phản ánh trên trình duyệt của bạn khi bạn tải lại trang.
Trong bước tiếp theo, bạn sẽ thấy cách quản lý môi trường được chứa bằng các lệnh Docker Compose.
Bạn đã biết cách thiết lập tệp docker-compose.yml
và thiết lập môi trường của bạn với docker-compose up
. Bây giờ, bạn sẽ thấy cách sử dụng lệnh Docker Compose để quản lý và tương tác với môi trường được chứa trong vùng chứa của bạn.
Để kiểm tra nhật ký được tạo bởi vùng chứa Nginx của bạn, bạn có thể sử dụng lệnh logs
:
- docker-compose logs
Bạn sẽ thấy đầu ra tương tự như sau:
OutputAttaching 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 thực hiện môi trường mà không thay đổi trạng thái hiện tại của vùng chứa, bạn có thể sử dụng:
- docker-compose pause
OutputPausing compose-demo_web_1 ... done
Để tiếp tục thực hiện sau khi tạm dừng:
- docker-compose unpause
OutputUnpausing compose-demo_web_1 ... done
Lệnh stop
sẽ chấm dứt việc thực thi vùng chứa, nhưng nó sẽ không phá hủy bất kỳ dữ liệu nào được liên kết với vùng chứa của bạn
- docker-compose stop
OutputStopping compose-demo_web_1 ... done
Nếu bạn muốn xóa các vùng chứa, mạng và ổ đĩa được liên kết với môi trường được chứa trong vùng chứa này, hãy sử dụng lệnh down
:
- docker-compose down
OutputRemoving compose-demo_web_1 ... done
Removing network compose-demo_default
Lưu ý rằng điều này sẽ không xóa hình ảnh cơ sở được Docker Compose sử dụng để tạo ra môi trường của bạn (trong trường hợp của bạn là nginx:alpine
). Bằng cách này, bất cứ khi nào bạn làm cho môi trường của mình hoạt động trở lại với docker-compose up
, quá trình này sẽ nhanh hơn nhiều vì hình ảnh đã có trên hệ thống của bạn.
Trong trường hợp bạn cũng muốn xóa hình ảnh cơ sở khỏi hệ thống của mình, bạn có thể sử dụng:
- docker image rm nginx:alpine
OutputUntagged: 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ủa chúng tôi về Cách cài đặt và sử dụng Docker để biết chi tiết hơn về các lệnh Docker.
Trong hướng dẫn này, bạn đã thấy cách cài đặt Docker Compose và thiết lập môi trường được chứa trong vùng chứa dựa trên hình ảnh máy chủ web Nginx. Bạn cũng đã thấy cách quản lý môi trường này bằng cách sử dụng lệnh Compose.
Để có tài liệu tham khảo đầy đủ về tất cả các lệnh docker-compose
có sẵn, hãy kiểm tra tài liệu chính thức (official documentation).
Nếu bạn quan tâm đến các cách sử dụng khác của Docker Compose, hãy xem Cách cài đặt WordPress với Docker Compose và cả Cách bảo mật ứng dụng Node.js được chứa bằng Nginx, Let’s Encrypt và Docker Compose.