Sự khác biệt giữa Chạy và Bắt đầu một Docker container


307

Trong thực tế để bắt đầu một container tôi làm:

docker run a8asd8f9asdf0

Nếu đó là trường hợp, những gì:

docker start

làm gì

Trong hướng dẫn sử dụng có ghi

Bắt đầu một hoặc nhiều container đã dừng


101
chạy = tạo + bắt đầu
Fumisky Wells

4
Tôi ước gì OP cũng bao gồm cả 'thực thi'
Monica Heddneck


@MonicaHeddneck Có docker execute?
Koray Tugay

Bạn sử dụng start to một container, nếu trước đó bạn đã dừng container này. Bạn sử dụng chạy đến một hình ảnh, nếu bạn ealier đã loại bỏ một thùng chứa hình ảnh này. Đây là cách sử dụng cơ bản tôi nghĩ.
CodeSlave

Câu trả lời:


350

Đây là một câu hỏi rất quan trọng và câu trả lời rất đơn giản, nhưng cơ bản:

  1. Chạy: tạo một thùng chứa mới của hình ảnh và thực hiện vùng chứa. Bạn có thể tạo N bản sao của cùng một hình ảnh. Lệnh này là: docker run IMAGE_ID và không docker run CONTAINER_ID

nhập mô tả hình ảnh ở đây

  1. Bắt đầu: Khởi chạy một container đã dừng trước đó. Ví dụ: nếu bạn đã dừng cơ sở dữ liệu bằng lệnh docker stop CONTAINER_ID, bạn có thể khởi chạy lại cùng một vùng chứa với lệnh docker start CONTAINER_IDvà dữ liệu và cài đặt sẽ giống nhau.

nhập mô tả hình ảnh ở đây


1
Có một khối lượng cần phải được tạo cho bộ chứa đã dừng để dữ liệu tồn tại không?
Logan Phillips

@LoganPhillips Vòng đời khác biệt giữa các tập tin văn bản mặc định container của công đoàn lớp hệ thống tập tin và các tập tin ghi vào khối lượng là: Dữ liệu lớp đoàn hệ thống tập tin chứa được luôn bị mất khi tháo container ( docker rm container_id). Mặt khác, khối lượng dữ liệu tồn tại loại bỏ -vngăn chặn trừ khi tùy chọn được cung cấp rõ ràng trên dòng lệnh. Vị trí khối lượng trên hệ thống máy chủ có thể được kiểm tra trực tiếp. Xem bài viết này
Stphane

Về quy trình, cần & ở cuối rundòng lệnh? Tôi cần dịch vụ này như một dịch vụ quan trọng (24 giờ)
Peter Krauss

Vậy mục đích của "docker tạo" là gì? Làm thế nào / khi nào sẽ được sử dụng?
Joseph Gagnon

100
  • runchạy một hình ảnh
  • startbắt đầu một thùng chứa .

Các docker runtài liệu có đề cập:

Đầu docker runtiên, lệnh tạo một lớp chứa có thể ghi trên hình ảnh được chỉ định, sau đó khởi động nó bằng lệnh được chỉ định.

Đó là, docker run tương đương với API /containers/createrồi /containers/(id)/start.

Bạn không chạy một container hiện có, bạn docker thực thi nó (kể từ docker 1.3) .
Bạn có thể khởi động lại một container đã thoát .


@Tarik bạn không phải thêm -ivào docker runcho một quá trình tương tác? Ý tôi là, docker run cần một hình ảnh để chạy một container.
VonC

10
Dường như có một căn phòng để ai đó viết một câu trả lời công phu hơn. Câu trả lời không có vẻ giải thích lắm.
qartal

4
Câu hỏi tiếp theo đối với tôi là whats-the-sự khác biệt giữa một container-và-một-hình ảnh stackoverflow.com/questions/21498832/
Kẻ

18

Giải thích với một ví dụ:

