Docker - Kapsayıcı çalışmıyor


92

Ben docker için tamamen acemiyim. Aşağıdaki gibi çıkmış bir konteyner başlatmaya çalıştım,

  1. Kullanılabilir tüm kapları listeledim docker ps -a. Aşağıdakileri listeledi:

    docker tüm görüntüleri listele

  2. Çıkış aşamasındaki konteyneri başlatmak ve o görüntünün terminaline girmek için aşağıdaki komutları girdim.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Aşağıdaki hatayı atıyor.

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

Ama konteyneri kullanmaya başladığımda docker start 79b3fa70b51d. Kapsayıcı kimliğini çıktı olarak atar; bu, her şeyin normal çalışmasına sahipse normaldir. Bu hataya neyin sebep olduğundan emin değilim. Bunun nedenleri ve önerileri hakkında herhangi bir fikir bana çok yardımcı olacaktır. Şimdiden teşekkürler.


7
Merhaba, Lütfen bu sorunu nasıl çözdüğünüzü açıklar mısınız? Korkarım aşağıdaki cevap pek bir anlam ifade etmiyor
JayPex

4
@ApexFred, Docker kapsayıcıları VM'ler gibi değildir; bir uygulamayı çalıştırmak için tasarlanmıştır. Uygulama sona erdiğinde, kapsayıcı da sona erer. Bu durumda, kullanıcı kapsayıcı için "uygulamayı" "echo" komutuna ayarlamıştır. "Echo" komutu bir yankı gerçekleştirdiğinden ve ardından sona erdiğinden, konteyner de komutla sona erer. Konteyneri yeniden başlatırsa, yankıyı gerçekleştirir ve tekrar sona erer. EXEC komutu çalışan bir kapsayıcı gerektirir. Konteyner sonlandırıldığı için ek komutlar çalıştırmak için kullanılamaz.
duct_tape_coder

Yanıtlar:


31

Kapsayıcı 79b3fa70b51dyalnızca bir echo.

Bu, başlar, yankı yapar ve ardından hemen çıkar.

Bir sonraki docker execkomut , kendisini o konteynere eklemek ve herhangi bir komutu yürütmek için çalıştığını bulmayacaktır: çok geç. Konteyner zaten çıktı.

docker execKomut çalışan bir kapta yeni bir komutu çalıştırır.

Kullanılmaya başlanan komut docker execyalnızca konteynerin birincil işlemi (PID 1) çalışırken çalışacaktır.


1
Hey VonC, yorumunuz için teşekkürler. Görüntünün terminaline nasıl girebilirim?
Stranger

3
@Udhayakumar Bir docker run -it --rm udhayakumar/busyboxwithtouchseansı açmak için basit bir yeterli olmalıdır. Varsayılan giriş noktası / bin / sh olmalıdır, ancak Dockerfile'ınıza bağlıdır: farklı bir giriş noktası ve / veya farklı bir CMD tanımlamış olabilirsiniz.
VonC

51
Merhaba, Lütfen bu sorunu nasıl çözdüğünüzü açıklar mısınız? Korkarım bu cevap pek bir anlam ifade etmiyor
JayPex

2
@Jawad busyboxwithtouch'ı herhangi bir parametre olmadan çalıştırarak, varsayılan olarak etkileşimli kabuğa (hemen çıkmaz). Bu, daha sonra ( docker exec) ekleyebileceğiniz anlamına gelir .
VonC

62

Varsayılan olarak, kapsayıcıda çalışan herhangi bir göreviniz yoksa docker kapsayıcısı hemen çıkar.

Konteynerin arka planda çalışmasını sağlamak için, --detach(veya -d) argümanıyla çalıştırmayı deneyin .

Örneğin:

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:/# 

Cevap bu olmalı, harika.
MY

22

Ana işlemi yeniden başlatmak mümkün değilse (yeterince uzun süre), commitkonteynerin yeni bir görüntüye geçme ve bu görüntüden yeni bir kap çalıştırma olasılığı da vardır . Bu her zamanki en iyi uygulama iş akışı olmasa da , arada bir başarısız olan bir komut dosyasında hata ayıklamayı gerçekten yararlı buluyorum.

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:/#

Aynı adımı izledim, ancak yeni oluşturulan konteynere daha önce erişilebilen tarayıcıdan erişilemiyor
Muhammad Muazzam

1
Lütfen komutun bashkapsayıcıda bir işlem başlattığını unutmayın . Muhtemelen daha önce çalışan bir web sunucunuz vardı, bu nedenle sunucuyu geri getirmek için hangi komutun kullanılması gerektiğini kontrol etmeniz gerekecektir.
Matthias Kuhn

10

Öncelikle docker konteynerini başlatmalıyız

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

                        3a19b39ea021

Bundan sonra, docker konteynerini kontrol edin:

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

Ardından aşağıdaki komutu kullanarak yürütün:

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

root@3a19b39ea021:/# 

Cevabınızı açıklamaya yardımcı olacak bir metin eklemek faydalı olacaktır.
Lauren Van Sloun

9

Bu, komut dosyasının istekleri bekleyen bir hizmet başlatmadığı görüntülerde olur , bu nedenle, komut dosyasının sonunda kap çıkar.

Bu tipik olarak çoğu temel işletim sistemi görüntüsünde (centos, debian, vb.) Veya ayrıca düğüm görüntülerinde geçerlidir.

En iyi bahsiniz, görüntüyü etkileşimli modda çalıştırmaktır . Düğüm görüntüsü ile aşağıdaki örnek :

docker run -it node /bin/bash

Çıktı

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

5

İşte benim için işe yarayan şey.

Kapsayıcı kimliğini alın ve yeniden başlatın.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


3

