Docker - Vùng chứa không chạy


90

Tôi hoàn toàn là một người mới cập bến. Tôi đã cố gắng khởi động một vùng chứa đã thoát như sau,

  1. Tôi đã liệt kê tất cả các thùng chứa có sẵn bằng cách sử dụng docker ps -a. Nó liệt kê những điều sau:

    docker liệt kê tất cả hình ảnh

  2. Tôi đã nhập các lệnh sau để bắt đầu vùng chứa đang ở giai đoạn thoát và nhập vào phần cuối của hình ảnh đó.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Nó đang ném lỗi sau.

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

Nhưng khi tôi bắt đầu sử dụng vùng chứa docker start 79b3fa70b51d. Nó ném ID vùng chứa dưới dạng đầu ra là bình thường nếu nó có mọi thứ hoạt động bình thường. Tôi không chắc điều gì gây ra lỗi này. Bất kỳ ý tưởng nào về nguyên nhân và đề xuất về điều này sẽ rất hữu ích cho tôi. Cảm ơn trước.


7
Xin chào, Bạn có thể vui lòng giải thích cách bạn giải quyết vấn đề này không. Tôi sợ câu trả lời dưới đây không làm cho một rất nhiều ý nghĩa
JayPex

4
@ApexFred, Docker container không giống như VM; chúng được thiết kế để chạy một ứng dụng. Khi ứng dụng kết thúc, vùng chứa cũng vậy. Trong trường hợp này, người dùng đã đặt "ứng dụng" cho vùng chứa thành lệnh "echo". Bởi vì lệnh "echo" thực hiện một tiếng vọng và sau đó kết thúc, vùng chứa cũng kết thúc bằng lệnh. Nếu anh ta khởi động lại vùng chứa, nó sẽ thực hiện tiếng vọng và lại kết thúc. Lệnh EXEC yêu cầu một vùng chứa đang chạy. Bởi vì vùng chứa đã kết thúc, nó không thể được sử dụng để chạy các lệnh bổ sung.
duct_tape_coder

Câu trả lời:


31

Container 79b3fa70b51ddường như chỉ làm một echo.

Điều đó có nghĩa là nó bắt đầu, vang vọng và sau đó thoát ra ngay lập tức.

Tiếp theo docker execlệnh sẽ không tìm thấy nó chạy để tự gắn vào container và thực hiện bất kỳ lệnh: nó là quá muộn. Vùng chứa đã thoát.

Các docker execlệnh chạy một lệnh mới trong một container chạy.

Lệnh bắt đầu sử dụng docker execsẽ chỉ chạy trong khi quá trình chính của vùng chứa (PID 1) đang chạy


1
Này VonC, cảm ơn vì nhận xét của bạn. Làm thế nào tôi có thể đạt được để đi vào thiết bị đầu cuối của hình ảnh?
Stranger

3
@Udhayakumar Chỉ docker run -it --rm udhayakumar/busyboxwithtouchcần đơn giản là đủ để mở một phiên. Điểm nhập mặc định phải là / bin / sh, nhưng nó phụ thuộc vào Dockerfile của bạn: bạn có thể đã xác định một điểm nhập khác và / hoặc một CMD khác.
VonC

51
Xin chào, Bạn có thể vui lòng giải thích cách bạn giải quyết vấn đề này không. Tôi sợ câu trả lời này không làm cho một rất nhiều ý nghĩa
JayPex

2
@Jawad Bằng cách chạy busyboxwithtouch mà không có bất kỳ tham số nào, nó mặc định là shell tương tác (không thoát ngay lập tức). Điều đó có nghĩa là sau này bạn có thể docker execđính kèm ( ) vào nó.
VonC

61

Theo mặc định, vùng chứa docker sẽ thoát ngay lập tức nếu bạn không có bất kỳ tác vụ nào đang chạy trên vùng chứa.

Để giữ cho vùng chứa chạy trong nền, hãy thử chạy nó với đối số --detach(hoặc -d).

Ví dụ như:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 

22

