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 2021Sonraki 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 psBu 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-nameBu ö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-nameDaha 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 shBu 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:
exitEğ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.logBu 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 2021Bu, 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 pwdBu ö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
/tmppwd 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 whoamiBu, 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
guestWhoami 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 envBu 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=/rootTEST 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 envEğ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 .envDosya 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=prodDosyayı 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 envOutput
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/rootDosyada 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.