Nedeni, kabul edilen cevabın söylediği şeydir. Bu sorunla ilgili daha iyi bir anlayış sağlayabilecek bazı ekstra bilgiler ekliyorum.

  1. Bir kabın durumu içerir Created, Running, Stopped, Exited, Deadve diğerleri ben biliyorum.
  2. docker createDocker daemon'u çalıştırdığımızda , durumuyla bir konteyner oluşturacaktır Created.
  3. docker startDocker daemon ne zaman , durumu Createdveya Stopped.
  4. docker runDocker daemon çalıştırdığımızda iki adımda bitirecek: docker createve docker start.
  5. docker stopDocker daemon bir kapsayıcıyı durduracağı zaman . Böylece konteyner Stoppedstatüsünde olacaktır.
  6. En önemlisi, bir konteyner aslında içinde uzun bir süreç barındırdığını hayal ediyor. Süreç çıktığı zaman, konteyner tutma süreci de çıkacaktır. Böylece bu konteynerin durumu olacaktır Exited.

İşlem ne zaman sona eriyor? Başka bir deyişle, süreç nedir, nasıl başladık?
Cevap CMDbir dockerfile veya commandaşağıdaki ifadede, bashbazı görüntülerde varsayılan olarak, yani ubutu: 18.04'tür.

docker run ubuntu:18.04 [command]

3

docker run -it <image_id> /bin/bash

Etkileşimli modda çalıştırıp ardından bash kabuğunu çalıştırır


1
-dBayrağın burada bir yazım hatası olduğunu düşünüyorum.

2

Dockerfile kullanarak benzer bir şey deneyen herkes için ...

Bağımsız modda çalıştırmak yardımcı olmaz. Komut engellemiyorsa konteyner her zaman çıkar (çalışmayı durdurur), bash ile durum budur.

Bu durumda, bir geçici çözüm şu şekilde olacaktır: 1. Ortaya çıkan görüntüyü işleyin: (kapsayıcı_adı = görüntüyü temel almak istediğiniz kabın adı, görüntü_adı = oluşturulacak görüntünün adı docker kaydetme kapsayıcı_adı görüntü_adı 2. Kullan docker, çalıştırmak istediğiniz komutu belirterek, yeni imajı kullanarak yeni bir konteyner oluşturmak için çalıştırın.Burada, "bash" komutunu çalıştıracağım: docker run -it image_name bash

Bu size aradığınız etkileşimli girişi sağlayacaktır.


1

Docker kapsayıcısı normal bir şekilde çıktığında ve Dockerfile'ı düzenleyebileceğinizde bir çözüm.

Genellikle bir docker container çalıştırıldığında, bir uygulama bir komut çalıştırılarak sunulur. Gönderen Dockerfile referans ,

Hem CMD hem de ENTRYPOINT talimatları, bir konteyner çalıştırılırken hangi komutun yürütüleceğini tanımlar. ... Dockerfile, CMD veya ENTRYPOINT komutlarından en az birini belirtmelidir.

Bir görüntü oluşturduğunuzda ve CMD veya ENTRYPOINT ile herhangi bir komut belirtmediğinizde, temel görüntünün CMD veya ENTRYPOINT komutu yürütülür.

Örneğin, Resmi Ubuntu Dockerfile'da CMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ) vardır. Şimdi, bin/bash/komut girişi kabul edebilir ve docker run -it IMAGE_IDkomut STDIN'i kaba ekler. Sonuç, etkileşimli bir terminal elde edersiniz ve konteyner çalışmaya devam eder.

Dockerfile'da CMD veya ENTRYPOINT ile bir komut belirtildiğinde, bu komut konteyner çalıştırılırken yürütülür. Şimdi, bu komut herhangi bir giriş gerektirmeden bitirebilirse, bitecek ve konteyner çıkacaktır. docker run -it IMAGE_IDolacak DEĞİL bu durumda interaktif terminali sağlamaktadır. Bir örnek, aşağıdaki Dockerfile'dan oluşturulan docker görüntüsü olabilir.

FROM ubuntu
ENTRYPOINT echo hello 

Bu görüntünün terminaline gitmeniz gerekiyorsa, giriş noktası komutunu değiştirerek kabı çalışır durumda tutmanız gerekecektir.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Konteyneri normal olarak çalıştırdıktan sonra docker run IMAGE_ID, başka bir terminale gidip docker exec -it CONTAINER_ID bashkonteynırın terminalini almak için kullanabilirsiniz .


"ve Dockerfile'ı düzenleyebilirsiniz": burada anahtar nokta. Olumlu oy verildi.
VonC

0

Benim durumumda, Dockerfile'ın ana dizininin belirli dosya adlarını ve dizin adlarını değiştirdim. Hangi konteynerin tekrar başlatmak için gerekli parametreleri bulamaması nedeniyle.

Orijinal isimleriyle yeniden adlandırdıktan sonra, kap tereyağı gibi başladı.


0

Bu konuda farklı bir görüşüm var. Yapabilirim docker psve çalışan bir docker konteyner olduğunu görebilirdim, onu yeniden başlatmayı bile denedim, ancak bunun için bir oturum almaya çalıştığım anda New-PSSession -ContainerId $containerId -RunAsAdministratorHata oluştu:

## [error] New-PSSession: Girdi ContainerId xxx mevcut değil, ## [error] veya ilgili kapsayıcı çalışmıyor.

Benim sorunum, ağ hizmetiyle çalışıyordum ve ona docker komutlarını çalıştırma izni vermiş olmama rağmen kabı görmek için yeterli izne sahip değildi (docker güvenlik grubu yapılandırmasıyla)

Kapsayıcılarla çalışmayı nasıl etkinleştireceğimi bilmiyordum, bu yüzden onu yönetici kullanıcı olarak çalıştırmaya geri dönmek zorunda kaldım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.