كيفية تثبيت واستخدام دوكر  على أوبونتو 20.04/22.04

تثبيت واستخدام دوكر  Docker  على أوبونتو Ubuntu 20.04/22.04 LTS

مقدمة

يقوم 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 لسحب الصورة إلى آلة جديدة وتشغيل حاوية جديدة.

LEAVE A COMMENT