Xem xét bạn có một hình ảnh trò chơi (iso) trong máy tính của bạn.

Khi bạn run(gắn hình ảnh của mình dưới dạng ổ đĩa ảo), một ổ đĩa ảo được tạo với tất cả nội dung trò chơi trong ổ đĩa ảo và tệp cài đặt trò chơi sẽ tự động được khởi chạy. [Chạy hình ảnh docker của bạn - tạo một thùng chứa và sau đó bắt đầu nó.]

Nhưng khi bạn stop(tương tự như docker dừng), ổ đĩa ảo vẫn tồn tại nhưng dừng tất cả các quy trình. [Khi container tồn tại cho đến khi nó không bị xóa]

Và khi bạn làm start(tương tự như docker start), từ ổ đĩa ảo, các tệp trò chơi sẽ bắt đầu thực thi. [bắt đầu container hiện có]

Trong ví dụ này - Hình ảnh trò chơi là hình ảnh Docker của bạn và ổ đĩa ảo là thùng chứa của bạn.


8

Câu trả lời của daniele3004 đã khá tốt.

Chỉ là một công thức nhanh chóng và bẩn thỉu cho những người như tôi, những người pha trộn runvà thỉnh startthoảng:

docker run [...]= docker pull [...]+docker start [...]


2
Điều này hoàn toàn không đúng. Theo tài liệu chính thức, "...docker run is equivalent to the API /containers/create then /containers/(id)/start.(nguồn: docs.docker.com/engine/reference/commandline/run )
sshh

2

runlệnh tạo một container từ hình ảnh và sau đó bắt đầu quá trình root trên container này. Chạy nó với run --rmcờ sẽ giúp bạn tránh được những rắc rối trong việc loại bỏ container chết vô dụng sau đó và sẽ cho phép bạn bỏ qua sự tồn tại docker startdocker removehoàn toàn.

nhập mô tả hình ảnh ở đây

run lệnh thực hiện một số điều khác nhau:

docker run --name dname image_name bash -c "whoami"
  1. Tạo một Container từ hình ảnh. Tại thời điểm này, container sẽ có id, có thể có tên nếu được đặt, sẽ hiển thị trongdocker ps
  2. Bắt đầu / thực hiện quá trình root của container. Trong đoạn mã trên sẽ thực thi bash -c "whoami". Nếu một người chạy docker run --name dname image_namemà không có lệnh để thực thi container sẽ chuyển sang trạng thái dừng ngay lập tức.
  3. Khi quá trình root kết thúc, container bị dừng lại. Tại thời điểm này, nó là khá nhiều vô dụng. Người ta không thể thực hiện bất cứ điều gì nữa hoặc hồi sinh container. Về cơ bản có 2 cách thoát khỏi trạng thái dừng: loại bỏ container hoặc tạo một điểm kiểm tra (tức là một hình ảnh) ra khỏi container bị dừng để chạy một cái gì đó khác. Người ta phải chạy docker removetrước khi tung ra container dưới cùng tên.

Làm thế nào để loại bỏ container một khi nó được dừng tự động? Thêm một--rmcờ để rarunlệnh:

docker run --rm --name dname image_name bash -c "whoami"

Làm thế nào để thực thi nhiều lệnh trong một container? Bằng cách ngăn chặn quá trình gốc đó khỏi chết. Điều này có thể được thực hiện bằng cách chạy một số lệnh vô dụng khi bắt đầu với--detachedcờ và sau đó sử dụng "thực thi" để chạy các lệnh thực tế:

docker run --rm -d --name dname image_name tail -f /dev/null
docker exec dname bash -c "whoami"
docker exec dname bash -c "echo 'Nnice'"

Tại sao chúng ta cần docker stopsau đó? Để ngăn chặn thùng chứa còn sót lại này mà chúng tôi đã khởi chạy trong đoạn mã trước với lệnh vô tậntail -f /dev/null.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.