Docker Konteynerinde komutları çalıştırmak için docker exec nasıl kullanılır

0 Hisse senetleri
0
0
0
0

giriiş

Docker, geliştiricilerin taşınabilir, Linux uyumlu konteynerler oluşturmasına ve yönetmesine yardımcı olan bir konteynerleştirme aracıdır.

Konteyner geliştirirken veya dağıtırken, mevcut durumunu kontrol etmek veya bir sorunu gidermek için genellikle çalışan bir konteynerin içine bakmanız gerekir. Bu amaçla Docker, çalışan konteynerlerdeki uygulamaları çalıştırmak için docker exec komutunu sağlar.

Bu eğitimde, `docker exec` komutunu ve bu komutu kullanarak Docker konteynerinde komut çalıştırmayı ve etkileşimli bir kabuk elde etmeyi öğreneceğiz.

Ön koşullar

Bu eğitim, Docker'ı zaten yüklediğinizi ve kullanıcınızın Docker'ı çalıştırma iznine sahip olduğunu varsayar. Docker'ı kök kullanıcı olarak çalıştırmanız gerekiyorsa, lütfen bu eğitimdeki komutlara sudo eklemeyi unutmayın.

Bir test konteyneri başlatılıyor.

Docker exec komutunu kullanmak için çalışan bir Docker konteynerine ihtiyacınız var. Henüz bir konteyneriniz yoksa, aşağıdaki docker exec komutuyla bir test konteyneri başlatın:

docker run -d --name container-name alpine watch "date >> /var/log/date.log"

Bu komut, resmi Alpine imajından yeni bir Docker konteyneri oluşturur. Bu, hafif ve minimal bir Linux dağıtımı olan Alpine Linux kullanan popüler bir Linux konteyner imajıdır.

-d parametresini kullanarak konteyneri terminalden ayırıp arka planda çalıştırıyoruz. --name container-name parametresi konteynere isim veriyor. Burada istediğiniz ismi seçebilir veya Docker'ın yeni konteyner için otomatik olarak benzersiz bir isim oluşturması için bu seçeneği tamamen atlayabilirsiniz.

Daha sonra, konteyner için kullanmak istediğimiz görüntüyü belirten alpine'e sahibiz.

Son olarak, "date >> /var/log/date.log" komutumuz var. Bu, konteynerde çalıştırmak istediğimiz komut. Varsayılan olarak, saat verdiğiniz komutu iki saniyede bir çalıştıracaktır. Bu durumda saatin çalıştıracağı komut date >> /var/log/date.log'dur. date, geçerli tarih ve saati şu şekilde yazdırır:

OutputFri Jul 23 14:57:05 UTC 2021

`/var/log/date.log` bölümü, `date` komutunun çıktısını yönlendirir ve `/var/log/date.log` dosyasına ekler. Her iki saniyede bir dosyaya yeni bir satır eklenir ve birkaç saniye sonra dosya şu şekilde görünür:

Output
Fri Jul 23 15:00:26 UTC 2021
Fri Jul 23 15:00:28 UTC 2021
Fri Jul 23 15:00:30 UTC 2021
Fri Jul 23 15:00:32 UTC 2021
Fri Jul 23 15:00:34 UTC 2021

Sonraki adımda, Docker konteynerlerinin adlarını nasıl bulacağımızı öğreneceğiz. Bu, hedeflediğiniz konteynere zaten sahipseniz ancak adından emin değilseniz faydalı olacaktır.

Docker konteyner adını bulma

Çalışmak istediğimiz konteynerin adını (veya konteyner kimliğini) docker exec'e sağlamamız gerekiyor. Bu bilgiyi docker ps komutunu kullanarak bulabiliriz:

docker ps

Bu komut, sunucuda çalışan tüm Docker kapsayıcılarını listeler ve bunlar hakkında bazı üst düzey bilgiler sağlar:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-name

Bu örnekte, kapsayıcı kimliği ve adı vurgulanmıştır. Docker exec'e hangi kapsayıcıyı kullanacağını belirtmek için bunlardan birini kullanabilirsiniz.

Konteynerinizin adını değiştirmek istiyorsanız docker rename komutunu kullanın:

docker rename container-name new-name

Daha sonra, Docker konteynerinde komutları çalıştırmak için docker exec kullanımına ilişkin birkaç örnek çalıştıracağız.

Docker konteynerinde etkileşimli bir kabuk çalıştırma

Docker konteynerinin içinde etkileşimli bir kabuk başlatmanız gerekiyorsa, örneğin dosya sistemini keşfetmek veya çalışan işlemleri hata ayıklamak için, docker exec'i -i ve -t bayraklarıyla kullanın.

-i bayrağı, kapsayıcıya gelen girdiyi açık tutarken, -t bayrağı kabuğun bağlanabileceği bir sözde terminal oluşturur. Bu bayraklar aşağıdaki gibi birleştirilebilir:

docker exec -it container-name sh

Bu komut, belirtilen kapsayıcıda kabuğu çalıştıracak ve size başlangıç kabuk istemini verecektir. Kapsayıcıdan çıkmak için `exit` yazın ve ENTER tuşuna basın:

exit

Eğer konteyner görüntünüz bash gibi daha gelişmiş bir kabuk içeriyorsa, sh'ı yukarıdaki bash ile değiştirebilirsiniz.

Docker konteynerinde etkileşimli olmayan bir komutu çalıştırma

Çalışan bir konteynerin içinde bir komut çalıştırmanız gerekiyorsa, ancak etkileşime girmeniz gerekmiyorsa, herhangi bir bayrak kullanmadan docker exec komutunu kullanın:

docker exec container-name tail /var/log/date.log

