مقدمة
يقوم Docker، كبرنامج، بتبسيط إدارة عمليات التطبيق في الحاويات، مما يسمح لك بتنفيذ تطبيقاتك في العمليات المعزولة عن الموارد. الحاويات قابلة للمقارنة مع الآلات الافتراضية، باستثناء أنها أكثر قابلية للنقل، وسهلة الموارد، وتعتمد على نظام التشغيل المضيف.
ستقودك هذه المقالة من خلال تثبيت وإعداد Docker Community Edition (CE) على Ubuntu 20.04 و 22.04 LTS. ستقوم أولاً بتثبيت Docker، ثم التعامل مع الحاويات والصور قبل تخزين صورة في مستودع Docker.
متطلبات
ستحتاج إلى الأشياء التالية لاتباع هذا الدليل:
- قم بإعداد خادم Ubuntu 20.04 أو 22.04 LTS.
- احصل على حساب على Docker Hub إذا كنت تفضل انشاء الصور بمفردك ودفعها إلى Docker Hub، كما سترى في الخطوتين 7 و 8 من هذا الدليل.
الخطوة 1: تثبيت دوكر
من غير المرجح أن تكون حزمة تثبيت Docker المقدمة في مستودع Ubuntu الرسمي أحدث إصدار. للتأكد من حصولنا عليه، سنقوم بتثبيت Docker من مستودع Docker الرسمي. سنقدم مصدر حزمة جديد لهذا، لذا قم بتثبيت الحزمة بعد إضافة مفتاح GPG من Docker لضمان صلاحية التنزيلات.
قبل أن تبدأ، يجب عليك تحديث قائمة الحزم الحالية الخاصة بك:
$ sudo apt-get update
بعد ذلك، لتمكين الشخص المناسب من استخدام الحزم عبر HTTPS، ستحتاج إلى تثبيت بعض الحزم المطلوبة مسبقًا:
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
أضف الآن مفتاح GPG إلى مستودع Docker الرسمي لنظامك:
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
أضف الآن مستودع Docker إلى مصادر APT:
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
انطلق الآن وقم بتحديث قاعدة بيانات الحزم باستخدام حزم repo’s Docker المضافة حديثًا:
$ sudo apt-get update
الآن آخر شيء في هذه الخطوة هو تثبيت Docker:
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
تم تثبيت Docker الآن، ويتم تشغيل daemon، ومن المقرر أن تبدأ العملية في التمهيد. تحقق من أنها تعمل:
$ sudo systemctl status docker
يجب أن يظهر الناتج أن الخدمة نشطة وتعمل ويجب أن تبدو مثل ما يلي:
root@ServerB:/home/ubuntu# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-07-28 09:49:02 UTC; 8min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 6958 (dockerd)
Tasks: 8
Memory: 30.2M
CPU: 1.276s
CGroup: /system.slice/docker.service
└─6958 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
لديك الآن خدمة Docker (daemon) بالإضافة إلى برنامج سطر أوامر docker، المعروف باسم عميل Docker، بعد تثبيت Docker. في وقت لاحق من هذه المقالة، سنتعلم كيفية استخدام أمر ادوكر.
الخطوة 2: تنفيذ أمر Docker بدون Sudo (ليس إلزاميًا).
لا يجوز تنفيذ أمر الدوكر إلا من قبل مستخدم الجذر أو أحد أعضاء مجموعة الدوكر، والتي يتم إنشاؤها افتراضيًا أثناء عملية تثبيت Docker. إذا حاولت تشغيل أمر الدوكر دون تمهيده مع أو أن تكون عضوًا في مجموعة الدوكر، فسيبدو الإخراج على النحو التالي:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
لتجنب الاضطرار إلى كتابة سودو في كل مرة تقوم فيها بتشغيل أمر الدوكر، تحتاج إلى إضافة اسم المستخدم الخاص بك إلى مجموعة الدوكر:
$ sudo usermod -aG docker ${USER}
قم بتسجيل الخروج من الخادم والعودة إلى أو اكتب ما يلي من أجل تطبيق عضوية المجموعة الجديدة:
$ su - ${USER}
سيُطلب منك إدخال كلمة مرور المستخدم الخاصة بك قبل المضي قدمًا:
اكتب ما يلي لتأكيد إضافة المستخدم الآن إلى مجموعة الدوكر:
$ id -nG
ubuntu adm cdrom sudo dip plugdev lxd docker
عند الحاجة، يمكنك الإعلان عن اسم مستخدم المستخدم الذي تحتاج إلى إضافته إلى مجموعة docker التي لم يتم تسجيل دخولك إليها، من خلال استخدام:
$ sudo usermod -aG docker username
يعتمد باقي هذا الدليل على حقيقة أنك تدير أمر الدوكر كمستخدم في مجموعة الدوكر. إذا كنت تفضل عدم القيام بذلك، فامض قدمًا وقم بإعداد الأوامر مع سودو.
الخطوة 3: استخدم أمر Docker
استخدام ادوكر يعني تمريره على سلسلة من الخيارات والأوامر التي ستأتي بعدها الحجج. يبدو الجملة كما يلي:
$ docker [option] [command] [arguments]
$ docker -v
ubuntu@ServerB:~$ docker -v
Docker version 20.10.17, build 100c701
لمعرفة جميع الاوامر الفرعية المتاحة، نوع:
$ docker
وتشمل القائمة الكاملة لجميع الاوامر الفرعية الممكنة ما يلي:
Commands:
attach 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
لمعرفة الخيارات الممكنة لأمر معين، اكتب:
$ docker docker-subcommand --help
لمعرفة المعلومات على نطاق المنظومة فيما يتعلق بـ Docker، النوع:
$ docker info
في هذه الخطوة التالية سنستكشف بعض هذه الصور.
الخطوة 4: التعامل مع صور Docker
يتم استخدام الصور التي تم إنشاؤها باستخدام Docker لإنشاء حاويات. بشكل افتراضي، يجلب Docker هذه الصور من Docker Hub، وهو سجل Docker يديره Docker. نظرًا لأن أي شخص قد يستخدم Docker Hub لنشر صوره، فإن الغالبية العظمى من التطبيقات وتوزيعات Linux ستحمل صورًا هناك.
للتحقق مما إذا كان لديك وصول ويمكنك تنزيل الصور الموجودة على Docker Hub، اكتب:
$ docker run hello-world
سيخبرك المخرج التالي أن Docker يعمل بشكل صحيح:
ubuntu@ServerB:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:53f1bbee2f52c39e41682ee1d388285290c5c8a76cc92b42687eecf38e0af3f0
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
لم يتمكن Docker في البداية من العثور على صورة hello-world محليًا، لذلك شرع في تنزيلها من Docker Hub، وهو المستودع الافتراضي. بمجرد تنزيل الصورة، أنشأ Docker حاوية منها وتم تنفيذ التطبيق داخل الحاوية، مع عرض الرسالة في النهاية.
يمكنك العثور على الصور المتوفرة على Docker Hub باستخدام أمر الرصيف والبحث الفرعي و. على سبيل المثال، للعثور على صورة Ubuntu، يجب عليك كتابة:
$ docker search ubuntu
سينتقل النص إلى Docker Hub ويعرض قائمة بجميع الصور التي يتطابق اسمها مع طلب البحث. في هذه الحالة، سيبدو الناتج كما يلي:
ubuntu@ServerB:~$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 14664 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 286 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
neurodebian NeuroDebian provides neuroscience research s… 92 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 55
open-liberty Open Liberty multi-architecture images based… 53 [OK]
ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 46 [OK]
ubuntu/apache2 Apache, a secure & extensible open-source HT… 39
ubuntu/mysql MySQL open source fast, stable, multi-thread… 36
kasmweb/ubuntu-bionic-desktop Ubuntu productivity desktop for Kasm Workspa… 31
...
بمجرد اختيار الصورة التي ستستخدمها، يمكنك تنزيلها على جهاز الكمبيوتر الخاص بك باستخدام فرع السحب و.
$ docker pull ubuntu
ستحصل عليه سيبدو هكذا:
ubuntu@ServerB:~$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
405f018f9d1d: Pull complete
Digest: sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
بعد تنزيل صورة، يمكنك بعد ذلك تشغيل حاوية باستخدام الصورة التي تم تنزيلها مع التشغيل الفرعي و. كما رأيت مع مثال hello-world، إذا لم يتم تنزيل صورة عند تنفيذ الرصيف مع فرع التشغيل، فسيقوم عميل Docker أولاً بتنزيل الصورة، ثم تشغيل حاوية باستخدامها.
لمشاهدة الصور التي تم تنزيلها على جهاز الكمبيوتر الخاص بك، اكتب ما يلي:
$ docker images
سيبدو الناتج مثل هذا:
ubuntu@ServerB:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 27941809078c 7 weeks ago 77.8MB
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
سترى لاحقًا في هذا البرنامج التعليمي كيف يمكنك تعديل الصور التي تستخدمها لتشغيل الحاويات واستخدامها لإنشاء صور جديدة يمكن بعد ذلك إدخالها (دفع المصطلح التقني) في Docker Hub أو سجلات Docker الأخرى.
الخطوة 5: تشغيل حاوية في Docker
حاوية hello-world التي في الخطوة الأخيرة هي مثال على حاوية، بعد إصدار رسالة اختبار، ستعمل وتخرج. يمكن أن تكون الحاويات أكثر فائدة من هذا، وكذلك تفاعلية. إنها تعمل إلى حد ما مثل الآلات الافتراضية، والفرق الوحيد هو أنها أكثر ملاءمة للموارد.
على سبيل المثال، دعونا نشغل حاوية ونستخدم أحدث صورة لأوبونتو. سيمنحك الجمع بين مفاتيح -i و -t وصولاً تفاعليًا للصدفة إلى الحاوية:
$ docker run -it ubuntu
يجب إعادة صياغة مطلب الأمر الخاص بك لإظهار أنك تعمل الآن داخل الحاوية ويجب أن تبدو هكذا:
ubuntu@ServerB:~$ docker run -it ubuntu
root@a9bb67c47592:/#
انظر عن كثب إلى معرف الحاوية في موجه الأمر وهو a9bb67c47592 هنا. معرف الحاوية هذا ضروري لاحقًا لتحديد الحاوية عند الرغبة في حذفها.
الآن يمكنك تشغيل أي أمر داخل الحاوية. على سبيل المثال، عند تحديث قاعدة بيانات الحزمة داخل الحاوية، لن تحتاج إلى بادئة أي أمر بالسودو، لأنك تعمل داخل الحاوية كمستخدم خارق:
root@a9bb67c47592:/# apt update
الآن دعنا نمضي قدمًا ونثبت أي تطبيق فيه، Node.js على سبيل المثال:
root@a9bb67c47592:/# apt install nodejs
سيؤدي ذلك إلى تثبيت Node.js في الحاوية الموجودة في مستودع Ubuntu الرسمي. بمجرد تثبيته، تحقق من ذلك من خلال:
root@a9bb67c47592:/# node -v
سيتم عرض رقم الإصدار في المحطة الخاصة بك:
v12.22.9
جميع التغييرات التي تجريها داخل الحاوية ستطبق فقط على تلك الحاوية.
اكتب exit عند الموجه للخروج من الحاوية.
الخطوة 6: إدارة الحاويات في Docker
بمجرد أن تكون على Docker لبعض الوقت، ستلاحظ أن هناك العديد من الحاويات النشطة (العاملة) وغير النشطة على جهاز الكمبيوتر الخاص بك. لرؤية النشطين، استخدم:
$ docker ps
المخرج الذي ستحصل عليه مشابه لهذا:
ubuntu@ServerB:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
لقد بدأت حاويتين حتى الآن في الخطوات السابقة ؛ واحد من صورة hello-world والثاني من صورة أوبونتو. كلاهما لم يعد يعمل، لكنهما ما زالا في نظامك.
لتصور كل من الحاويات النشطة وغير النشطة، قم بتشغيل docker ps باستخدام المفتاح -a:
$ docker ps -a
ستحصل على إخراج مماثل:
ubuntu@ServerB:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9bb67c47592 ubuntu "bash" 6 minutes ago Exited (127) 27 seconds ago magical_shirley
ee421c96d926 hello-world "/hello" 30 minutes ago Exited (0) 30 minutes ago wonderful_raman
اجتاز مفتاح -l لتصور آخر حاوية قمت بإنشائها:
$ docker ps -l
ubuntu@ServerB:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9bb67c47592 ubuntu "bash" 15 minutes ago Exited (127) 10 minutes ago magical_shirley
ابدأ استخدام الرصيف في بدء تشغيل حاوية متوقفة، تليها بطاقة هوية الحاوية أو اسمها. لنبدأ الذي يعتمد على Ubuntu مع معرف a9bb67c47592:
$ docker start a9bb67c47592
يمكنك استخدام docker ps لرؤية حالة الحاوية بمجرد أن تبدأ:
ubuntu@ServerB:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9bb67c47592 ubuntu "bash" 23 minutes ago Up About a minute magical_shirley
استخدم توقف الرصيف لإيقاف تشغيل الحاوية، متبوعًا بهويتها أو اسمها. هذه المرة، سنستخدم الاسم الذي عينه Docker للحاوية، وهو quizzical_mcnulty:
$ docker stop magical_shirley
عندما لا تحتاج إلى حاوية، يمكنك إزالتها بأمر rm الرصيف، هذه المرة أيضًا، باستخدام معرف الحاوية أو اسمها. استخدم docker ps – أمر للعثور على اسم أو معرف الحاوية المرتبطة بصورة hello-world وحذفها.
$ docker rm wonderful_raman
يمكنك إنشاء حاوية جديدة وتسميتها باستخدام مفتاح -name. من الممكن أيضًا استخدام مفتاح -rm لبدء حاوية تحذف نفسها عند إيقافها. شاهد أمر المساعدة في تشغيل الرصيف للحصول على مزيد من المعلومات حول هذه الخيارات وغيرها.
يمكنني تحويل الحاويات إلى صور، والتي يمكن استخدامها لبناء حاويات جديدة.
الخطوة 7: إحضار التغييرات داخل حاوية إلى صورة على Docker
يمكنك إنشاء الملفات وتعديلها وحذفها تمامًا كما هو الحال مع الآلة الافتراضية عند بدء تشغيل صورة Docker. ستنطبق التغييرات التي تجريها على تلك الحاوية الواحدة فقط. يمكنني البدء وإيقافه، لكن عندما أستخدم أمر الرصيف rm لتدميره، تضيع التغييرات بشكل دائم.
سيوضح لك هذا الجزء كيف يمكنك حفظ حالة الحاوية كصورة Docker جديدة.
بمجرد تثبيت Node.js في حاوية Ubuntu، لديك الآن واحدة تعمل خارج الصورة، لكن الحاوية ليست مثل الصورة التي اعتدت صنعها. ولكن قد ترغب في استخدام حاوية Node.js هذه مرة أخرى كأساس للصور الجديدة لاحقًا.
ثم قم بإجراء التغييرات على مثال صورة Docker الجديد بالأمر التالي.
$ docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
يرتبط التبديل -m برسالة الالتزام، مما يساعدك أنت والآخرين على تحديد التغييرات التي أجريتها، ومع ذلك – أ يستخدم لتحديد المؤلف. container_id هو الذي رأيته سابقًا في هذا الدليل عندما أطلقت جلسة Docker التفاعلية. عادة ما يكون المستودع هو اسم مستخدم Docker Hub الخاص بك، ما لم تقم بإنشاء مستودعات جديدة على Docker Hub.
على سبيل المثال، بالنسبة للمستخدم ubuntu الذي يكون معرف الحاوية a9bb67c47592، سيكون الأمر كما يلي:
$ docker commit -m "added Node.js" -a "ubuntu" a9bb67c47592 ubuntu/ubuntu-nodejs
بعد أن commit الصورة، سأحصل على صورة جديدة محفوظة محليًا على جهاز الكمبيوتر الخاص بي. ستتعلم لاحقًا في هذا الدليل كيفية دفع صورة إلى سجل Docker مثل Docker Hub، حتى يتمكن الأشخاص الآخرون من الوصول إليها.
قائمة صور Docker مرة أخرى الصور الجديدة والقديمة التي أتت منها:
$ docker images
سترى المخرجات التالية:
ubuntu@ServerB:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu/ubuntu-nodejs latest 45f8857f0719 9 seconds ago 197MB
...
في هذه الحالة، ubuntu-nodejs هي الصورة الجديدة التي تم استخراجها من صورة ubuntu الحالية من Docker Hub. الفرق في الحجم يعكس التعديلات التي قمت بها. والتغيير الذي قمت به هو أن NodeJS قد تم تثبيته. لذلك، في المرة القادمة التي ستحتاج فيها إلى تشغيل حاوية مع Ubuntu مع تثبيت NodeJS مسبقًا، يمكنك فقط استخدام الصورة الجديدة.
يمكنك أيضًا إنشاء صور من Dockerfile تتيح لك أتمتة تثبيت البرنامج داخل صورة جديدة. ومع ذلك، فإن هذا لا علاقة له بهذا الدليل.
الخطوة 8: دفع صورة Docker إلى مستودع Docker
الخطوة الواضحة التالية بعد إنشاء صورة جديدة من صورة موجودة هي مشاركتها مع عدد قليل من الأشخاص الذين تختارهم، والجمهور الواسع على Docker Hub، أو سجل Docker آخر يمكنك الوصول إليه. لدفع صورة إلى Docker Hub أو أي سجل Docker آخر، يجب أن يكون لديك حساب هناك.
للقيام بذلك، عليك تسجيل الدخول أولاً إلى Docker Hub.
$ docker login -u docker-registry-username
سأقوم بالمصادقة باستخدام كلمة مرور Docker Hub الخاصة بك.
ملاحظة: إذا اختلف اسم مستخدم سجل Docker الخاص بك عن اسم المستخدم المحلي الذي استخدمته لإنشاء الصورة، فستحتاج إلى وضع علامة على صورتك باسم مستخدم السجل الخاص بك. في حالة المثال الأخير، يمكنك كتابة:
$ docker tag ubuntu/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
ثم ستتمكن من دفع صورتك باستخدام:
$ docker push docker-registry-username/docker-image-name
لدفع صورة ubuntu-nodejs إلى مستودع ubuntu، استخدم الأمر التالي:
$ docker push ubuntu/ubuntu-nodejs
تحلى بالصبر لأن العملية تستغرق وقتًا أثناء تحميل الصور، ولكن عند اكتمالها، سيكون المخرج مشابهًا لما يلي:
The push refers to a repository [docker.io/ubuntu/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
إذا كان هناك أي خطأ من هذا النوع، فمن المحتمل أنك لم تسجل الدخول:
The push refers to a repository [docker.io/ubuntu/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required
قم بتسجيل الدخول مع تسجيل الدخول وإعادة تشغيل عملية الدفع مرة أخرى. ثم تحقق من أنه موجود بالفعل في صفحة مستودع Docker Hub الخاصة بك.
أصبح من الممكن الآن بالنسبة لك استخدام docker pull ubuntu/ubuntu-nodejs لسحب الصورة إلى آلة جديدة وتشغيل حاوية جديدة.