Nếu không thể bắt đầu lại quá trình chính (trong thời gian đủ lâu), thì cũng có khả năng chuyển commitvùng chứa sang một hình ảnh mới và chạy vùng chứa mới từ hình ảnh này. Mặc dù đây không phải là quy trình thực hành tốt nhất thông thường , nhưng tôi thấy việc gỡ lỗi tập lệnh bị lỗi đôi khi thực sự hữu ích.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#

Tôi đã làm theo bước tương tự nhưng vùng chứa mới được tạo không thể truy cập được từ trình duyệt có thể truy cập trước đó
Muhammad Muazzam

1
Xin lưu ý rằng lệnh khởi chạy một bashquy trình trong vùng chứa. Có thể trước đây bạn đã từng chạy một máy chủ web nên bạn sẽ phải kiểm tra lệnh nào cần được sử dụng để đưa máy chủ hoạt động trở lại.
Matthias Kuhn

10

Trước hết, chúng ta phải khởi động bộ chứa docker

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

Sau đó, hãy kiểm tra vùng chứa docker:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

Sau đó thực hiện bằng cách sử dụng lệnh dưới đây:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 

Sẽ rất hữu ích nếu thêm văn bản giúp giải thích câu trả lời của bạn.
Lauren Van Sloun,

9

Điều này xảy ra với các hình ảnh mà tập lệnh không khởi chạy một dịch vụ đang chờ yêu cầu , do đó vùng chứa sẽ thoát ra ở cuối tập lệnh.

Điều này thường xảy ra với hầu hết các hình ảnh hệ điều hành cơ sở (centos, debian, v.v.), hoặc với các hình ảnh nút .

Đặt cược tốt nhất của bạn là chạy hình ảnh ở chế độ tương tác . Ví dụ bên dưới với hình ảnh nút :

docker run -it node /bin/bash

Đầu ra là

root@cacc7897a20c:/# echo $SHELL
/bin/bash

5

Đây là những gì đã làm việc cho tôi.

Nhận ID vùng chứa và khởi động lại.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

3

Lý do chỉ là những gì câu trả lời được chấp nhận đã nói. Tôi thêm một số thông tin bổ sung, có thể cung cấp hiểu biết thêm về vấn đề này.

  1. Tình trạng của một container bao gồm Created, Running, Stopped, Exited, Deadvà những người khác như tôi biết.
  2. Khi chúng ta thực thi docker create, trình nền docker sẽ tạo một vùng chứa với trạng thái của nó là Created.
  3. Khi nào docker start, trình nền docker sẽ bắt đầu một vùng chứa hiện có mà trạng thái của nó có thể là Createdhoặc Stopped.
  4. Khi chúng tôi thực thi docker run, trình nền docker sẽ hoàn thành nó theo hai bước: docker createdocker start.
  5. docker stopRõ ràng là khi nào , trình nền docker sẽ dừng một vùng chứa. Do đó vùng chứa sẽ ở Stoppedtrạng thái.
  6. Đến điều quan trọng nhất, một container thực sự tưởng tượng rằng chính nó đang giữ một quá trình lâu dài trong đó. Khi quá trình thoát, quá trình giữ vùng chứa cũng sẽ thoát. Vì vậy, trạng thái của vùng chứa này sẽ là Exited.

Khi nào quá trình thoát? Nói cách khác, quá trình này là gì, chúng ta đã bắt đầu nó như thế nào?
Câu trả lời nằm CMDtrong tệp dockerfile hoặc commandtrong biểu thức sau, bashtheo mặc định trong một số hình ảnh, tức là ubutu: 18.04.

docker run ubuntu:18.04 [command]


2

Đối với bất kỳ ai đang cố gắng làm điều gì đó tương tự bằng Dockerfile ...

Chạy ở chế độ tách rời sẽ không giúp ích gì. Vùng chứa sẽ luôn thoát (ngừng chạy) nếu lệnh không chặn, đây là trường hợp của bash.

