Làm cách nào để tiếp tục một Docker container đã thoát


263

Xem xét:

docker run -it centos /bin/bash

Tôi nhấn Ctrl+ Dđể thoát nó.

Tôi muốn tiếp tục chạy container này, nhưng tôi thấy tôi không thể.

Phương pháp duy nhất là

docker commit `docker ps -q -l` my_image
docker run -it my_image /bin/bash

Tôi có đúng không Có một phương pháp tốt hơn? (Tôi đang sử dụng docker 0.8.0.)


1
Bạn đã thử gán tên cho container và sử dụng tên đó để điều khiển nó chưa? Nhân tiện, bằng cách "thoát khỏi nó", bạn có nghĩa là tách ra khỏi nó, phải không?
Eric Platon

12
Docker một công cụ để lập trình, ít nhất đó là cách tôi sử dụng nó. Nếu đa số không đồng ý, thì ai đó nên nói với Docker không trỏ đến StackOverflow như một nơi để đặt câu hỏi. Tôi chắc chắn đây không phải là câu hỏi giống như "DevOps" đầu tiên có thể đi đến đây hoặc SuperUser.
Ted M. Young

5
Docker là một công cụ phát triển. Nó đã là một thẻ 'docker' ở đây. Vì vậy, tôi nghĩ rằng nó là thích hợp để hỏi trong stackoverflow. Tôi sử dụng nó để xây dựng hình ảnh đòi hỏi xây dựng từ môi trường sạch.
Daniel YC Lin

6
Tôi muốn những người đã gắn thẻ này là "lạc đề" sẽ giải thích lý do tại sao!
jpetazzo

2
Để hỗ trợ câu hỏi này vì không lạc đề: meta.stackoverflow.com/q/276579/210336meta.stackoverflow.com/q/271279/210336 .
Matthijs Wessels

Câu trả lời:


291

Bạn có thể khởi động lại một container hiện có sau khi nó thoát và các thay đổi của bạn vẫn còn đó.

docker start  `docker ps -q -l` # restart it in the background
docker attach `docker ps -q -l` # reattach the terminal & stdin

3
tóm tắt dưới dạng một dòng: docker start `docker ps -q -l` && docker attach `docker ps -q -l`
Daniel YC Lin

7
Để tóm tắt như một dòng : docker start -i $(docker ps -q -l). ;-) Đặt tên có thể giúp kiểm soát tốt hơn container nào được chọn. -lcuối cùng, ok ...
Eric Platon

103
Đối với những người mới sử dụng Linux, `docker ps -q -l`bit là một bản mở rộng. Nó sẽ được thay thế bằng id của container docker (-l) cuối cùng được tạo. -q chỉ đơn thuần ngăn chặn thông tin khác (giường ngủ id) thường xuất ra bởi `docker ps`. ---- lưu ý: Backtick không phải là một dấu hiệu trích dẫn, nó có một ý nghĩa rất đặc biệt. Tất cả mọi thứ bạn nhập giữa backticks đều được đánh giá (thực thi) bởi shell trước lệnh chính - unix.stackexchange.com/questions/27428/ trên
bnieland

1
Tôi đã tìm thấy container đi vào một trạng thái được gọi là Created...từ đó nó không thể được bắt đầu bằng a docker start .... Tuy nhiên, nó có thể được khởi động lại bằng cách sử dụngdocker restart ...
Voltaire

2
Lưu ý: -lchỉ nhận được docker "mới nhất". Nếu bạn giống tôi và docker ps -athể hiện nhiều hơn một điều mà bạn cần khởi động, thì bạn có thể khởi động lại "tất cả" (-a) trong số đó bằng cách thay đổi lệnh ở trên thành docker start `docker ps -q -a`. -qchỉ làm cho nó "yên lặng" (không đăng nhập đầu ra).
Rock Lee

148
docker start -a -i `docker ps -q -l`

Giải trình:

docker startbắt đầu một container (yêu cầu tên hoặc ID)
-ađính kèm với
-ichế độ tương tác của
docker pscontainer Danh sách các container
-qchỉ
-lliệt kê danh sách các container của container


docker ps -q -l, Nó cung cấp ID Container của cái được tạo cuối cùng ngay cả khi nó ở trạng thái bắt đầu.
Dharmang

cái gọi là "đính kèm" vào container là gì? "Đính kèm"?
skytree

49

Sử dụng:

docker start $(docker ps -a -q --filter "status=exited")

Điều này sẽ bắt đầu tất cả các container đang ở trạng thái thoát.

docker exec -it <container-id> /bin/bash

Điều này sẽ kết nối với các container cụ thể.


2
Tôi thấy đây là người duy nhất làm việc cho tôi .. do dòng thứ hai quan trọng đó. docker exec -it <container id> /bin/bash(hoặc chỉ bash).
barlop

Điều này làm việc cho tôi, nhưng tôi đã chạy nó hai lần kể từ khi tôi có hai container. Vì vậy, nếu cái đầu tiên bắt đầu và cái thứ hai bị lỗi. chỉ cần nhấn lại cùng một lệnh và nó sẽ bắt đầu container tiếp theo.
Andrija J Fourkidney

20

Nếu bạn muốn làm điều đó trong nhiều lệnh, dễ nhớ:

  1. danh sách các container bị dừng:

docker ps -a

  1. sao chép tên hoặc id container của container bạn muốn đính kèm và khởi động container với:

docker start -i <name/id>

Các -ilá cờ nói Docker để đính kèm vào stdin của container.

Nếu container không được bắt đầu với trình bao tương tác để kết nối, bạn cần thực hiện việc này để chạy trình bao:

docker start <name/id>
docker exec -it <name/id> /bin/sh

Các /bin/shlà vỏ thường có sẵn với hình ảnh núi cao dựa trên.


Câu trả lời không thể bỏ qua, điều này giúp tôi tìm thấy container mà tôi đang tìm kiếm dễ dàng hơn nhiều so với "câu trả lời" cho câu hỏi này.
nicholas labrecque 17/10/19

3
Error response from daemon: Container <id> is not running
Cerin

14

Nếu bạn muốn tiếp tục chính xác một container Docker với một tên đã biết:

docker start  `docker ps -a -q --filter "name=elas"`

1
cảm ơn @Nelson điều này rất hữu ích cho tôi để bắt đầu
docker

Trong trường hợp này, bạn chỉ có thể chạy docker start <name>trong đó <name> là tên của thùng chứa của bạn. Ít nhất là với docker v19.03.8
Don Foumare

13

Thực hiện theo các bước sau:

  1. Chạy bên dưới lệnh để thấy rằng tất cả các dịch vụ container cả chạy và dừng. Tùy chọn -ađược đưa ra để thấy rằng container cũng dừng lại

    docker ps -a
    
  2. Sau đó bắt đầu bộ chứa docker bằng container_idhoặc tên thẻ container

    docker start <CONTAINER_ID> or <NAMES>
    

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

    Nói từ hình trên, container id 4b161b302337
    Vì vậy, lệnh được chạy là

    docker start 4b161b302337
    
  3. Người ta có thể xác minh xem container có chạy không

    docker ps
    

9

Nếu bạn có một thùng chứa có tên thì nó có thể được bắt đầu bằng cách chạy

docker container start container_name

trong đó container_name là tên của container phải được cung cấp tại thời điểm tạo container. Bạn có thể thay thế container_namebằng id container trong trường hợp container không được đặt tên. ID container có thể được tìm thấy bằng cách chạy:

docker ps -a

5

Các lệnh này sẽ hoạt động cho bất kỳ vùng chứa nào (không chỉ những lệnh thoát cuối cùng). Cách này sẽ hoạt động ngay cả sau khi hệ thống của bạn đã khởi động lại. Để làm như vậy, các lệnh này sẽ sử dụng "id id".

Các bước:

  1. Liệt kê tất cả các docker bằng cách sử dụng lệnh này và lưu ý id container của container bạn muốn khởi động lại: docker ps -a

  2. Bắt đầu container của bạn bằng cách sử dụng id container: docker start <container_id>

  3. Đính kèm và chạy container của bạn: docker attach <container_id>

LƯU Ý: Hoạt động trên linux


1

bằng tên

sudo docker start bob_the_container

hoặc theo Id

sudo docker start aa3f365f0f4e

khởi động lại container này đã dừng, sử dụng -i để đính kèm STDIN của container hoặc thay vì -i bạn có thể đính kèm vào phiên container (nếu bạn chạy với -it)

sudo docker attach bob_the_container

0
docker start `docker ps -a | awk '{print $1}'`

Điều này sẽ khởi động tất cả các container ở trạng thái 'Đã thoát'

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.