Cả hai sẽ có thể thực hiện các lệnh trong vùng chứa. Cả hai đều có thể tách hộp đựng.
Vì vậy, sự khác biệt thực sự giữa docker executive và docker đính kèm là gì?
Câu trả lời:
Có một PR cam kết được thêm vào tài liệu:
Lưu ý: Lệnh này (
attach
) không dùng để chạy một tiến trình mới trong vùng chứa. Xem:docker exec
.
Câu trả lời cho " Docker. Làm cách nào để lấy bash \ ssh bên trong vùng chứa đã chạy ( run -d
)? " Minh họa sự khác biệt:
(docker> = 1.3) Nếu chúng ta sử dụng
docker attach
, chúng ta chỉ có thể sử dụng một thể hiện của shell .
Vì vậy, nếu chúng ta muốn mở terminal mới với phiên bản mới của vỏ container, chúng ta chỉ cần chạydocker exec
nếu vùng chứa docker đã được bắt đầu bằng
/bin/bash
lệnh, bạn có thể truy cập nó bằng cách sử dụng đính kèm, nếu không thì bạn cần thực hiện lệnh để tạo một cá thể bash bên trong vùng chứa bằng cách sử dụngexec
.
Như đã đề cập trong vấn đề này :
- Đính kèm không phải để chạy thêm một thứ trong vùng chứa, mà là để gắn vào quá trình đang chạy.
- "
docker exec
" đặc biệt để chạy những thứ mới trong một vùng chứa đã bắt đầu, có thể là một trình bao hoặc một số quy trình khác.
Vấn đề tương tự cho biết thêm:
Mặc dù
attach
không được đặt tên rõ ràng, đặc biệt là vì lệnh LXClxc-attach
(giống hơndocker exec <container> /bin/sh
, nhưng đặc trưng cho LXC), nó có một mục đích cụ thể là gắn bạn theo nghĩa đen vào quá trình Docker bắt đầu.
Tùy thuộc vào quá trình là gì mà hành vi có thể khác nhau , ví dụ: đính kèm vào/bin/bash
sẽ cung cấp cho bạn một trình bao, nhưng việc gắn vào máy chủ redis sẽ giống như bạn vừa bắt đầu trực tiếp redis mà không cần daemonizing.
Khi một vùng chứa được bắt đầu sử dụng / bin / bash thì nó sẽ trở thành PID 1 của vùng chứa và phần đính kèm docker được sử dụng để vào bên trong PID 1 của một vùng chứa. Vì vậy, docker đính kèm <container-id> sẽ đưa bạn vào bên trong thiết bị đầu cuối bash vì đó là PID 1 như chúng tôi đã đề cập khi khởi động vùng chứa. Thoát ra khỏi thùng chứa sẽ dừng thùng chứa.
Trong khi đó trong lệnh thực thi của docker, bạn có thể chỉ định trình bao mà bạn muốn nhập vào. Nó sẽ không đưa bạn đến PID 1 của vùng chứa. Nó sẽ tạo ra một quy trình mới cho bash. docker executive -it <container-id> bash . Việc thoát ra khỏi thùng chứa sẽ không dừng lại.
Bạn cũng có thể sử dụng nsenter để nhập các vùng chứa bên trong. nsenter -m -u -n -p -i -t <pid of container> Bạn có thể tìm PID của container bằng cách sử dụng: docker Check <container-id> | grep PID
Lưu ý: Nếu bạn đã khởi động vùng chứa của mình với cờ -d thì việc thoát ra khỏi vùng chứa sẽ không dừng vùng chứa, cho dù bạn sử dụng tệp đính kèm hay tệp thi hành để vào bên trong.
Như Michael Sun đã nói trong câu trả lời của mình
docker exec
thực hiện một lệnh mới / tạo một quy trình mới trong môi trường của vùng chứa, trong khidocker attach
chỉ kết nối đầu vào / đầu ra / lỗi tiêu chuẩn của quy trình chính (với PID 1) bên trong vùng chứa với đầu vào / đầu ra / lỗi tiêu chuẩn tương ứng của thiết bị đầu cuối hiện tại (thiết bị đầu cuối bạn đang sử dụng để chạy lệnh).
Câu trả lời của tôi sẽ tập trung nhiều hơn vào việc cho phép bạn xác nhận tuyên bố trên và hiểu nó rõ ràng hơn.
Mở cửa sổ dòng lệnh và chạy lệnh docker run -itd --name busybox busybox /bin/sh
. Lệnh sẽ kéo hình ảnh busybox
nếu chưa có. Sau đó, nó sẽ tạo một vùng chứa với tên busybox
bằng hình ảnh này.
Bạn có thể kiểm tra trạng thái của vùng chứa bằng cách chạy lệnh docker ps -a | grep busybox
.
Nếu bạn chạy docker top busybox
, bạn sẽ thấy một kết quả như thế này.
UID PID PPID C STIME TTY TIME CMD
root 7469 7451 0 11:40 pts/0 00:00:00 /bin/sh
Tất nhiên, các PID
, PPID
và các giá trị khác sẽ khác nhau trong trường hợp của bạn. Bạn có thể sử dụng các công cụ và các tiện ích khác cũng như pstree
, top
, htop
để xem danh sách của PID
và PPID
.
Các PID
và PPID
nghĩa id quá trình và quá trình cha mẹ id. Quá trình bắt đầu khi chúng tôi tạo và khởi động vùng chứa của mình bằng lệnh /bin/sh
. Bây giờ, hãy chạy lệnh docker attach busybox
. Thao tác này sẽ đính kèm luồng đầu vào / đầu ra / lỗi tiêu chuẩn của vùng chứa vào thiết bị đầu cuối của bạn.
Sau khi gắn vùng chứa, hãy tạo một phiên trình bao bằng cách chạy lệnh sh
. CTRL-p CTRL-q
Trình tự bấm . Thao tác này sẽ tách thiết bị đầu cuối ra khỏi vùng chứa và sẽ giữ cho vùng chứa hoạt động. Nếu bây giờ bạn sẽ chạy docker top busybox
, bạn sẽ thấy hai quy trình trong danh sách.
UID PID PPID C STIME TTY TIME CMD
root 7469 7451 0 11:40 pts/0 00:00:00 /bin/sh
root 7737 7469 0 11:43 pts/0 00:00:00 sh
Nhưng PPID
hai quy trình sẽ khác nhau. Trên thực tế, PPID
quy trình thứ hai sẽ giống như PID
quy trình đầu tiên. Quy trình đầu tiên hoạt động như quy trình mẹ cho phiên trình bao mà chúng ta vừa tạo.
Bây giờ, chạy docker exec -it busybox sh
. Khi bên trong vùng chứa, hãy kiểm tra danh sách các quy trình đang chạy cho vùng chứa busybox
trong một cửa sổ đầu cuối khác bằng cách chạy lệnh docker top busybox
. Bạn sẽ thấy một cái gì đó như thế này
UID PID PPID C STIME TTY TIME CMD
root 7469 7451 0 11:40 pts/0 00:00:00 /bin/sh
root 7737 7469 0 11:43 pts/0 00:00:00 sh
root 7880 7451 0 11:45 pts/1 00:00:00 sh
Quy PPID
trình đầu tiên và quy trình thứ ba sẽ giống nhau, điều này xác nhận rằng docker exec
tạo ra một quy trình mới trong môi trường của vùng chứa trong khi docker attach
chỉ kết nối đầu vào / đầu ra / lỗi tiêu chuẩn của quy trình chính bên trong vùng chứa với đầu vào / đầu ra / lỗi tiêu chuẩn tương ứng của hiện tại thiết bị đầu cuối.
Docker thực thi một lệnh mới / tạo một quy trình mới trong môi trường của vùng chứa, trong khi docker đính kèm chỉ kết nối đầu vào / đầu ra / lỗi tiêu chuẩn của quy trình chính (với PID 1) bên trong vùng chứa với đầu vào / đầu ra / lỗi tiêu chuẩn tương ứng của hiện tại terminal (thiết bị đầu cuối bạn đang sử dụng để chạy lệnh).
Vùng chứa là một môi trường biệt lập, với một số quy trình đang chạy trong môi trường. Cụ thể, vùng chứa có không gian hệ thống tệp và không gian PID riêng biệt với máy chủ lưu trữ và các vùng chứa khác. Khi vùng chứa được bắt đầu bằng cách sử dụng “docker run –it…”, quá trình chính sẽ có một mã giả và STDIN vẫn mở. Khi được đính kèm ở chế độ tty, bạn có thể tách khỏi vùng chứa (và để nó chạy) bằng cách sử dụng chuỗi khóa có thể định cấu hình. Trình tự mặc định là CTRL-p CTRL-q. Bạn định cấu hình chuỗi khóa bằng tùy chọn --detach-key hoặc tệp cấu hình. Bạn có thể gắn lại vào một thùng chứa rời có gắn docker.
Trình thực thi Docker chỉ bắt đầu một quy trình mới, bên trong môi trường của vùng chứa, tức là thuộc không gian PID của vùng chứa.
Ví dụ: nếu bạn khởi động vùng chứa của mình bằng cách sử dụng “docker run –dit XXX / bin / bash”, bạn có thể đính kèm vào vùng chứa (quy trình chính của) bằng hai thiết bị đầu cuối khác nhau. Trong khi bạn đang nhập vào một thiết bị đầu cuối, bạn có thể thấy nó xuất hiện trong thiết bị đầu cuối kia, vì cả hai thiết bị đầu cuối đều được kết nối với cùng một tty. Hãy cẩn thận rằng bây giờ bạn đang ở trong tiến trình chính của vùng chứa, nếu bạn gõ “exit”, bạn sẽ thoát ra khỏi vùng chứa ( vì vậy hãy cẩn thận, sử dụng phím tách để tách ) và bạn sẽ thấy cả hai thiết bị đầu cuối được thoát ra. Nhưng nếu bạn chạy “docker execute –it XXX / bin / bash” trong hai thiết bị đầu cuối, bạn đã bắt đầu hai quy trình mới bên trong vùng chứa và chúng không liên quan đến nhau và với quy trình chính và bạn có thể thoát khỏi chúng một cách an toàn .
nsenter
. Bạn có thể xây dựng? Giải thích các tùy chọn sẽ theo thứ tự. Tại sao không nhập tất cả các không gian tên? Tại sao lại là những cái cụ thể này?