Giriş
Docker, kapsayıcılarda uygulama süreçlerini yönetme sürecini basitleştiren bir uygulamadır. Kapsayıcılar, uygulamalarınızı kaynaktan yalıtılmış süreçlerde çalıştırmanıza olanak tanır. Sanal makinelere benzerler, ancak kapsayıcılar daha taşınabilir, daha kaynak dostu ve ana bilgisayar işletim sistemine daha bağımlıdır.
Bu yazıda, Docker Community Edition’ı (CE) Debian 10’a yüklemeyi ve kullanmayı okuyacaksınız. Docker’ın kendisini kuracak, kapsayıcılar ve görüntülerle çalışacak ve bir görüntüyü Docker Deposuna göndereceksiniz.
Önkoşullar
Bu yazıyı takip etmek için aşağıdakilere ihtiyacınız olacak:
- Bir sudo root olmayan kullanıcı ve bir güvenlik duvarı da dahil olmak üzere, bir Debian 10 sunucusu kurulur.
- Adım 7 ve 8’de gösterildiği gibi kendi görüntülerinizi oluşturmak ve bunları Docker Hub’a göndermek istiyorsanız Docker Hub’da bir hesap.
Adım 1 — Docker’ı Yükleme
Resmi Debian deposunda bulunan Docker kurulum paketi en son sürüm olmayabilir. En son sürümü aldığımızdan emin olmak için Docker’ı resmi Docker deposundan yükleyeceğiz. Bunu yapmak için yeni bir paket kaynağı ekleyeceğiz, indirmelerin geçerli olduğundan emin olmak için Docker’dan GPG anahtarını ekleyeceğiz ve ardından paketi yükleyeceğiz.
İlk olarak, mevcut paket listenizi güncelleyin:
sudo apt update
Ardından, apt’nin paketleri HTTPS üzerinden kullanmasına izin veren birkaç önkoşul paketi kurun:
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
Ardından resmi Docker deposu için GPG anahtarını sisteminize ekleyin:
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
Docker deposunu APT kaynaklarına ekleyin:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
Ardından, paket veritabanını yeni eklenen depodan Docker paketleri ile güncelleyin:
sudo apt update
Varsayılan Debian deposu yerine Docker deposundan yüklemek üzere olduğunuzdan emin olun:
apt-cache policy docker-ce
Docker’ın sürüm numarası farklı olsa da, şöyle bir çıktı göreceksiniz:
docker-ce:
Installed: (none)
Candidate: 5:20.10.12~3-0~debian-buster
Version table:
5:20.10.12~3-0~debian-buster 500
500 https://download.docker.com/linux/debian buster/stable amd64 Packages
docker-ce’nin kurulu olmadığına dikkat edin, ancak kurulum için aday Debian 10 (buster) için Docker deposundandır.
Son olarak, Docker’ı yükleyin:
sudo apt install docker-ce
Docker şimdi yüklendi, arka plan programı başladı ve işlem önyüklemede başlamak için etkinleştirildi. Çalıştığını kontrol edin:
sudo systemctl status docker
Çıktı, hizmetin etkin ve çalıştığını gösteren aşağıdakine benzer olacaktır:
Output● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2019-07-08 15:11:19 UTC; 58s ago
Docs: https://docs.docker.com
Main PID: 5709 (dockerd)
Tasks: 8
Memory: 31.6M
CGroup: /system.slice/docker.service
└─5709 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Bunun yanında docker.io isminde ücretli bir versiyon da mevcuttur. Docker-Ce ücretsiz ve açık kaynaklıdır, Docker.Io ise bir abonelik kapsamında kullanılabilir.
Ücretli ve kurumsal sürüm docker.io ‘yu kurmak için aşağıdaki komutları kullanın.
sudo apt install docker.io sudo systemctl start docker
Docker’ı yüklemek size yalnızca Docker hizmetini (arka plan programı) değil, aynı zamanda docker komut satırı yardımcı programını veya Docker istemcisini de sağlar. Daha sonra docker komutunun nasıl kullanılacağını keşfedeceğiz.
Adım 2 — Docker Komutunu Sudo Olmadan Yürütme (İsteğe Bağlı)
Varsayılan olarak, docker komutu yalnızca kök kullanıcı veya Docker’ın yükleme işlemi sırasında otomatik olarak oluşturulan docker grubundaki bir kullanıcı tarafından çalıştırılabilir. Docker komutunu sudo ile önek eklemeden veya docker grubunda olmadan çalıştırmayı denerseniz, şöyle bir çıktı alırsınız:
Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Docker komutunu her çalıştırdığınızda sudo yazmaktan kaçınmak istiyorsanız, kullanıcı adınızı docker grubuna ekleyin:
sudo usermod -aG docker ${USER}
Yeni grup üyeliğini uygulamak için sunucudan çıkış yapın ve tekrar giriş yapın veya aşağıdakini yazın:
su - ${USER}
Devam etmek için kullanıcı parolanızı girmeniz istenecektir.
Şunu yazarak kullanıcınızın docker grubuna eklendiğini onaylayın:
id -nG
Output
sammy sudo docker
Docker grubuna oturum açmadığınız bir kullanıcı eklemeniz gerekiyorsa, bu kullanıcı adını açıkça şunu kullanarak bildirin:
sudo usermod -aG docker username
Bu makalenin geri kalanında, docker komutunu docker grubunda bir kullanıcı olarak çalıştırdığınız varsayılmaktadır. Yapmamayı seçerseniz, lütfen komutları sudo ile hazırlayın.
Şimdi docker komutunu inceleyelim.
Adım 3 — Docker Komutunu Kullanma
Docker’ı kullanmak, ona bir seçenekler ve komutlar zincirini ve ardından argümanları iletmekten oluşur. Sözdizimi şu biçimi alır:
docker [option] [command] [arguments]
Mevcut tüm alt komutları görüntülemek için şunu yazın:
docker
Docker 18’den itibaren mevcut alt komutların tam listesi şunları içerir:
Outputattach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
Belirli bir komut için kullanılabilen seçenekleri görüntülemek için şunu yazın:
docker docker-subcommand --help
Docker hakkında sistem genelindeki bilgileri görüntülemek için şunu kullanın:
docker info
Bu komutlardan bazılarını inceleyelim. Resimlerle çalışmaya başlayacağız.
Adım 4 — Docker Görüntüleriyle Çalışmak
Docker kapsayıcıları, Docker görüntülerinden oluşturulur. Varsayılan olarak Docker, bu görüntüleri Docker projesinin arkasındaki şirket olan Docker tarafından yönetilen bir Docker kayıt defteri olan Docker Hub’dan çeker. Herkes Docker görüntülerini Docker Hub’da barındırabilir, bu nedenle ihtiyaç duyacağınız çoğu uygulama ve Linux dağıtımında görüntüler burada barındırılır.
Docker Hub’dan görüntülere erişip erişemeyeceğinizi kontrol etmek için şunu yazın:
docker run hello-world
Çıktı, Docker’ın doğru çalıştığını gösterecektir:
OutputUnable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Docker başlangıçta merhaba dünya görüntüsünü yerel olarak bulamadı, bu nedenle görüntüyü varsayılan depo olan Docker Hub’dan indirdi. Görüntü indirildikten sonra, Docker görüntüden bir kapsayıcı oluşturdu ve kapsayıcı içindeki uygulama yürütüldü ve mesajı görüntülendi.
Arama alt komutuyla docker komutunu kullanarak Docker Hub’da bulunan görüntüleri arayabilirsiniz. Örneğin, Ubuntu görüntüsünü aramak için şunu yazın:
docker search ubuntu
Komut dosyası, Docker Hub’ı tarayacak ve adı arama dizesiyle eşleşen tüm görüntülerin bir listesini döndürecektir. Bu durumda çıktı şuna benzer olacaktır:
OutputNAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 9704 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 319 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 224 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 183 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 99 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 97 [OK]
neurodebian NeuroDebian provides neuroscience research s… 57 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 50 [OK]
ubuntu
...
OFFICIAL sütunundaki OK ifadesi, projenin arkasında şirket tarafından oluşturulan ve desteklenen görüntüyü belirtir. Kullanmak istediğiniz görüntüyü belirledikten sonra, pull alt komutunu kullanarak onu bilgisayarınıza indirebilirsiniz.
Resmi ubuntu görüntüsünü bilgisayarınıza indirmek için aşağıdaki komutu yürütün:
docker pull ubuntu
Aşağıdaki çıktıyı göreceksiniz:
OutputUsing default tag: latest
latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete
14ca88e9f672: Pull complete
a31c3b1caad4: Pull complete
b054a26005b7: Pull complete
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest
Bir görüntü indirildikten sonra, indirilen görüntüyü run alt komutuyla kullanarak bir kapsayıcı çalıştırabilirsiniz. Merhaba dünya örneğinde gördüğünüz gibi, docker run alt komutuyla çalıştırıldığında bir görüntü indirilmemişse, Docker istemcisi önce görüntüyü indirecek, ardından onu kullanarak bir kapsayıcı çalıştıracaktır.
Bilgisayarınıza indirilen görüntüleri görmek için şunu yazın:
docker images
Çıktı aşağıdakine benzer görünmelidir:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 4c108a37151f 2 weeks ago 64.2MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
Bu yazıda daha sonra göreceğiniz gibi, kapsayıcıları çalıştırmak için kullandığınız görüntüler değiştirilebilir ve yeni görüntüler oluşturmak için kullanılabilir; bunlar daha sonra Docker Hub’a veya diğer Docker kayıtlarına yüklenebilir.
Adım 5 — Docker Kapsayıcısını Çalıştırma
Önceki adımda çalıştırdığınız merhaba-dünya kapsayıcısı, bir test mesajı gönderdikten sonra çalışan ve çıkan bir kapsayıcı örneğidir. Konteynerler bundan çok daha faydalı olabilir ve etkileşimli olabilirler. Sonuçta, sanal makinelere benzerler, yalnızca daha fazla kaynak dostudurlar.
Örnek olarak, Ubuntu’nun en son görüntüsünü kullanarak bir kapsayıcı çalıştıralım. -i ve -t anahtarlarının kombinasyonu, kapsayıcıya etkileşimli kabuk erişimi sağlar:
docker run -it ubuntu
Komut isteminiz, şu anda kapsayıcı içinde çalıştığınız gerçeğini yansıtacak şekilde değişmeli ve şu formu almalıdır:
Outputroot@d9b100f2f636:/#
Komut istemindeki kapsayıcı kimliğini not edin. Bu örnekte, d9b100f2f636’dır. Kaldırmak istediğinizde kapsayıcıyı tanımlamak için bu kapsayıcı kimliğine daha sonra ihtiyacınız olacak.
Artık kapsayıcı içinde herhangi bir komutu çalıştırabilirsiniz. Örneğin, container içindeki paket veritabanını güncelleyelim. Root kullanıcı olarak kapsayıcının içinde çalıştığınız için sudo ile herhangi bir komutun önüne eklemeniz gerekmez:
apt update
Ardından içine herhangi bir uygulama yükleyin. Node.js’yi yükleyelim:
apt install nodejs
Bu, Node.js’yi resmi Ubuntu deposundaki kapsayıcıya yükler. Kurulum tamamlandığında Node.js’nin kurulu olduğunu doğrulayın:
node -v
Terminalinizde görüntülenen sürüm numarasını göreceksiniz:
Outputv10.19.0
Kapsayıcının içinde yaptığınız tüm değişiklikler yalnızca o kapsayıcı için geçerlidir.
Kapsayıcıdan çıkmak için istemde exit yazın.
Şimdi sistemimizdeki kapsayıcıları yönetmeye bakalım.
Adım 6 — Docker Konteynerlerini Yönetme
Docker’ı bir süre kullandıktan sonra bilgisayarınızda birçok aktif (çalışan) ve aktif olmayan kapsayıcınız olacaktır. Aktif olanları görüntülemek için şunu kullanın:
docker ps
Aşağıdakine benzer bir çıktı göreceksiniz:
OutputCONTAINER ID IMAGE COMMAND CREATED
Yukarıdaki yazıda iki kapsayıcı başlattınız; biri merhaba dünya görüntüsünden, diğeri ubuntu görüntüsünden. Her iki kapsayıcı da artık çalışmıyor, ancak sisteminizde hala varlar.
Etkin ve etkin olmayan tüm kapsayıcıları görüntülemek için docker ps’yi -a anahtarıyla çalıştırın:
docker ps -a
Şuna benzer bir çıktı göreceksiniz:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d42d0bbfbd35 ubuntu "/bin/bash" About a minute ago Exited (0) 20 seconds ago friendly_volhard
0740844d024c hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago elegant_neumann
Oluşturduğunuz en son kapsayıcıyı görüntülemek için -l anahtarını iletin:
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d42d0bbfbd35 ubuntu "/bin/bash" About a minute ago Exited (0) 34 seconds ago friendly_volhard
To start a stopped container, use docker start
, followed by the container ID or the container’s name. Let’s start the Ubuntu-based container with the ID of d9b100f2f636
:
docker start d42d0bbfbd35
Kapsayıcı başlayacak ve durumunu görmek için docker ps’yi kullanabilirsiniz:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d42d0bbfbd35 ubuntu "/bin/bash" About a minute ago Up 8 seconds friendly_volhard
Çalışan bir kapsayıcıyı durdurmak için, docker stop’u ve ardından kapsayıcı kimliğini veya adını kullanın. Bu sefer, Docker’ın kapsayıcıya atadığı, yani friendly_volhard adını kullanacağız:
docker stop friendly_volhard
Artık bir kapsayıcıya ihtiyacınız olmadığına karar verdiğinizde, yine kapsayıcı kimliğini veya adını kullanarak docker rm komutuyla kaldırın. Merhaba dünya görüntüsüyle ilişkili kapsayıcının kapsayıcı kimliğini veya adını bulmak için docker ps -a komutunu kullanın ve kaldırın.
docker rm elegant_neumann
Yeni bir kapsayıcı başlatabilir ve –name parametresini kullanarak ona bir ad verebilirsiniz. Durduğunda kendini kaldıran bir kapsayıcı oluşturmak için –rm parametresini de kullanabilirsiniz. Bu seçenekler ve diğerleri hakkında daha fazla bilgi için docker run help komutuna bakın.
Adım 7 — Bir Kapsayıcıdaki Değişiklikleri Docker Görüntüsüne Aktarma
Bir Docker görüntüsü başlattığınızda, tıpkı bir sanal makinede olduğu gibi dosyalar oluşturabilir, değiştirebilir ve silebilirsiniz. Yaptığınız değişiklikler yalnızca o kapsayıcı için geçerli olacaktır. Başlatıp durdurabilirsiniz, ancak docker rm komutuyla yok ettiğinizde, değişiklikler tamamen kaybolacaktır.
Bu bölüm, bir kapsayıcının durumunu yeni bir Docker görüntüsü olarak nasıl kaydedeceğinizi gösterir.
Node.js’yi Ubuntu kapsayıcısının içine yükledikten sonra, artık bir görüntü çalıştıran bir kapsayıcınız olur, ancak kapsayıcı, onu oluşturmak için kullandığınız görüntüden farklıdır. Ancak bu Node.js kapsayıcısını daha sonra yeni görüntüler için temel olarak yeniden kullanmak isteyebilirsiniz.
Ardından, aşağıdaki komutu kullanarak değişiklikleri yeni bir Docker görüntüsü örneğine uygulayın.
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
-m anahtarı, sizin ve başkalarının yaptığınız değişiklikleri bilmesine yardımcı olan taahhüt mesajı içindir, -a ise yazarı belirtmek için kullanılır. Container_id, etkileşimli Docker oturumunu başlattığınızda öğreticide daha önce not ettiğinizdir. Docker Hub’da ek depolar oluşturmadığınız sürece, depo genellikle Docker Hub kullanıcı adınızdır.
Örneğin, d9b100f2f636 kapsayıcı kimliğine sahip sammy kullanıcısı için komut şöyle olacaktır:
docker commit -m "added Node.js" -a "sammy" d42d0bbfbd35 sammy/ubuntu-nodejs
Bir görüntü kaydettiğinizde, yeni görüntü bilgisayarınıza yerel olarak kaydedilir. Bu öğreticinin ilerleyen bölümlerinde, başkalarının erişebilmesi için bir görüntüyü Docker Hub gibi bir Docker kayıt defterine nasıl göndereceğinizi öğreneceksiniz.
Docker görüntülerini tekrar listelemek, yeni görüntünün yanı sıra türetildiği eski görüntüyü de gösterecektir:
docker images
Çıktıyı şöyle göreceksiniz:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest d441c62350b4 10 seconds ago 152MB
ubuntu latest 4c108a37151f 2 weeks ago 64.2MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
Bu örnekte, ubuntu-nodejs, Docker Hub’daki mevcut ubuntu görüntüsünden türetilen yeni görüntüdür. Boyut farkı, yapılan değişiklikleri yansıtır. Ve bu örnekte, değişiklik NodeJS’nin kurulu olmasıydı. Bu nedenle, bir dahaki sefere NodeJS önceden yüklenmiş Ubuntu kullanarak bir kapsayıcı çalıştırmanız gerektiğinde, yeni görüntüyü kullanabilirsiniz.
Şimdi yeni görüntüyü başkalarıyla paylaşalım, böylece onlardan kapsayıcı oluşturabilsinler.
Adım 8 — Docker Görüntülerini Docker Deposuna Göndermek
Mevcut bir görüntüden yeni bir görüntü oluşturduktan sonraki mantıklı adım, onu birkaç arkadaşınızla, Docker Hub’daki tüm dünyayla veya erişiminiz olan diğer Docker kayıt defteriyle paylaşmaktır. Bir görüntüyü Docker Hub’a veya başka bir Docker kayıt defterine göndermek için orada bir hesabınızın olması gerekir.
Resminizi göndermek için önce Docker Hub’da oturum açın.
docker login -u docker-registry-username
Docker Hub parolanızı kullanarak kimlik doğrulamanız istenir. Doğru parolayı belirttiyseniz, kimlik doğrulama başarılı olmalıdır.
Not: Docker kayıt kullanıcı adınız, görüntüyü oluşturmak için kullandığınız yerel kullanıcı adından farklıysa, görüntünüzü kayıt defteri kullanıcı adınızla etiketlemeniz gerekir. Son adımda verilen örnek için şunu yazarsınız:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Ardından, aşağıdakileri kullanarak kendi resminizi itebilirsiniz:
docker push docker-registry-username/docker-image-name
ubuntu-nodejs görüntüsünü sammy deposuna göndermek için komut şöyle olacaktır:
docker push sammy/ubuntu-nodejs
Görüntüleri yüklerken işlemin tamamlanması biraz zaman alabilir, ancak tamamlandığında çıktı şöyle görünecektir:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
Bir resmi bir kayıt defterine gönderdikten sonra, aşağıdaki resimde gösterildiği gibi hesabınızın gösterge tablosunda listelenmelidir.
Push denemesi bu tür bir hatayla sonuçlanırsa, büyük olasılıkla oturum açmamışsınızdır:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required
Docker girişi ile giriş yapın ve push girişimini tekrarlayın. Ardından, Docker Hub veri havuzu sayfanızda bulunduğunu doğrulayın.
Artık görüntüyü yeni bir makineye çekmek ve onu yeni bir kapsayıcı çalıştırmak için kullanmak için docker pull sammy/ubuntu-nodejs’yi kullanabilirsiniz.
Yazının orijinalini buradan okuyabilirsiniz.
Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım.
Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum.
Son 6 yıldır sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum.
Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.
[…] Debian ‘da Docker CE nasıl kurulur […]