Trong trường hợp này, cách giải quyết sẽ là: 1. Cam kết hình ảnh kết quả: (container_name = tên của vùng chứa bạn muốn làm cơ sở cho hình ảnh, image_name = tên của hình ảnh được tạo docker commit container_name image_name 2. Sử dụng docker run để tạo vùng chứa mới bằng cách sử dụng hình ảnh mới, chỉ định lệnh bạn muốn chạy. Ở đây, tôi sẽ chạy "bash": docker run -it image_name bash

Điều này sẽ giúp bạn có được thông tin đăng nhập tương tác mà bạn đang tìm kiếm.


2

docker run -it <image_id> /bin/bash

Chạy trong chế độ tương tác thực thi sau đó bash shell


1
Tôi nghĩ rằng -dlá cờ là một lỗi chính tả ở đây?
đối tượng Object

1

Đây là giải pháp khi vùng chứa docker thoát bình thường và bạn có thể chỉnh sửa Dockerfile.

Nói chung, khi một bộ chứa docker được chạy, một ứng dụng sẽ được phục vụ bằng cách chạy một lệnh. Từ tham chiếu Dockerfile ,

Cả lệnh CMD và ENTRYPOINT đều xác định lệnh nào được thực thi khi chạy một vùng chứa. ... Dockerfile nên chỉ định ít nhất một trong các lệnh CMD hoặc ENTRYPOINT.

Khi bạn xây dựng một hình ảnh và không chỉ định bất kỳ lệnh nào với CMD hoặc ENTRYPOINT, lệnh CMD hoặc ENTRYPOINT của hình ảnh cơ sở sẽ được thực thi.

Ví dụ: Dockerfile Ubuntu chính thức có CMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ). Bây giờ, bin/bash/lệnh có thể chấp nhận đầu vào và docker run -it IMAGE_IDlệnh gắn STDIN vào vùng chứa. Kết quả là bạn nhận được một thiết bị đầu cuối tương tác và vùng chứa tiếp tục chạy.

Khi một lệnh với CMD hoặc ENTRYPOINT được chỉ định trong Dockerfile, lệnh này sẽ được thực thi khi chạy vùng chứa. Bây giờ, nếu lệnh này có thể kết thúc mà không yêu cầu bất kỳ đầu vào nào, nó sẽ kết thúc và vùng chứa sẽ thoát. docker run -it IMAGE_IDsẽ KHÔNG cung cấp thiết bị đầu cuối tương tác trong trường hợp này. Một ví dụ sẽ là hình ảnh docker được xây dựng từ Dockerfile bên dưới-

FROM ubuntu
ENTRYPOINT echo hello 

Nếu bạn cần đi đến phần cuối của hình ảnh này, bạn sẽ cần giữ cho vùng chứa hoạt động bằng cách sửa đổi lệnh entrypoint.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Sau khi chạy container một cách bình thường docker run IMAGE_ID, bạn có thể đi đến một terminal khác và sử dụng docker exec -it CONTAINER_ID bashđể lấy terminal của container.


"và bạn có thể chỉnh sửa Dockerfile": điểm chính ở đây. Đã ủng hộ.
VonC

0

Trong trường hợp của tôi, tôi đã thay đổi một số tên tệp và tên thư mục của thư mục mẹ của Dockerfile. Do vùng chứa nào không tìm thấy các thông số cần thiết để khởi động lại.

Sau khi đổi tên nó trở lại những cái tên ban đầu, container bắt đầu như bơ.


0

Tôi có một cách khác về việc này. Tôi có thể làm docker psvà thấy rằng có một bộ chứa docker đang chạy, tôi thậm chí đã cố gắng khởi động lại nó, nhưng ngay sau khi tôi cố gắng tạo một phiên cho nó với New-PSSession -ContainerId $containerId -RunAsAdministratorNó sẽ lỗi, nói:

## [error] New-PSSession: ContainerId xxx đầu vào không tồn tại, ## [error] hoặc vùng chứa tương ứng không chạy.

Vấn đề của tôi là tôi đang chạy với dịch vụ mạng và nó không có đủ quyền để xem vùng chứa, mặc dù tôi đã cấp cho nó quyền để chạy các lệnh của docker (với cấu hình nhóm bảo mật của docker)

Tôi không biết cách bật làm việc với vùng chứa, vì vậy tôi phải quay lại chạy nó với tư cách người dùng quản trị viên

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.