Bu komut, container adında tail /var/log/date.log komutunu çalıştıracak ve sonuçları yazdıracaktır. Varsayılan olarak, tail komutu bir dosyanın son on satırını yazdırır. İlk bölümde kurduğumuz test container'ını çalıştırırsanız, aşağıdaki gibi bir şey göreceksiniz:

Output
Mon Jul 26 14:39:33 UTC 2021
Mon Jul 26 14:39:35 UTC 2021
Mon Jul 26 14:39:37 UTC 2021
Mon Jul 26 14:39:39 UTC 2021
Mon Jul 26 14:39:41 UTC 2021
Mon Jul 26 14:39:43 UTC 2021
Mon Jul 26 14:39:45 UTC 2021
Mon Jul 26 14:39:47 UTC 2021
Mon Jul 26 14:39:49 UTC 2021
Mon Jul 26 14:39:51 UTC 2021

Bu, esasen Docker konteyneri için etkileşimli bir kabuk açmakla (önceki adımda docker exec -it container-name sh ile yapıldığı gibi) ve ardından tail /var/log/date.log komutunu çalıştırmakla aynıdır. Ancak, bir kabuk açıp komutu çalıştırıp ardından kabuğu kapatmak yerine, bu komut, sözde bir terminal açmadan tek bir komutta aynı çıktıyı döndürür.

Docker konteynerindeki alternatif bir dizinde komut çalıştırma

Konteynerinizin belirli bir dizininde bir komut çalıştırmak için, dizini belirtmek üzere –workdir bayrağını kullanın:

docker exec --workdir /tmp container-name pwd

Bu örnek komut, çalışma dizini olarak /tmp dizinini ayarlar, ardından geçerli çalışma dizinini yazdıran pwd komutunu çalıştırır:

Output
/tmp

pwd komutu çalışma dizininin /tmp olduğunu doğruladı.

Docker konteynerinde farklı bir kullanıcı olarak komut çalıştırma

Konteynerinizin içinde farklı bir kullanıcı olarak bir komutu çalıştırmak için --user bayrağını ekleyin:

docker exec --user guest container-name whoami

Bu, konuk kullanıcıyı kapsayıcıdaki whoami komutunu çalıştırmak için kullanır. whoami komutu, kullanıcının geçerli kullanıcı adını yazdırır:

Output
guest

Whoami komutu, konteynerin geçerli kullanıcısının misafir olduğunu doğrular.

Ortam değişkenlerini bir Docker konteynerine geçirme

Bazen, çalıştırma komutuyla birlikte bir kapsayıcıya ortam değişkenleri aktarmak gerekir. -e bayrağı, bir ortam değişkeni belirtmenize olanak tanır:

docker exec -e TEST=sammy container-name env

Bu komut, TEST ortam değişkenini sammy olarak ayarlar ve ardından kapsayıcının içinde env komutunu çalıştırır. env komutu daha sonra tüm ortam değişkenlerini yazdırır:

Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/root

TEST değişkeni sammy olarak ayarlandı.

Birden fazla değişkeni ayarlamak için her biri için -e işaretini tekrarlayın:

docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env

Eğer ortam değişkenleriyle dolu bir dosya geçirmek istiyorsanız bunu –env-file bayrağıyla yapabilirsiniz.

Öncelikle dosyayı bir metin düzenleyicisiyle oluşturun. Burada nano ile yeni bir dosya açacağız, ancak siz rahat ettiğiniz herhangi bir düzenleyiciyi kullanabilirsiniz:

nano .env

Dosya adı olarak .env kullanıyoruz çünkü bu tür dosyaları sürüm kontrolü dışındaki bilgileri yönetmek için kullanmakta kullanılan popüler bir standarttır.

KEY=value değişkenlerinizi aşağıda gösterildiği gibi, her satıra bir tane olacak şekilde dosyaya yazın:

TEST=sammy
ENVIRONMENT=prod

Dosyayı kaydedip kapatın. Dosyayı kaydedip nano'dan çıkmak için CTRL+O'ya, ardından kaydetmek için ENTER'a, çıkmak için de CTRL+X'e basın.

Şimdi docker exec komutunu çalıştırın ve –env-file komutundan sonra doğru dosya adını belirtin:

docker exec --env-file .env container-name env
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/root

Dosyada iki değişken ayarlanmıştır.

Birden fazla –env-file bayrağı kullanarak birden fazla dosya belirtebilirsiniz. Dosyalardaki değişkenler çakışırsa, son komutta listelenen dosya önceki dosyaları geçersiz kılar.

Yaygın hatalar

Docker exec komutunu kullanırken birkaç yaygın hatayla karşılaşabilirsiniz:

Error: No such container: container-name

"Böyle bir kapsayıcı yok" hatası, belirtilen kapsayıcının mevcut olmadığı ve kapsayıcı adının yanlış yazıldığı anlamına gelebilir. Çalışan kapsayıcılarınızı listelemek ve adını tekrar kontrol etmek için docker ps komutunu kullanın.

Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running

Bu iletinin çalışması, konteynerin mevcut olduğu ancak durdurulduğu anlamına gelir. Konteyneri docker start container-name ile başlatabilirsiniz.

Error response from daemon: Container container-name is paused, unpause the container before exec

Container is paused hatası sorunu gayet iyi açıklıyor. Devam etmeden önce, docker unpause container-name komutuyla container'ı duraklatmayı kaldırmanız gerekiyor.

Sonuç

Bu eğitimde, çalışan bir Docker konteynerinde komutların nasıl çalıştırılacağını ve bunu yaparken bazı komut satırı seçeneklerini öğrendik.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Ayrıca Şunları da Beğenebilirsiniz