<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/page/2/?d=4</link><description>DevOps: Docker</description><language>ar</language><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; Docker Compose &#x639;&#x644;&#x649; &#x62F;&#x628;&#x64A;&#x627;&#x646;</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-docker-compose-%D8%B9%D9%84%D9%89-%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-r464/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_04/1-how-to-install-docker-compose-on-debian-10.jpg.3b12b321b9c5ccfc2291dbad03695ff9.jpg" /></p>

<p>
	يعد دوكر Docker أداة فعالة لأتمتة تثبيت تطبيقات لينكس داخل حاويات للبرامج، للاستفادة الكاملة من إمكاناته، يجب تشغيل كل مكون من مكونات التطبيق في حاويته الخاصة. وبالنسبة للتطبيقات المعقدة التي تحوي الكثير من المكونات، يمكن أن يصبح تنسيق جميع الحاويات لبدء التشغيل والاتصال وإيقاف التشغيل معًا أمرًا غير عملي.
</p>

<p>
	توصل مجتمع دوكر إلى حل شائع يسمى <a href="http://www.fig.sh/" rel="external nofollow">Fig</a>، والذي يسمح باستخدام ملف YAML واحد لتنظيم جميع حاويات دوكر وتكويناتها. حيث أصبح هذا شائعًا جدًا لدرجة أن مجتمع دوكر قرر جعل <a href="https://docs.docker.com/compose/" rel="external nofollow">Docker Compose</a> يعتمد على مصدر Fig، والذي تم إلغاؤه الآن. يتيح Docker Compose للمستخدمين تنظيم عمليات حاويات دوكر، بما في ذلك بدء وإيقاف التشغيل وإعداد الربط بين الحاويات ووحدات التخزين.
</p>

<p>
	في هذا الدليل، ستقوم بتثبيت أحدث إصدار من Docker Compose لمساعدتك في إدارة التطبيقات متعددة الحاويات على خادم دبيان 10.
</p>

<h2>
	المتطلبات الأساسية
</h2>

<p>
	لكي تتمكن من المتابعة مع هذه المقالة، ستحتاج إلى:
</p>

<ul>
<li>
		خادم دبيان 10 ومستخدم عادي (non-root) بامتيازات sudo. حيث يشرح <a href="https://www.google.com/url?q=https://academy.hsoub.com/devops/linux/%25D8%25A7%25D9%2584%25D8%25AA%25D9%2587%25D9%258A%25D8%25A6%25D8%25A9-%25D8%25A7%25D9%2584%25D8%25A3%25D9%2588%25D9%2584%25D9%258A%25D8%25A9-%25D9%2584%25D8%25AE%25D8%25A7%25D8%25AF%25D9%2585-%25D8%25A3%25D9%2588%25D8%25A8%25D9%2588%25D9%2586%25D8%25AA%25D9%2588-1804-r431/&amp;sa=D&amp;ust=1585583533237000&amp;usg=AFQjCNH0o0fyROsJz1JiaWEeb4sWDFY_eA" rel="external nofollow">هذا الإعداد الأولي للخادم مع دليل دبيان 10 التعليمي كيفية إعداد ذلك.</a>
	</li>
	<li>
		دوكر مثبّت بإرشادات من الخطوة الأولى والخطوة الثانية <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-debian-10" rel="external nofollow">لكيفية تثبيت واستخدام دوكر على دبيان 10</a>
	</li>
</ul>
<p>
	ملاحظة: على الرغم من أن المتطلبات المسبقة تعطي تعليمات لتثبيت دوكر على دبيان 10، فإن أوامر <code>docker</code> في هذه المقالة يمكن أن تعمل على أنظمة تشغيل أخرى طالما أن دوكر مثبت.
</p>

<h2>
	الخطوة الأولى - تثبيت Docker Compose
</h2>

<p>
	على الرغم من أنه يمكن تثبيت Docker Compose من مستودعات Debian الرسمية، إلا أن هناك عدة إصدارات ثانوية ظهرت بعد الإصدار الأخير، لذلك في هذا الدليل ستقوم بتثبيته من مستودع GitHub الخاص بــدوكر. يختلف الأمر التالي قليلاً عن الأمر الذي ستجده في صفحة <a href="https://github.com/docker/compose/releases" rel="external nofollow">الإصدارات</a>. فباستخدام الراية <code>‎</code>-o لتحديد ملف الإخراج أولاً بدلاً من إعادة توجيه الإخراج، هذه الصيغة تتجنب حدوث خطأ "رفض الإذن" الذي يحدث عند استخدام <code>sudo</code>.
</p>

<p>
	تحقق من <a href="https://github.com/docker/compose/releases" rel="external nofollow">الإصدار الحالي</a>، وإذا لزم الأمر قم بتحديثه في الأمر التالي:
</p>

<pre class="ipsCode">
$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
</pre>

<p>
	بعد ذلك سنقوم بتعيين الأذونات:
</p>

<pre class="ipsCode">
$ sudo chmod +x /usr/local/bin/docker-compose
</pre>

<p>
	ثم سنتحقق من نجاح التثبيت عن طريق التحقق من الإصدار:
</p>

<pre class="ipsCode">
$ docker-compose --version
</pre>

<p>
	سيؤدي ذلك إلى طباعة النسخة التي قمنا بتثبيتها:
</p>

<pre class="ipsCode">
$ docker-compose version 1.25.3, build d4d1b42b
</pre>

<h2>
	الخطوة الثانية - تشغيل حاوية مع Docker Compose
</h2>

<p>
	يتضمن سجل دوكر العام Docker Hub، صورة Hello World للتوضيح والاختبار. حيث توضح الحد الأدنى من التكوين المطلوب لتشغيل حاوية باستخدام Docker Compose: ملف YAML الذي يستدعي صورة واحدة. سنقوم بإنشاء أصغر ملف إعدادت ممكن لتشغيل حاوية <code>hello-world</code> الخاصة بنا.
</p>

<p>
	أولاً ، قم بإنشاء دليل لملف YAML وقم بالتحويل إليه:
</p>

<pre class="ipsCode">
$ mkdir hello-world
cd hello-world
</pre>

<p>
	ثم قم بإنشاء ملف YAML:
</p>

<pre class="ipsCode">
$ nano docker-compose.yml
</pre>

<p>
	ضع المحتويات التالية في الملف docker-compose.yml واحفظ الملف واخرج من محرر النصوص:
</p>

<pre class="ipsCode">
$ my-test:
 image: hello-world
</pre>

<p>
	يتم استخدام السطر الأول في ملف YAML كجزء من اسم الحاوية. ويحدد السطر الثاني الصورة التي سيتم استخدامها لإنشاء الحاوية. فعندما نقوم بتنفيذ الأمر <code>docker-compose up</code>، سيبحث عن صورة محلية بالاسم الذي حددناه، ألا وهو <code>hello-world</code>. بعد ذلك سنقوم بحفظ الملف والخروج منه.
</p>

<p>
	يمكنك النظر يدويًا إلى الصور الموجودة على نظامنا باستخدام الأمر <code>docker images</code>:
</p>

<pre class="ipsCode">
$docker images
</pre>

<p>
	عندما لا تكون هناك صور محلية على الإطلاق، يتم عرض عناوين الأعمدة فقط:
</p>

<pre class="ipsCode">
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
</pre>

<p>
	الآن ، أثناء وجودك في مجلد <code>‎~/hello-world</code>، نفّذ الأمر التالي:
</p>

<pre class="ipsCode">
$docker-compose up
</pre>

<p>
	في المرة الأولى التي تقوم فيها بتنفيذ هذا الأمر، إذا لم تكن هناك صورة محلية باسم hello-world، فسوف يسحبها Docker Compose من مستودع Docker Hub العام:
</p>

<pre class="ipsCode">
Pulling my-test (hello-world:)...
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest
. . .
</pre>

<p>
	بعد سحب الصورة، يقوم <code>docker-compose</code> بإنشاء حاوية تقوم بإرفاق وتشغيل برنامج <a href="https://github.com/docker-library/hello-world/blob/85fd7ab65e079b08019032479a3f306964a28f4d/hello-world/Dockerfile" rel="external nofollow">hello</a>، والذي بدوره يؤكد أن التثبيت يعمل:
</p>

<pre class="ipsCode">
. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .
</pre>

<p>
	ثم يطبع شرحًا لما فعله:
</p>

<pre class="ipsCode">
 To generate this message, Docker took the following steps:
my-test_1  |  1. The Docker client contacted the Docker daemon.
my-test_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
my-test_1  |     (amd64)
my-test_1  |  3. The Docker daemon created a new container from that image which runs the
my-test_1  |     executable that produces the output you are currently reading.
my-test_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
my-test_1  |     to your terminal.
</pre>

<p>
	تعمل حاويات دوكر فقط عندما يكون الأمر نشطًا، لذلك بمجرد الانتهاء من تشغيل [hello]، تتوقف الحاوية. وبالتالي عندما ننظر إلى العمليات النشطة ستظهر عناوين الأعمدة، لكن لن يتم إدراج حاوية <code>hello-world</code> كونها لا تعمل:
</p>

<pre class="ipsCode">
$docker ps
</pre>

<pre class="ipsCode">
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
</pre>

<p>
	يمكنك الاطلاع على معلومات الحاوية، وهذا ما ستحتاجه في الخطوة التالية باستخدام الراية <code>‎-a</code>. يعرض هذا الأمر جميع الحاويات وليس فقط الحاويات النشطة:
</p>

<pre class="ipsCode">
$docker ps -a
</pre>

<pre class="ipsCode">
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
06069fd5ca23        hello-world         "/hello"            35 minutes ago      Exited (0) 35 minutes ago                       hello-world_my-test_1
</pre>

<p>
	و يعرض هذا المعلومات التي ستحتاج إليها لإزالة الحاوية عند الانتهاء منها.
</p>

<h2>
	الخطوة الثالثة - إزالة الصورة (اختياري)
</h2>

<p>
	لتجنب استخدام مساحة قرص غير ضرورية، سنقوم بإزالة الصورة المحلية. وللقيام بذلك، سنحتاج إلى حذف جميع الحاويات التي تشير إلى الصورة باستخدام الأمر <code>docker rm</code>، متبوعًا إما بمعرف الحاوية <code>CONTAINER ID</code> أو الاسم <code>NAME</code>. في المثال التالي، نستخدم معرف الحاوية <code>CONTAINER ID</code> من الأمر <code>docker ps -a</code> الذي قمنا بتشغيله للتو. وتأكد من استبدال معرف الحاوية:
</p>

<pre class="ipsCode">
$docker rm 06069fd5ca23
</pre>

<p>
	بمجرد إزالة جميع الحاويات التي تشير إلى الصورة، يمكننا إزالة الصورة:
</p>

<pre class="ipsCode">
$docker rm 06069fd5ca23
</pre>

<h2>
	الخلاصة
</h2>

<p>
	لقد قمت بتثبيت Docker Compose على دبيان 10، واختبرت التثبيت عن طريق تشغيل مثال Hello World، وأزلت صورة الاختبار والحاوية.
</p>

<p>
	بينما أكد مثال Hello World التثبيت، فإن هذا التكوين الأساسي لا يُظهر إحدى الفوائد الرئيسية لـ Docker Compose – وهي القدرة على إحضار مجموعة من حاويات دوكر للأعلى وللأسفل في نفس الوقت.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-debian-10" rel="external nofollow">How To Install Docker Compose on Debian 10</a> لصاحبيه Brian Hogan و Kathleen Juell
</p>
]]></description><guid isPermaLink="false">464</guid><pubDate>Wed, 29 Apr 2020 14:17:04 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x62F;&#x648;&#x643;&#x631; &#x648;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x647; &#x639;&#x644;&#x649; &#x62F;&#x628;&#x64A;&#x627;&#x646;</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AF%D9%88%D9%83%D8%B1-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-%D8%B9%D9%84%D9%89-%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-r465/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_04/2-how-to-install-and-use-docker-on-debian-10.jpg.f634a75e48cbb186edc6d082e71ac67e.jpg" /></p>

<p>
	يعد <a href="https://www.docker.com/" rel="external nofollow">دوكر</a> تطبيقًا يبسّط إدارة عمليات التطبيق في <em>الحاويات</em>. حيث تتيح لك الحاويات تشغيل تطبيقاتك في عمليات معزولة الموارد فيما بينها. فهي من ناحية المبدأ تشبه Virtual Machines، لكن الحاويات أكثر قابلية للنقل وأكثر ملاءمة للموارد وأكثر اعتمادًا على نظام تشغيل المضيف.
</p>

<p>
	وللحصول على مقدمة تفصيلية للمكونات المختلفة لحاوية دوكر، راجع المقال <a href="https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-an-introduction-to-common-components" rel="external nofollow">نظام Docker Ecosystem: مقدمة إلى المكونات المشتركة.</a>.
</p>

<p>
	في هذا الدليل، ستقوم بتثبيت واستخدام Docker Community Edition ‏(CE) على دبيان 10. حيث ستقوم بتثبيت دوكر بذاته والتعامل مع الحاويات والنِسخ، ورفع نسخة إلى مستودع دوكر.
</p>

<h2>
	المتطلبات
</h2>

<p>
	لمتابعة هذا الدليل، ستحتاج إلى ما يلي:
</p>

<ul>
<li>
		<p>
			خادم دبيان 10 مع مستخدم عادي بصلاحيات sudo بالإضافة لجدار الحماية.
		</p>
	</li>
	<li>
		<p>
			حساب على <a href="https://hub.docker.com/" rel="external nofollow">Docker Hub</a> في حال كنت ترغب في إنشاء نسخك الخاصة ورفعها إلى Docker Hub، كما هو موضح في الخطوتين 7 و 8.
		</p>
	</li>
</ul>
<h2>
	الخطوة 1- تثبيت دوكر
</h2>

<p>
	قد لا تكون حزمة تثبيت دوكر المتوفرة في مستودع دبيان الرسمي حزمًة ذو أحدث إصدار. لذا لضمان حصولنا على أحدث إصدار، سنقوم بتثبيت دوكر من مستودع دوكر الرسمي وذلك بإضافة مصدر حزمة جديد مع مفتاح GPG من دوكر للتأكد من صلاحية التنزيلات، ومن ثم تثبيت الحزمة.
</p>

<p>
	أولاً، قم بتحديث قائمة الحزم الموجودة لديك:
</p>

<pre class="ipsCode">
$ sudo apt update
</pre>

<p>
	بعد ذلك قم بتثبيت بعض الحزم الأساسية التي تتيح لـ <code>apt</code> استخدام الحزم عبر HTTPS:
</p>

<pre class="ipsCode">
$ sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
</pre>

<p>
	ثم أضف مفتاح GPG لمستودع دوكر الرسمي إلى نظامك:
</p>

<pre class="ipsCode">
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add
</pre>

<p>
	أضف مستودع دوكر إلى مصادر APT:
</p>

<pre class="ipsCode">
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
</pre>

<p>
	بعد ذلك قم بتحديث قاعدة بيانات الحزم بحزم دوكر من المستودع المضاف حديثًا:
</p>

<pre class="ipsCode">
$ sudo apt update
</pre>

<p>
	تأكد من أنك على وشك التثبيت من مستودع دوكر بدلاً من مستودع دبيان الافتراضي:
</p>

<pre class="ipsCode">
$ apt-cache policy docker-ce
</pre>

<p>
	سترى مخرجات مثل هذا على الرغم من أن رقم إصدار دوكر قد يكون مختلفًا:
</p>

<pre class="ipsCode">
$ docker-ce:
Installed: (none)
Candidate: 5:18.09.7~3-0~debian-buster
Version table:
5:18.09.7~3-0~debian-buster 500
500 https://download.docker.com/linux/debian buster/stable amd64 Packages
</pre>

<p>
	لاحظ أن <code>docker-ce</code> غير مثبت، لكن المرشح للتثبيت هو من مستودع دوكر لـ دبيان 10 (<code>buster</code>) أخيرًا، قم بتثبيت دوكر:
</p>

<pre class="ipsCode">
$ sudo apt install docker-ce
</pre>

<p>
	تم الآن تثبيت دوكر وبدأ البرنامج الخفي (daemon، العفريت كما يطلق عليه مستخدمو لينكس)، و تم تمكين العملية للبدء في التشغيل. تحقق من أنه يعمل بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
$ sudo systemctl status docker
</pre>

<p>
	سيكون الناتج مشابهًا لما يلي، مما يدل على أن الخدمة نشطة وتعمل:
</p>

<pre class="ipsCode">
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 <abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr>: 5709 (dockerd)
Tasks: 8
Memory: 31.6M
CGroup: /system.slice/docker.service
└─5709 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
</pre>

<p>
	لا يمنحك تثبيت دوكر خدمة Docker daemon وحسب، بل يمنحك أيضًا خط أوامر <code>docker</code>، أو عميل دوكر. سنكتشف كيفية استخدام أمر <code>docker</code> لاحقًا في هذا الدليل التعليمي.
</p>

<h2>
	الخطوة 2- تنفيذ أمر دوكر دون sudo (اختياري)
</h2>

<p>
	افتراضيًا، لا يمكن تشغيل أمر <code>docker</code> إلا للمستخدم الجذر أو بواسطة مستخدم في مجموعة docker، والتي يتم إنشاؤها تلقائيًا أثناء عملية تثبيت دوكر. وإذا حاولت تشغيل الأمر <code>docker</code> دون أن تضيفه إلى <code>sudo</code> أو دون أن تكون في مجموعة docker، فستحصل على ناتج مثل هذا:
</p>

<pre class="ipsCode">
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run –help'.
</pre>

<p>
	إذا كنت تريد تجنب كتابة <code>sudo</code> كلما قمت بتشغيل أمر <code>docker</code>، أضف اسم المستخدم الخاص بك إلى مجموعة <code>docker</code>:
</p>

<pre class="ipsCode">
$ sudo usermod -aG docker ${USER}
</pre>

<p>
	لتطبيق عضوية المجموعة الجديدة، قم بتسجيل الخروج من الخادم والعودة مرة أخرى أو اكتب ما يلي:
</p>

<pre class="ipsCode">
$ su - ${USER}
</pre>

<p>
	عندها سيُطلب منك إدخال كلمة مرور المستخدم للمتابعة. تأكد من إضافة المستخدم الآن إلى مجموعة docker عن طريق كتابة:
</p>

<pre class="ipsCode">
$ id -nG
</pre>

<pre class="ipsCode">
sammy sudo docker
</pre>

<p>
	وإذا كنت بحاجة إلى إضافة مستخدم آخر إلى مجموعة docker التي لم تسجل الدخول بها من قبل، فيمكنك الإعلان عن اسم المستخدم هذا باستخدام:
</p>

<pre class="ipsCode">
$ sudo usermod -aG docker username
</pre>

<p>
	تفترض بقية المقالة هذه أنك تقوم بتشغيل أمر docker كمستخدم في مجموعة docker. في حال اخترت عدم القيام بذلك، يرجى إلحاق الأوامر بـ<code>sudo</code>. دعنا نستكشف أمر <code>docker</code> تاليًا.
</p>

<h2>
	الخطوة 3- استخدام أمر <code>docker</code>
</h2>

<p>
	يتكون استخدام<code>docker</code> من تمرير سلسلة من الخيارات والأوامر متبوعة بالوسطاء (arguments). حيث تأخذ الصيغة هذا الشكل:
</p>

<pre class="ipsCode">
$ docker [option] [command] [arguments]
</pre>

<p>
	لعرض كافة الأوامر الفرعية المتاحة، اكتب:
</p>

<pre class="ipsCode">
$ docker
</pre>

<p>
	فبالنسبة لـ دوكر 18، تتضمن القائمة الكاملة للأوامر الفرعية المتاحة ما يلي:
</p>

<ul>
<li>
		<code>Attach</code> إرفاق تدفقات الإدخال والإخراج والخطأ القياسية المحلية إلى حاوية قيد التشغيل
	</li>
	<li>
		<code>Build</code> إنشاء نسخة من ملف Dockerfile
	</li>
	<li>
		<code>Commit</code> إنشاء نسخة جديدة من تغييرات الحاوية
	</li>
	<li>
		<code>Cb</code> نسخ الملفات / المجلدات بين الحاوية ونظام الملفات المحلي
	</li>
	<li>
		<code>Create</code> إنشاء حاوية جديدة
	</li>
	<li>
		<code>Diff</code> فحص التغييرات بالملفات أو المجلدات على نظام ملفات الحاوية
	</li>
	<li>
		<code>Events</code> معرفة الأحداث مباشرًة من الخادم
	</li>
	<li>
		<code>Exec</code> تشغيل أمر في حاوية قيد التشغيل
	</li>
	<li>
		<code>Export</code> استخراج نظام ملفات الحاوية كإنشاء محفوظة (tar archive)
	</li>
	<li>
		<code>History</code> إظهار تاريخ النسخة
	</li>
	<li>
		<code>Images</code> عرض قائمة النسخ
	</li>
	<li>
		<code>Import</code> استيراد المحتويات من tarball لإنشاء نسخة نظام ملفات
	</li>
	<li>
		<code>Info</code> عرض المعلومات على مستوى النظام
	</li>
	<li>
		<code>Inspect</code> إظهار معلومات منخفضة المستوى عن كائنات دوكر
	</li>
	<li>
		<code>Kill</code> إيقاف حاوية واحدة قيد التشغيل أو أكثر
	</li>
	<li>
		<code>Load</code> تحميل نسخة من أرشيف tar أو STDIN
	</li>
	<li>
		<code>Login</code> تسجيل الدخول إلى سجل دوكر
	</li>
	<li>
		<code>Logout</code> تسجيل الخروج من سجل دوكر
	</li>
	<li>
		<code>Logs</code> عرض سجلات الحاوية
	</li>
	<li>
		<code>Pause</code> إيقاف جميع العمليات مؤقتًا داخل حاوية واحدة أو أكثر
	</li>
	<li>
		<code>Port</code> سرد تعيينات المنافذ (port mappings) أو تعيين معين للحاوية
	</li>
	<li>
		<code>Ps</code> قائمة الحاويات
	</li>
	<li>
		<code>Pull</code> سحب نسخة أو وحدة تخزين (repository) من سجل
	</li>
	<li>
		<code>Push</code> رفع نسخة أو وحدة تخزين إلى السجل
	</li>
	<li>
		<code>Rename</code> إعادة تسمية الحاوية
	</li>
	<li>
		<code>Restart</code> إعادة تشغيل حاوية واحدة أو أكثر
	</li>
	<li>
		<code>Rm</code> إزالة حاوية واحدة أو أكثر
	</li>
	<li>
		<code>Rmi</code> إزالة نسخة واحدة أو أكثر
	</li>
	<li>
		<code>Run</code> تشغيل أمر في حاوية جديدة
	</li>
	<li>
		<code>Save</code> حفظ نسخة أو أكثر في أرشيف tar (يتم بثها إلى STDOUT افتراضيًا)
	</li>
	<li>
		<code>Search</code> بحث في Docker Hub عن النسخ
	</li>
	<li>
		<code>Start</code> بدء تشغيل حاوية واحدة أو أكثر
	</li>
	<li>
		<code>Stats</code> عرض بث مباشر لإحصائيات استخدام موارد الحاوية
	</li>
	<li>
		<code>Stop</code> إيقاف تشغيل حاوية واحدة أو أكثر
	</li>
	<li>
		<code>Tag</code> إنشاء علامة TARGET_IMAGE تشير إلى SOURCE_IMAGE
	</li>
	<li>
		<code>Top</code> عرض العمليات الجارية للحاوية
	</li>
	<li>
		<code>Unpause</code> إلغاء الإيقاف المؤقت لجميع العمليات داخل حاوية واحدة أو أكثر
	</li>
	<li>
		<code>Update</code> تحديث التكوين لحاوية واحدة أو أكثر
	</li>
	<li>
		<code>Version</code> إظهار معلومات إصدار دوكر
	</li>
	<li>
		<code>Wait</code> القيام بالحظر حتى تتوقف حاوية واحدة أو أكثر، ثم اطبع رموز الخروج الخاصة بها
	</li>
</ul>
<p>
	لعرض الخيارات المتاحة لأمر معين، اكتب:
</p>

<pre class="ipsCode">
$ docker docker-subcommand –help
</pre>

<p>
	أما لعرض معلومات على مستوى النظام حول دوكر، يمكنك استخدام:
</p>

<pre class="ipsCode">
$ docker info
</pre>

<p>
	دعنا نستكشف بعضًا من هذه الأوامر. حيث سنبدأ بالعمل مع النسخ.
</p>

<h2>
	الخطوة 4 – التعامل مع نسخ دوكر
</h2>

<p>
	يتم إنشاء حاويات دوكر من نسخ دوكر عندها يقوم تلقائيًّا بسحب هذه النسخات من <a href="https://hub.docker.com/" rel="external nofollow">Docker Hub</a>، وهو سجل تديره الشركة المسؤولة عن مشروع دوكر. حيث يمكن لأي شخص إنزال نسخ دوكر على Docker Hub، لذا فإن معظم التطبيقات وتوزيعات Linux التي ستحتاج إليها ستتم استضافتها هناك.
</p>

<p>
	للتحقق مما إذا كان يمكنك الوصول إلى النسخ وتنزيلها من Docker Hub، اكتب:
</p>

<pre class="ipsCode">
$ docker run hello-world
</pre>

<p>
	سيشير الإخراج إلى أن دوكر يعمل بشكل صحيح:
</p>

<pre class="ipsCode">
Unable 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.
…
</pre>

<p>
	بدايةً لم يتمكن دوكر من العثور على نسخة <code>hello-world</code> محليًا، لذلك تم تنزيل النسخة من وحدة التخزين الافتراضية Docker Hub. فبمجرد تنزيل النسخة، يقوم دوكر بإنشاء حاوية من النسخة ويتم تنفيذ التطبيق ضمن الحاوية عارضاً الرسالة.
</p>

<p>
	يمكنك البحث عن النسخات المتاحة على Docker Hub باستخدام أمر <code>docker</code> مع الأمر الفرعي <code>search</code>. على سبيل المثال، للبحث عن نسخة Ubuntu، اكتب:
</p>

<pre class="ipsCode">
$ docker search ubuntu
</pre>

<p>
	سيقوم هذا البرنامج بالبحث ضمن Docker Hub ويعرض قائمة بجميع النسخات التي يتطابق اسمها مع سلسلة البحث. وفي هذه الحالة، سيكون الناتج مشابهًا لما يلي:
</p>

<pre class="ipsCode">
NAME 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 <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> 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
…
</pre>

<p>
	في العمود OFFICIAL، تشير OK إلى نسخة تم إنشاؤها ودعمها من قبل الشركة المسؤولة عن المشروع. فبمجرد تحديد النسخة التي ترغب باستخدامها، يمكنك تنزيلها على الحاسوب باستخدام الأمر الفرعي <code>pull</code>. قم بتنفيذ الأمر التالي لتنزيل نسخة <code>ubuntu</code> الرسمية على الحاسب:
</p>

<pre class="ipsCode">
$ docker pull ubuntu
</pre>

<p>
	سترى الناتج التالي:
</p>

<pre class="ipsCode">
Using 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
</pre>

<p>
	يمكنك بعد ذلك تشغيل حاوية باستخدام النسخة التي تم تنزيلها بالأمر <code>run</code>. وكما رأيت في مثال <code>hello-world</code>، في حال لم يتم تنزيل صورة عند تنفيذ <code>docker</code> باستخدام الأمر الفرعي <code>run</code>، فسيقوم عميل دوكر بتنزيل النسخة أولاً ثم تشغيل حاوية باستخدامها.
</p>

<p>
	لرؤية النسخات التي تم تنزيلها على الحاسوب، اكتب:
</p>

<pre class="ipsCode">
$ docker images
</pre>

<p>
	ستبدو المخرجات مشابهة لما يلي:
</p>

<pre class="ipsCode">
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 4c108a37151f 2 weeks ago 64.2MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
</pre>

<p>
	كما سترى لاحقًا في هذا الدليل، يمكن تعديل النسخ التي تستخدمها لتشغيل الحاويات واستخدامها لإنشاء نسخ اخرى جديدة، والتي قد يتم رفعها بعد ذلك (يعني يتم عمل <em>push</em> لها حسب المصطلح التقني) إلى Docker Hub أو سجلات دوكر الأخرى. سنرى في الخطوة التالية كيفية تشغيل الحاويات بمزيد من التفاصيل.
</p>

<h2>
	الخطوة 5 - تشغيل حاوية دوكر
</h2>

<p>
	إن حاوية <code>hello-world</code> التي قمت بتشغيلها في الخطوة السابقة هي مثال على حاوية يتم تشغيلها والخروج منها بعد بث رسالة اختبار. فيمكن للحاويات ان تكون تفاعلية و أكثر فائدة من ذلك. فهي تشبه الآلات الافتراضية، لكن أكثر ملاءمة للموارد.
</p>

<p>
	كمثال، لنقم بتشغيل حاوية باستخدام أحدث نسخة لـ Ubuntu. حيث يمنحك الجمع بين المبدلين <strong>‎-i</strong> و <strong>‎-t</strong> إمكانية الوصول التفاعلي إلى القشرة في الحاوية (interactive shell access):
</p>

<pre class="ipsCode">
$ docker run -it ubuntu
</pre>

<p>
	يجب تغيير موجه الأوامر ليعكس حقيقة أنك تعمل الآن داخل الحاوية ويجب أن يأخذ هذا النموذج:
</p>

<pre class="ipsCode">
root@d9b100f2f636:/#
</pre>

<p>
	لاحظ معرف الحاوية في موجه الأوامر. نظرًا الى هذا المثال، يكون المعرف <code>d9b100f2f636</code>. فستحتاج إلى معرّف الحاوية هذا لاحقًا لتحديد الحاوية عندما تريد إزالتها. الآن يمكنك تشغيل أي أمر داخل الحاوية. فعلى سبيل المثال، فلنقم بتحديث قاعدة بيانات الحزمة داخل الحاوية. لست بحاجة إلى إضافة أي أمر باستخدام <code>sudo</code>، لأنك تعمل داخل الحاوية كمستخدم جذر (root):
</p>

<pre class="ipsCode">
root@d9b100f2f636:/# apt update
</pre>

<p>
	ثم قم بتثبيت أي تطبيق فيه. دعنا نثبت Node.js:
</p>

<pre class="ipsCode">
root@d9b100f2f636:/# apt install nodejs
</pre>

<p>
	يؤدي هذا إلى تثبيت Node.js في الحاوية من مستودع Ubuntu الرسمي. وعند انتهاء التثبيت، تحقق من تثبيت Node.js:
</p>

<pre class="ipsCode">
root@d9b100f2f636:/# node -v    
</pre>

<p>
	سترى رقم الإصدار المعروض في جهازك الطرفي:
</p>

<pre class="ipsCode">
v8.10.0
</pre>

<p>
	أي تغييرات تجريها داخل الحاوية تنطبق فقط على الحاوية نفسها. للخروج من الحاوية، اكتب <code>exit</code> في واجهة الأوامر. دعنا نلقي نظرة على إدارة الحاويات على نظامنا بعد ذلك.
</p>

<h2>
	الخطوة 6- إدارة حاويات دوكر
</h2>

<p>
	بعد استخدام دوكر لفترة من الوقت، سيكون لديك العديد من الحاويات النشطة (قيد التشغيل) وغير النشطة على الحاسوب الخاص بك. ولعرض الحاويات النشطة، استخدم:
</p>

<pre class="ipsCode">
$ docker ps
</pre>

<p>
	سترى ناتج مشابه لما يلي:
</p>

<pre class="ipsCode">
CONTAINER ID IMAGE COMMAND CREATED
</pre>

<p>
	في هذا الدليل التعليمي، بدأت حاويتين؛ واحدة من نسخة <code>hello-world</code> والأخرى من نسخة <code>ubuntu</code>. بحيث لم يعد كلا الحاويتين قيد التشغيل، لكنهما لا تزالان موجودتان على نظامك. لعرض جميع الحاويات - النشطة وغير النشطة، قم بتشغيل <code>docker ps</code> باستخدام المبدّل <code>‎-a</code>:
</p>

<pre class="ipsCode">
$ docker ps -a
</pre>

<p>
	سترى مخرجات مشابهة لهذا:
</p>

<pre class="ipsCode">
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
</pre>

<p>
	لعرض أحدث حاوية قمت بإنشائها، قم بتشغيل <code>docker ps</code> باستخدام <code>‎-l</code>:
</p>

<pre class="ipsCode">
$ docker ps -l
</pre>

<pre class="ipsCode">
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

d42d0bbfbd35 ubuntu "/bin/bash" About a minute ago Exited (0) 34 seconds ago friendly_volhard
</pre>

<p>
	لبدء تشغيل حاوية ما، استخدم <code>docker start</code>، متبوعًا بمعرف الحاوية أو اسم الحاوية. لنبدأ الحاوية القائمة على Ubuntu بمعرف d9b100f2f636:
</p>

<pre class="ipsCode">
$ docker start d42d0bbfbd35
</pre>

<p>
	عندها ستبدأ الحاوية، ويمكنك استخدام <code>docker ps</code> لمعرفة حالتها:
</p>

<pre class="ipsCode">
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d42d0bbfbd35 ubuntu "/bin/bash" About a minute ago Up 8 seconds friendly_volhard
</pre>

<p>
	لإيقاف حاوية جارية، استخدم <code>docker stop</code>، متبوعًا بمعرف الحاوية أو الاسم. وهذه المرة سنستخدم الاسم الذي خصصه دوكر للحاوية، الا وهو <code>friendly_volhard</code>:
</p>

<pre class="ipsCode">
$ docker stop friendly_volhard
</pre>

<p>
	بمجرد أن تقرر أنك لم تعد بحاجة إلى الحاوية بعد الآن، قم بإزالتها باستخدام الأمر <code>docker rm</code>، مرة أخرى باستخدام إما معرف الحاوية أو إسمها. يمكنك استخدام الأمر <code>docker ps -a</code> للعثور على معرف الحاوية أو اسم الحاوية المرتبط بصورة <code>hello-world</code> وإزالتها.
</p>

<pre class="ipsCode">
$ docker rm elegant_neumann
</pre>

<p>
	يمكنك بدء حاوية جديدة وتسميتها باستخدام المفتاح<code>--name</code>. ويمكنك أيضًا استخدام المبدل <code>‎--rm</code> لإنشاء حاوية تزيل نفسها عندما تتوقف. راجع الأمر <code>help docker run</code> للحصول على مزيد من المعلومات حول هذه الخيارات وغيرها.
</p>

<p>
	يمكن تحويل الحاويات إلى صور يمكنك استخدامها لبناء حاويات جديدة. دعونا نلقي نظرة على كيفية عمل ذلك.
</p>

<h2>
	الخطوة 7- إحداث التغييرات في حاوية لنسخة دوكر
</h2>

<p>
	عند بدء تشغيل نسخة من دوكر، يمكنك إنشاء الملفات وتعديلها وحذفها تمامًا كما يمكنك باستخدام جهاز افتراضي (virtual machine). حيث ستنطبق التغييرات التي تجريها على تلك الحاوية فقط.. يمكنك تشغيلها وإيقافها، لكن بمجرد ازالتها باستخدام الأمر <code>docker rm</code>، ستفقد التغييرات للأبد.
</p>

<p>
	يوضح لك هذا القسم كيفية حفظ حالة الحاوية كنسخة دوكر جديدة.
</p>

<p>
	بعد تثبيت Node.js داخل حاوية Ubuntu، لديك الآن حاوية تعمل على نسخة معينة، لكن هذه الحاوية مختلفة عن النسخة (image) التي استخدمتها لإنشائها. عندها قد ترغب في إعادة استخدام حاوية Node.js هذه كأساس للنسخ الجديدة لاحقًا.
</p>

<p>
	ثم قم بتنفيذ التغييرات على نسخة دوكر جديدة باستخدام الأمر التالي.
</p>

<pre class="ipsCode">
$ docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
</pre>

<p>
	إن المفتاح <strong>‎-m</strong> مخصص لرسالة التنفيذ (commit message) التي تساعدك والآخرين على معرفة التغييرات التي أجريتها، بينما يُستخدم <strong>‎-a</strong> لتحديد المؤلف. معرف الحاوية <code>container_id</code> هو الحاوية التي لاحظتها سابقًا في الدليل عندما بدأت جلسة دوكر التفاعلية. إلا إذا قمت بإنشاء مستودعات إضافية على Docker Hub، فعادة ما يكون المستودع هو اسم مستخدم Docker Hub. على سبيل المثال، بالنسبة للمستخدم sammy بمعرّف الحاوية <code>d9b100f2f636</code>، سيكون الأمر كما يلي:
</p>

<pre class="ipsCode">
$ docker commit -m "added Node.js" -a "sammy" d42d0bbfbd35 sammy/ubuntu-nodejs
</pre>

<p>
	وعند تنفيذك نسخة ما، يتم حفظ النسخة الجديدة محليًا على جهاز الحاسب الخاص بك. لاحقًا في هذا الدليل، ستتعلم كيفية رفع نسخة إلى سجل دوكر مثل Docker Hub حتى يتمكن الآخرون من الوصول إليها. سيؤدي إدراج نسخ دوكر مرة أخرى إلى إظهار النسخة الجديدة، بالإضافة إلى النسخة القديمة التي تم اشتقاقها منها:
</p>

<pre class="ipsCode">
$ docker images
</pre>

<p>
	سترى مخرجات مثل هذا:
</p>

<pre class="ipsCode">
REPOSITORY 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
</pre>

<p>
	في هذا المثال، <code>ubuntu-nodejs</code> هي النسخة الجديدة التي تم اشتقاقها من نسخة <code>ubuntu</code> الموجودة من Docker Hub. حيث يعكس اختلاف الحجم التغييرات التي تم إجراؤها. وفي هذا المثال، كان التغيير هو تثبيت NodeJS. لذا في المرة القادمة التي تحتاج فيها إلى تشغيل حاوية باستخدام Ubuntu مع NodeJS مثبتة مسبقًا، يمكنك فقط استخدام النسخة الجديدة.
</p>

<p>
	يمكنك أيضًا إنشاء نسخ من ملف <code>Dockerfile</code>، والذي يتيح لك أتمتة تثبيت البرنامج في نسخة جديدة. لكن يعد هذا خارج نطاق المقال.
</p>

<p>
	الآن دعنا نشارك النسخة الجديدة مع الآخرين حتى يتمكنوا من إنشاء حاويات منها.
</p>

<h2>
	الخطوة 8- رفع نسخ دوكر إلى مستودع دوكر
</h2>

<p>
	الخطوة المنطقية التالية بعد إنشاء نسخة جديدة من نسخة موجودة هي مشاركتها مع عدد قليل من أصدقائك أو العالم كله على Docker Hub أو أي سجل دوكر آخر يمكنك الوصول إليه. و لرفع نسخة ما إلى Docker Hub أو أي سجل دوكر آخر، يجب أن يكون لديك حساب هناك.
</p>

<p>
	يوضح لك هذا القسم كيفية رفع نسخة دوكر إلى Docker Hub. ولمعرفة كيفية إنشاء سجل دوكر الخاص بك، تفقد <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-a-private-docker-registry-on-ubuntu-14-04" rel="external nofollow">كيفية إعداد سجل دوكر خاص على Ubuntu 14.04</a> لرفع نسختك، قم أولاً بتسجيل الدخول إلى Docker Hub.
</p>

<pre class="ipsCode">
$ docker login -u docker-registry-username
</pre>

<p>
	عندها ستتم مطالبتك بالمصادقة باستخدام كلمة مرور Docker Hub. و إذا حددت كلمة المرور الصحيحة، فيجب أن تنجح المصادقة.
</p>

<p>
	ملاحظة: إذا كان اسم مستخدم سجل دوكر الخاص بك مختلفًا عن اسم المستخدم المحلي الذي استخدمته لإنشاء النسخة، فسيتعين عليك وضع علامة على نسختك باسم مستخدم التسجيل خاصتك. بالنسبة للمثال الوارد في الخطوة الأخيرة، اكتب:
</p>

<pre class="ipsCode">
$ docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
</pre>

<p>
	ثم يمكنك رفع نسختك باستخدام:
</p>

<pre class="ipsCode">
$ docker push docker-registry-username/docker-image-name
</pre>

<p>
	لرفع نسخة <code>ubuntu-nodejs</code> إلى مستودع sammy، سيكون الأمر على الشكل التالي:
</p>

<pre class="ipsCode">
$ docker push sammy/ubuntu-nodejs
</pre>

<p>
	قد تستغرق العملية بعض الوقت حتى تكتمل أثناء تحميل النسخ، ولكن عند اكتمالها سيبدو الإخراج كما يلي:
</p>

<pre class="ipsCode">
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
…
</pre>

<p>
	بعد رفع النسخة إلى السجل، يجب أن تكون مدرجة في لوحة تحكم حسابك مثل تلك التي تظهر في الصورة أدناه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="43002" href="https://academy.hsoub.com/uploads/monthly_2020_04/Image1.png.718e23be482880279b14bdd5e89fabdb.png" rel=""><img alt="Image1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="43002" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_04/Image1.thumb.png.039a4002ef8440ee4752320a670e5b5b.png"></a>
</p>

<p>
	إذا أظهرت محاولة الرفع خطأ من هذا النوع، فمن المحتمل أنك لم تقم بتسجيل الدخول:
</p>

<pre class="ipsCode">
The 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
</pre>

<p>
	قم بتسجيل الدخول باستخدام <code>docker login</code> وتكرار محاولة الرفع. ثم أثبت وجوده في صفحة مستودع Docker Hub الخاص بك.
</p>

<p>
	يمكنك الآن استخدام <code>docker pull sammy/ubuntu-nodejs</code> لسحب النسخة إلى جهاز جديد واستخدامها لتشغيل حاوية جديدة.
</p>

<h2>
	الخلاصة
</h2>

<p>
	لقد قمت بتثبيت دوكر، وعملت بالنسخ والحاويات، ورفعت نسخة معدلة إلى Docker Hub. الآن بعد أن تعرفت على الأساسيات، استكشف بقية دروس أكاديمية حسوب قسم DevOps.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-debian-10" rel="external nofollow">How To Install and Use Docker on Debian 10</a> لصاحبه Brian Hogan
</p>
]]></description><guid isPermaLink="false">465</guid><pubDate>Wed, 29 Apr 2020 14:17:33 +0000</pubDate></item><item><title>&#x645;&#x627; &#x639;&#x644;&#x64A;&#x643; &#x645;&#x639;&#x631;&#x641;&#x62A;&#x647; &#x639;&#x646; &#x627;&#x644;&#x641;&#x631;&#x642; &#x628;&#x64A;&#x646; &#x62F;&#x648;&#x643;&#x631; &#x648;&#x627;&#x644;&#x623;&#x62C;&#x647;&#x632;&#x629; &#x627;&#x644;&#x627;&#x641;&#x62A;&#x631;&#x627;&#x636;&#x64A;&#x629;</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D9%85%D8%A7-%D8%B9%D9%84%D9%8A%D9%83-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87-%D8%B9%D9%86-%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%AF%D9%88%D9%83%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-r456/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/5e2fda897a373_--------.jpg.1c3a2f26e2238b916a3d5ec66eaca2f2.jpg" /></p>

<p>
	ما الفرق بين دوكر (Docker) والأجهزة الافتراضية (والمسماة أيضًا بالأجهزة الظاهرية Virtual Machines)؟ سنشرح في هذا المقال الاختلافات بينهما، وسنذكر وجهة نظرنا لمساعدتك على الاختيار.
</p>

<h2>
	ما هو دوكر؟
</h2>

<p>
	تسعى المؤسسات هذه الأيام إلى تحويل أعمالها إلى أعمال إلكترونية، ولكن يعيقها التنوع الكبير في البنية التحتية في داخل المؤسسة نفسها وفي الحوسبة السحابية والتطبيقات. يحل دوكر هذه المشكلة بتوفير منصة حاويات تساعد على تحويل الخدمات الصغيرة والتطبيقات التقليدية المبنية لويندوز ولينكس والخوادم الكبيرة إلى سلسلة إمداد مؤتمتة وآمنة.
</p>

<p>
	إنّ دوكر أداة تطوير برمجيات وتقنية حوسبة ظاهرية تسهِّل تطوير ونشر وإدارة التطبيقات باستخدام حاويات. والحاويات هي حزم تنفيذية خفيفة وقائمة بذاتها لتطبيق ما، تحوي كل المكتبات وملفات الإمداد والاعتماديات والأجزاء الأخرى الضرورية ليعمل التطبيق.
</p>

<p>
	وبعبارة أخرى، فإنّ التطبيقات تعمل بنفس الطريقة بغضّ النظر عن مكانها أو نوع الجهاز الذي تعمل عليه، وذلك لأن الحاوية توفّر بيئة التطبيق طوال دورة حياة البرنامج. وبما أنّ الحاويات معزولة، فأنها توفر أمنًا إضافيًّا، مما يسمح لتشغيل أكثر من حاوية على نفس الجهاز في نفس الوقت. إضافة إلى ذلك، فهذه الحاويات خفيفة لأنها لا تتطلّب حملًا إضافيًّا كالأجهزة الافتراضية. تشغّل الأجهزة الافتراضية أنظمة مستضافة (كما في حالة VMWare و VirtualBox)، أما الحاويات فتعمل ضمن نواة النظام المضيف مباشرة دون الحاجة إلى نظام ضيف.
</p>

<p>
	تتميّز الحاويات عن الأجهزة الافتراضية بما يلي:
</p>

<ul>
<li>
		تحتاج موارد أقل لإدارتها.
	</li>
	<li>
		حجم نسخ احتياطيّة فوريّة (snapshots) أصغر.
	</li>
	<li>
		أسرع في عمل نسخ معدّلة للتطبيقات.
	</li>
	<li>
		تحديثات أمنية أقل وأبسط.
	</li>
	<li>
		كتابة شيفرات أقلّ لنقل وترحيل ورفع العمل.
	</li>
</ul>
<h2>
	ما هي الأجهزة الافتراضية؟
</h2>

<p>
	أما عن الأجهزة الافتراضية، فتُستَخدَم لتنفيذ مهام قد تكون خطرة لو تم تنفيذها على النظام المضيف. الأجهزة الافتراضية معزولة عن بقية النظام، ولا يمكن للنظام الضيف أن يعبث بالجهاز المضيف. ولهذا، فبعض المهام - كالوصول إلى ملفات مصابة بفيروسات، واختبار أنظمة التشغيل - تُستخدَم معها الأجهزة الافتراضية. يمكننا تعريف الجهاز الافتراضيّ كما يلي: الجهاز الافتراضيّ هو ملف أو برمجيّة حاسوب يُشار إليها عادة بـ"الضيف" (guest) تُنشَأ في داخل بيئة حاسوبيّة أخرى تُسمّى "المضيف".
</p>

<p>
	باستطاعة الجهاز الافتراضيّ تنفيذ مهام كتشغيل التطبيقات أو البرامج كحاسوبٍ مستقِلّ، مما يجعله بيئة مثاليّة لتجربة أنظمة تشغيل أخرى، كالإصدارات التجريبيّة، وعمل نسخ احتياطيّة لأنظمة التشغيل، وتشغيل تطبيقات وبرمجيات. ويمكن للنظام المضيف أن يحوي عددًا من الأجهزة الافتراضية، وأن تعمل كلّها أو بعضها في نفس الوقت. ومن الملفات التي يتكوّن منها الجهاز الافتراضيّ: ملفات التقارير، وإعدادات الذاكرة، وملف القرص الصلب الافتراضيّ، وملف الإعدادات. ومن المجالات الأخرى التي تحتاج إلى أجهزة افتراضيّة الخوادم؛ حيث يمكن تقسيم خادم حقيقيّ إلى عدد من الخوادم الافتراضيّة المنفصلة والمعزولة عن بعضها، ممّا يسمح لهذه الخوادم الافتراضيّة أن تعمل بأنظمة تشغيل خاصة بها. ويوفِّر كلّ جهاز افتراضيّ عتاده الافتراضيّ، كالمُعالِج، والذاكرة، وواجهات الشبكة، والأقراص الصلبة، وأجهزة أخرى.
</p>

<p>
	عمومًا، تقسَّم الأجهزة الافتراضيّة إلى فئتين حسب استخدامها:
</p>

<ol>
<li>
		أجهزة افتراضيّة على مستوى النظام: وهي منصّات تسمح بوجود عدد من الأجهزة الافتراضيّة يعمل كلّ منها بنسخة نظام تشغيل خاصّة به وتتشارك كلها في موارد الجهاز المضيف. وتوفِّر الطبقة البرمجيّة التي تشغّل الأجهزة الافتراضيّة من هذا النوع (والمسماة Hypervisor) التقنيات المتعلقة بتنفيذ الأجهزة الافتراضيّة. وتُنفَّذ هذه الطبقة فوق نظام التشغيل المضيف أو على العتاد مباشرة.
	</li>
	<li>
		أجهزة افتراضية على مستوى الخدمات: تتيح هذه الأجهزة بيئة برمجة مستقلّة. وتُصمَّم خدمة الجهاز الافتراضيّ لإخفاء المعلومات المتعلّقة بالعتاد ونظام التشغيل وتسمح للبرنامج بالعمل بنفس الطريقة في كلّ منصّة من هذا النوع.
	</li>
</ol>
<p>
	وعلى الرغم من أن تشغيل عدد من الأجهزة الافتراضيّة يبدو للوهلة الأولى استغلالًا جيّدًا للموارد، إلّا أنّه يؤدي إلى أداء سيء؛ إذ سيكون لكلّ نظام ضيف نواته ومجموعة مكتباته واعتمادياته، مما سيشغل قدرًا كبيرًا من موارد النظام. ومن العيوب الأخرى للأجهزة الافتراضيّة قلّة أداء برمجية مشرف الجهاز الافتراضيّ (Hypervisor) موازنة بالعتاج الحقيقيّ، وكذلك المدة الطويلة التي يحتاجها ليقلع النظام ويكون جاهزًا للعمل. يتغلّب مفهوم الحاويات -بما في ذلك منصّة دوكر- على هذه العقبات.
</p>

<h2>
	الموازنة
</h2>

<p>
	فيما يلي الاختلافات المهمّة بين دوكر والأجهزة الافتراضيّة.
</p>

<h3>
	1. المعمارية ودعم أنظمة التشغيل
</h3>

<p>
	الاختلاف الرئيسي بين دوكر والأجهزة الافتراضيّة يكمن في المعمارية، كما هو موضّح في ما يلي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_01/01-docker.png.dfdb40b52d31769f2028c9200c9a0a32.png" data-fileid="33516" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="33516" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_01/01-docker.thumb.png.8f7c7f51171b766e013ea24eb036de64.png" alt="01-docker.png"></a>
</p>

<p>
	في حال الأجهزة الافتراضيّة، لدينا نظام تشغيل مضيف، ولدينا نظام تشغيل ضيف في كلّ جهاز افتراضيّ، ويمكن ان يكون نظام التشغيل الضيف أيّ نظام تشغيل - مثل ويندوز أو لينكس - بغض النظر عن النظام المضيف. أما دوكر فيستضيف البرمجيات على نفس النظام المضيف. مشاركة النظام المضيف بين الحاويات يجعلها خفيفة وسريعة عند تشغيلها. وتعدّ حاويات دوكر مناسبة لتشغيل عدد من التطبيقات على نواة نظام تشغيل واحدة؛ أما الأجهزة الافتراضية فهي ضروريّة إذا كان التطبيق أو الخدمة بحاجة إلى نظام تشغيل مختلف.
</p>

<h3>
	2. الأمن
</h3>

<p>
	الأجهزة الافتراضيّة قائمة بذاتها، ولها نواتها وخصائصها المتعلقة بالأمن. ولهذا، تُستخدَم الأجهزة الافتراضيّة لتشغيل التطبيقات التي تحتاج إلى صلاحيات وأمان أكثر.
</p>

<p>
	أما بالنسبة لدوكر، فلا يُنصح بإعطاء صلاحيات عُليا للتطبيقات أو تشغيلها بصلاحيات المسؤول أو الجذر، وذلك لأنّ هذه الحاويات تتشارك مع النظام المضيف نواته؛ حيث يمكن لتقنية الحاويات الوصول إلى الأنظمة التابعة للنواة؛ مما يعني أن وجود تطبيق واحد مُصاب ببرمجية خبيثة يمكن أن يؤدّي إلى اختراق النظام المستضيف بأكمله.
</p>

<h3>
	3. إمكانية النقل
</h3>

<p>
	الأجهزة الافتراضيّة معزولة عن النظام الذي تعمل عليه، ولهذا فهي لا تنتقل إلى أنظمة أخرى بدون حدوث مشكلات تتعلق بالتوافقيّة. ولهذا، إذا كان من الضروريّ اختبار التطبيق على منصات مختلفة في مرحلة التطوير، فيجب أخذ دوكر بالحسبان في هذه الحالة.
</p>

<p>
	إنّ حزم حاويات دوكر تحوي كل ما تحتاجه، ويمكنها تشغيل التطبيقات في أيّ بيئة، وبما أنها لا تحتاج إلى نظام تشغيل ضيف، فيمكن نقلها بسهولة إلى منصات مختلفة. كذلك، يمكن نشر حاويات دوكر في الخوادم، وذلك لأنها خفيفة، ويمكن تشغيلها وإيقافها في وقت أقلّ بكثير من الأجهزة الافتراضيّة.
</p>

<h3>
	4. الأداء
</h3>

<p>
	تحتاج الأجهزة الافتراضيّة إلى موارد أكثر من حاويات دوكر، فهي بحاجة إلى تحميل نظام تشغيل بأكمله عند بدئها. أما حاويات دوكر فهي ذات معمارية خفيفة ولا تحتاج موارد كثيرة كما في الأجهزة الافتراضيّة.
</p>

<p>
	في حال الأجهزة الافتراضيّة تكون الموارد - بما فيها المعالج والذاكرة والدخل/الخرج - ثابتة لا تتغير، على خلاف الحاويات، والتي يزداد استخدام الموارد فيها حسب الحمل أو كمية البيانات المارّة.
</p>

<p>
	توسعة واستنساخ الحاويات بسيط وسهل مقارنة بالأجهزة الافتراضيّة، حيث لا تحتاج هذه الحاويات إلى تثبيت أنظمة تشغيل فيها.
</p>

<p>
	في ما يلي بعض الاختلافات الأخرى بين الاثنين، عدا عن الاختلافات الرئيسيّة:
</p>

<table>
<thead><tr>
<th>
				...
			</th>
			<th>
				دوكر
			</th>
			<th>
				الأجهزة الافتراضيّة
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<strong>وقت الإقلاع</strong>
			</td>
			<td>
				تُقلِع في ثوانٍ قليلة
			</td>
			<td>
				يستغرق تشغيل الجهاز الافتراضي بضع دقائق
			</td>
		</tr>
<tr>
<td>
				<strong>تعمل على</strong>
			</td>
			<td>
				يستفيد دوكر من محرّك التنفيذ (excution engine)
			</td>
			<td>
				تستخدم مشرف الأجهزة الافتراضيّة (hypervisor)
			</td>
		</tr>
<tr>
<td>
				<strong>كفاءتها في استخدام الذاكرة</strong>
			</td>
			<td>
				تحتاج ذاكرة قليلة وذلك لعدم حاجتها إلى جهاز افتراضيّ
			</td>
			<td>
				تحتاج إلى تحميل نظام تشغيل كامل قبل أن تبدأ التطبيق، ولهذا فهي أقل كفاءة من هذه الناحية.
			</td>
		</tr>
<tr>
<td>
				<strong>العزل</strong>
			</td>
			<td>
				معرّضة لاستغلالها بطريقة سيئة، وذلك لعدم وجود احتياطات لأنظمة العزل
			</td>
			<td>
				إمكانيّة التعارض بينها منخفضة بسبب كفاءة آليّة العزل فيها
			</td>
		</tr>
<tr>
<td>
				<strong>النشر</strong>
			</td>
			<td>
				نشرها سهل، حيث يمكن استخدام نسخة واحدة في حاوية على كل المنصات
			</td>
			<td>
				النشر يأخذ وقتًا أطول، وذلك لوجود نماذج منفصلة مسؤولة عن التنفيذ
			</td>
		</tr>
<tr>
<td>
				<strong>الاستخدام</strong>
			</td>
			<td>
				لدى دوكر آليّة استخدام مركّبة تتكون من أدوات تديرها دوكر وأخرى من أطراف خارجيّة
			</td>
			<td>
				الأدوات سهلة وأبسط في الاستخدام
			</td>
		</tr>
</tbody>
</table>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<h2>
	أيّ الخيارين أفضل؟
</h2>

<p>
	لا يمكن موازنة دوكر بالأجهزة الافتراضيّة بعدالة، إذ صُمِّمت كلّ منها لاستخدامات مختلفة. لا شكّ بأنّ دوكر ينتشر بقوّة هذه الأيّام، ولكن لا يمكنه أن يحلّ محلّ الأجهزة الافتراضيّة. وعلى الرغم من أنّ دوكر يزداد شعبيّة، إلّا انّ الأجهزة الافتراضيّة خيار أفضل في حالات معيّنة. تُعدّ الأجهزة الافتراضيّة خيارًا مناسبًا في الإصدارات النهائيّة، وهي أفضل من حاويات دوكر في هذه الحالة، حيث تعمل هذه الأجهزة الافتراضيّة بنظام تشغيلها الخاص دون أن تشكّل خطرًا على الحاسوب المضيف. ولكن إذا كانت التطبيقات بحاجة إلى اختبار، فالخيار الأفضل هو دوكر، إذ يقدّم منصات أنظمة تشغيل مختلفة يمكن استخدامها لعمل اختبارات كثيرة للتطبيق أو البرنامج.
</p>

<p>
	إضافة إلى ذلك، تستخدم حاويات دوكر محرّك دوكر (docker-engine) بدلًا من استخدام مشرف (hypervisor) كالذي تستخدمه الأجهزة الافتراضيّة. وبما أنّ النواة المضيفة مشتركة، فإنّ استخدام محرك دوكر يجعل الحاويات صغيرة ومعزولة ومتوافقة وعالية الأداء وسريعة الاستجابة. لحاويات دوكر عبء اقلّ، حيث أنها متوافقة بتشارك نفس النواة ومكتبات تطبيقات. تستفيد المؤسسات من خليط من الاثنين غالبًا، حيث يعتمد الاختيار في كلّ حالة على نوع الحمل الذي تحتاجه المؤسسة.
</p>

<p>
	لا تعتمد كثير من المؤسسات على الأجهزة الافتراضيّة كخيارها الرئيسيّ، وتفضّل الانتقال إلى استخدام الحاويات، حيث انّ عمليّة النشر تكون طويلة وتأخذ وقتًا، وتشغيل خدمات مصغّرة من التحديات الكبيرة التي تنشأ منها. على الرغم من هذا، ما زالت هناك شركات تفضّل الأجهزة الافتراضيّة على دوكر، أما الشركات التي تستخدم خدمات أمن مخصصة للشركات لبنيتها التحتيّة تفضل الاستفادة من دوكر.
</p>

<p>
	خلاصة القول أن الحاويات ودوكر ليست في صراع مع الأجهزة الافتراضيّة، حيث تكمل كلّ منهما الأخرى في أعمال واستخدامات مختلفة. تُنشأ الأجهزة الافتراضيّة للتطبيقات التي عادة تكون ثابتة ولا تتغير كثيرًا، أمّا منصّة دوكر فهي مصمّمة لتكون مرنة أكثر بحيث يمكن تحديث هذه الحاويات بسهولة وباستمرار.
</p>

<p>
	هل دوكر مجرد "موضة"؟ أم أنّه سيحلّ محلّ الأجهزة الافتراضيّة؟ هل لديك ما تشاركنا به؟ شاركنا برأيك في التعليقات.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://cloudacademy.com/blog/docker-vs-virtual-machines-differences-you-should-know/" rel="external nofollow">Docker vs. Virtual Machines: Differences You Should Know</a> لصاحبه Simran Arora
</p>
]]></description><guid isPermaLink="false">456</guid><pubDate>Mon, 03 Feb 2020 13:03:01 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; LAMP &#x623;&#x648; LEMP &#x628;&#x633;&#x647;&#x648;&#x644;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-lamp-%D8%A3%D9%88-lemp-%D8%A8%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-docker-r364/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/16.png.e25a1a9aac2c5a805e730e1552623c27.png" /></p>

<p>
	لعلك تتساءل عن السبب الذي يجعلنا نستخدم Docker لتثبيت lamp أو lemp في حين أننا نستطيع تثبيتهما يدويًا؟ فتثبيتهما سهل ولا يحتاج إلى الكثير من التعقيد، لماذا نلجأ إلى Docker؟ دعني أجيب عن هذا السؤال، إنّ docker برنامج خفيف ويغنينا عن الحاجة إلى الآلات الوهمية مثل Virtualbox أو Xen أو غيرهما لنختبر أو نثبت أنظمة التشغيل.<br>
	وفائدته معنا في هذا المقال أننا نستطيع استخدامه لسحب نسخ جاهزة من LAMP أو LEMP لتشغيلها في بضع دقائق، بدلًا من التثبيت اليدوي لأباتشي، ثم قاعدة بيانات مثل MariaDB أو mySQL، ثم PHP. وتحدث هذه الحالة التي تحتاج فيها إلى نسخة جاهزة وسريعة لاختبار شيء ما عليها إن كنت مطورًا أو مختبرًا أو شغوفًا بالبرمجة وتريد أن تختبر تطبيقًا يعمل في الويب، فتجد نفسك في حاجة إلى تثبيت كل تلك الخطوات التي ذكرتها في الفقرة السابقة، ولعلك جربت هذا من قبل ووجدتها عملية مرهقة وطويلة، وهنا تبرز ميزة Docker حيث يمكننا تثبيت وتشغيل برامج جاهزة ومعدة مسبقًا مباشرة دون الحاجة إلى خوض تفاصيلها التقنية كأننا نثبتها لأول مرة بأنفسنا. وهو ما سنشرحه في هذا المقال على LAMP أو LEMP.
</p>

<h2 id="تثبيت-lamplemp-باستخدام-docker">
	تثبيت LAMP/LEMP باستخدام Docker
</h2>

<p>
	دعنا نبحث في docker عن نسخ جاهزة من LAMP أو LEMP:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
$ sudo docker search lamp</pre>

<p>
	وسيكون الخرج مشابهًا لهذا:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs applescript"><span class="pln">NAME DESCRIPTION STARS OFFICIAL AUTOMATED
 reinblau</span><span class="pun">/</span><span class="pln">lamp </span><span class="typ">Dockerfile</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> PHP</span><span class="pun">-</span><span class="typ">Projects</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> </span><span class="typ">MySql</span><span class="pln"> client </span><span class="hljs-number"><span class="lit">17</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 dockie</span><span class="pun">/</span><span class="pln">lamp </span><span class="hljs-number"><span class="lit">6</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 nickistre</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="pun">-</span><span class="pln">lamp LAMP server </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> </span><span class="typ">Ubuntu</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 nickistre</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="pun">-</span><span class="pln">lamp</span><span class="pun">-</span><span class="pln">wordpress LAMP </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> </span><span class="typ">Ubuntu</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> wp</span><span class="pun">-</span><span class="pln">cli installed </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 nickistre</span><span class="pun">/</span><span class="pln">centos</span><span class="pun">-</span><span class="pln">lamp LAMP </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> centos setup </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 damienlagae</span><span class="pun">/</span><span class="pln">lamp </span><span class="typ">Docker</span><span class="pln"> LAMP </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> supervisord </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 boolean93</span><span class="pun">/</span><span class="pln">lamp LAMP based </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> linode</span><span class="pun">/</span><span class="pln">lamp </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 drunomics</span><span class="pun">/</span><span class="pln">lamp </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 avatao</span><span class="pun">/</span><span class="pln">lamp LAMP </span><span class="kwd">base</span><span class="pln"> image </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 nickistre</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="pun">-</span><span class="pln">lamp</span><span class="pun">-</span><span class="pln">xdebug LAMP </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> </span><span class="typ">Ubuntu</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> xdebug installed </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 nickistre</span><span class="pun">/</span><span class="pln">centos</span><span class="pun">-</span><span class="pln">lamp</span><span class="pun">-</span><span class="pln">wordpress LAMP </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> </span><span class="typ">CentOS</span><span class="pln"> setups </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> wp</span><span class="pun">-</span><span class="pln">cli installed </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 linuxconfig</span><span class="pun">/</span><span class="pln">lamp </span><span class="typ">Automated</span><span class="pln"> build LAMP stack environment </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pun">...</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 greyltc</span><span class="pun">/</span><span class="pln">lamp a </span><span class="kwd">super</span><span class="pln"> secure</span><span class="pun">,</span><span class="pln"> up</span><span class="pun">-</span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pun">-</span><span class="hljs-type"><span class="pln">date</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">and</span></span><span class="pln"> lightweight</span><span class="pun">...</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 kazaoki</span><span class="pun">/</span><span class="pln">lamp </span><span class="pun">ローカルフォルダをマウントす...</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 greyltc</span><span class="pun">/</span><span class="pln">lamp</span><span class="pun">-</span><span class="pln">gateone LAMP stack </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> gateone server </span><span class="pun">&amp;</span><span class="pln"> webdav </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 fauria</span><span class="pun">/</span><span class="pln">lamp </span><span class="typ">Modern</span><span class="pun">,</span><span class="pln"> developer friendly LAMP stack</span><span class="pun">.</span><span class="pln"> </span><span class="typ">Inc</span><span class="pun">...</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 drunomics</span><span class="pun">/</span><span class="pln">lamp</span><span class="pun">-</span><span class="pln">memcached LAMP </span><span class="pun">+</span><span class="pln"> </span><span class="typ">Memcached</span><span class="pln"> </span><span class="kwd">base</span><span class="pln"> image</span><span class="pun">.</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 rpawel</span><span class="pun">/</span><span class="pln">lamp </span><span class="typ">Apache</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2.4</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> php5</span><span class="pun">-</span><span class="pln">fpm container </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 lioshi</span><span class="pun">/</span><span class="pln">lamp </span><span class="typ">Docker</span><span class="pln"> image </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> LAMP </span><span class="pun">+</span><span class="pln"> </span><span class="typ">MySql</span><span class="pln"> under debian </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 nickistre</span><span class="pun">/</span><span class="pln">centos</span><span class="pun">-</span><span class="pln">lamp</span><span class="pun">-</span><span class="pln">xdebug LAMP </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> centos </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> xDebug </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 greyltc</span><span class="pun">/</span><span class="pln">lamp</span><span class="pun">-</span><span class="pln">aur LAMP stack </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="typ">Arch</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> php7</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> AUR ac</span><span class="pun">...</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 alledia</span><span class="pun">/</span><span class="pln">lamp </span><span class="typ">General</span><span class="pln"> LAMP </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="kwd">our</span><span class="pln"> tests</span><span class="pun">,</span><span class="pln"> based </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> phusi</span><span class="pun">...</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 greatfox</span><span class="pun">/</span><span class="pln">lamp </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 cnrk</span><span class="pun">/</span><span class="pln">lamp LAMP stack </span><span class="typ">Docker</span><span class="pln"> image</span><span class="pun">.</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span><span class="pln">
 grmanit</span><span class="pun">/</span><span class="pln">lamp </span><span class="typ">Based</span><span class="pln"> </span><span class="hljs-function_start"><span class="hljs-keyword"><span class="pln">on</span></span></span><span class="pln"> tutum</span><span class="pun">/</span><span class="pln">lamp </span><span class="hljs-keyword"><span class="kwd">with</span></span><span class="pln"> additional settin</span><span class="pun">...</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln">OK</span><span class="pun">]</span></code></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25527" href="https://academy.hsoub.com/uploads/monthly_2017_11/sk@server-_009.jpg.920db300ab42d8686dca5ce73993ac50.jpg" rel=""><img alt="sk@server-_009.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="25527" data-unique="wlare18a4" src="https://academy.hsoub.com/uploads/monthly_2017_11/sk@server-_009.thumb.jpg.b3e76f0f43e0c99b77ce97b7f93a0e9f.jpg"></a>
</p>

<p>
	وكما ترى من النتيجة أعلاه، فهناك الكثير من نسخ LAMP المتوفرة لتوزيعات آرتش وCent OS وأوبنتو، وهي مرتبة وفق تقييم المستخدمين لها.<br>
	وبالمثل يمكننا أن نبحث عن LEMP أيضًا:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs bash"><span class="pln">$ </span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> docker search lemp</span></code></pre>

<p>
	ثم اختر نسخة lemp مناسبة لك، سأحمّل أنا مثلًا nickistre/ubuntu-lamp:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">docker pull nickistre</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="pun">-</span><span class="pln">lamp</span></code></pre>

<p>
	ويكون الخرج مشابهًا لهذا:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs avrasm"><span class="typ">Using</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> tag</span><span class="pun">:</span><span class="pln"> latest
</span><span class="hljs-label"><span class="pln">latest</span><span class="pun">:</span></span><span class="pln"> </span><span class="typ">Pulling</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> nickistre</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="pun">-</span><span class="pln">lamp

</span><span class="hljs-label"><span class="pln">faecf96fd5ab</span><span class="pun">:</span></span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">995977506e98</span></span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-label"><span class="pln">efb63fb8dcb6</span><span class="pun">:</span></span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-label"><span class="pln">a3ed95caeb02</span><span class="pun">:</span></span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">61626</span></span><span class="lit">f5cc06d</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-label"><span class="pln">d42e54d21590</span><span class="pun">:</span></span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">4</span></span><span class="lit">a32d1f581a1</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">52</span></span><span class="lit">f44a8dd6d0</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-label"><span class="pln">ce6c1074ae9e</span><span class="pun">:</span></span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">2</span></span><span class="lit">fa559435609</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">93</span></span><span class="lit">a433221384</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">521</span></span><span class="lit">d09b9a2d1</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">6222</span></span><span class="lit">edddc59d</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">8</span></span><span class="lit">fa401b50efc</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">683063</span></span><span class="lit">a5d5e0</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-number"><span class="lit">1</span></span><span class="lit">f87fa5088b3</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-label"><span class="pln">c5ee1c14048f</span><span class="pun">:</span></span><span class="pln"> </span><span class="typ">Pull</span><span class="pln"> complete 
</span><span class="hljs-label"><span class="typ">Digest</span><span class="pun">:</span></span><span class="pln"> sha256</span><span class="pun">:</span><span class="pln">e913d43c204b3cdb931156c1a680c712acfe8db531225ec7b9e4708fc7ebe93c
</span><span class="hljs-label"><span class="typ">Status</span><span class="pun">:</span></span><span class="pln"> </span><span class="typ">Downloaded</span><span class="pln"> newer image </span><span class="kwd">for</span><span class="pln"> nickistre</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="pun">-</span><span class="pln">lamp</span><span class="pun">:</span><span class="pln">latest</span></code></pre>

<p>
	سيحمّل الأمر أعلاه نسخة LAMP لأوبنتو، يمكنك تحميل نسختك الخاصة لتوزيعتك كما أوضحنا قبل قليل. وإن لم ترغب في تحميل واستخدام النسخ التي يوفرها docker من الطرفية، فيمكنك تحميلها من Docker hub حيث تجد آلاف النسخ المستضافة هناك.<br>
	اذهب إلى الرابط أعلاه وابحث عن نسخة LAMP التي تريدها وحمّلها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25524" href="https://academy.hsoub.com/uploads/monthly_2017_11/5a0dc414bce1a_LAMPSEARCH.png.17fd666264940e2972bd05e582626006.png" rel=""><img alt="LAMP SEARCH.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25524" data-unique="4allydar4" src="https://academy.hsoub.com/uploads/monthly_2017_11/5a0dc4164ade3_LAMPSEARCH.thumb.png.0d2ce94a3124fa3e21681ccb0a76de18.png"></a>
</p>

<p>
	في حالتي أنا، فقد اخترت نسخة nickistre/ubuntu-lamp كما قلت قبل قليل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25525" href="https://academy.hsoub.com/uploads/monthly_2017_11/NICKISTRE.png.c746636f238c6af416d0e98d94b4e654.png" rel=""><img alt="NICKISTRE.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25525" data-unique="w8xqrm793" src="https://academy.hsoub.com/uploads/monthly_2017_11/NICKISTRE.thumb.png.149fc03370da60808c1e113c1bd1d5cb.png"></a>
</p>

<p>
	اضغط على النسخة التي تريد لمعرفة مزيد من البيانات عنها مثل كيفية تثبيتها واستخدامها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25522" href="https://academy.hsoub.com/uploads/monthly_2017_11/IMG.png.e9e73ad7a8ed8947a7f9fc3f8972a5ff.png" rel=""><img alt="IMG.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25522" data-unique="z4dngemn1" src="https://academy.hsoub.com/uploads/monthly_2017_11/IMG.thumb.png.67a4c89844ae2c812dd3e8bc8a51423a.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25528" href="https://academy.hsoub.com/uploads/monthly_2017_11/BUILD.png.662d0015b0cbb6bfe324362c2932d05d.png" rel=""><img alt="BUILD.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25528" data-unique="n9jrm70c4" src="https://academy.hsoub.com/uploads/monthly_2017_11/BUILD.thumb.png.039bc2960389de08a779078e22c3e6c4.png"></a>
</p>

<p>
	ستجد النسخ التي تحملها في مجلد var/lib/docker/، ولسرد تلك النسخ نفذ الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">docker images</span></code></pre>

<p>
	مثال للخرج:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs lasso"><span class="pln">REPOSITORY </span><span class="hljs-built_in"><span class="pln">TAG</span></span><span class="pln"> IMAGE ID CREATED SIZE
nickistre</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">lamp</span></span><span class="pln"> latest </span><span class="hljs-number"><span class="lit">5e750</span></span><span class="lit">e4f49e4</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> days ago </span><span class="hljs-number"><span class="lit">633</span></span><span class="pln"> MB
reinblau</span><span class="pun">/</span><span class="pln">lamp latest </span><span class="hljs-number"><span class="lit">2813</span></span><span class="lit">b461f843</span><span class="pln"> </span><span class="hljs-number"><span class="lit">9</span></span><span class="pln"> days ago </span><span class="hljs-number"><span class="lit">697.9</span></span><span class="pln"> MB
hello</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">world</span></span><span class="pln"> latest </span><span class="hljs-number"><span class="lit">690</span></span><span class="lit">ed74de00f</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> months ago </span><span class="hljs-number"><span class="lit">960</span></span><span class="pln"> B</span></code></pre>

<p>
	والآن نشغّل النسخة بعد أن حمّلناها:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs applescript"><span class="pln">$ docker </span><span class="hljs-command"><span class="pln">run</span></span><span class="pln"> </span><span class="pun">-</span><span class="hljs-keyword"><span class="pln">it</span></span><span class="pln"> nickistre</span><span class="pun">/</span><span class="pln">ubuntu</span><span class="pun">-</span><span class="pln">lamp </span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">bash</span></code></pre>

<p>
	ستجد نفسك قد دخلت بشكل آلي إلى المجلد الجذر للحاوية على الويب كمستخدم جذر:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@184851ac9ebd</span></span><span class="hljs-symbol"><span class="pun">:/</span></span><span class="hljs-comment"><span class="pun">#</span></span></code></pre>

<p>
	شغّل خدمة أباتشي:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># service apache2 start</span></span></code></pre>

<p>
	ثم خدمة MySQL:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># service mysql start</span></span></code></pre>

<p>
	تأكد ما إن كان خادم أباتشي يعمل أم لا، بفتح هذه الصفحة في متصفحك <a href="http://container_IP/" rel="external nofollow">http://container_IP/</a>.<br>
	ولكي تجد عنوان IP، اكتب ifconfig أو ip addr في طرفية الحاوية، يجب أن ترى هنا صفحة اختبار خادم أباتشي. ويمكنك معرفة إصدارات أباتشي وMySQL وPHP بهذه الأوامر بالترتيب:
</p>

<pre class="ipsCode" id="ips_uid_165_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># apache2 -v</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># mysql -v</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># php -v</span></span></code></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25526" href="https://academy.hsoub.com/uploads/monthly_2017_11/root@184851ac9ebd-_002.jpg.61dc6f70b9609f9d0bcae5bec033a675.jpg" rel=""><img alt="root@184851ac9ebd-_002.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="25526" data-unique="uz9qhh27r" src="https://academy.hsoub.com/uploads/monthly_2017_11/root@184851ac9ebd-_002.thumb.jpg.baa82c55110d3e48d933d35587d1f8ae.jpg"></a>
</p>

<p>
	وهكذا نكون قد ثبتنا LAMP في أوبنتو واستخدمناه، ويمكنك الآن أن تختبر تطبيقك كما كنت تريد، دون أن تشغل بالك بتثبيت كل تلك الحزم يدويًا أو على حاسوبك، حتى لو كان في آلة وهمية.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة للمبتدئين:</strong><br>
			استخدم Docker لأغراض التطوير والاختبار فقط، وانتبه أن تخلط بينه وبين برامج الآلات الوهمية الأخرى، فهو لن يثبّت شيئًا على حاسوبك، بل ما يفعله هو تثبيت نظام ضيف “نطلق عليه حاوية في Docker” ثم نثبت داخله LAMP.<br>
			قد يكون هذا شبيهًا ببرامج الآلات الوهمية الأخرى، لكن الفرق أن البرامج الأخرى تستخدم نواة حاسوبك الحقيقي وبقية موارده مثل المعالج والذاكرة وغيرهم، بينما Docker يعمل على خادم بعيد في السحابة.
		</p>
	</div>
</blockquote>

<p>
	ترجمة -بتصرف- لمقال <a href="https://www.unixmen.com/deploy-lamp-andor-lemp-stacks-easily-using-docker/" rel="external nofollow">Deploy LAMP and/or LEMP stacks easily using Docker</a> لصاحبه SK
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">364</guid><pubDate>Thu, 16 Nov 2017 17:32:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x645;&#x634;&#x627;&#x631;&#x643;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x628;&#x64A;&#x646; &#x62D;&#x627;&#x648;&#x64A;&#x627;&#x62A; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86-%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA-docker-r317/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_05/main.png.3553e57ef846e66e9f313261b97a6a02.png" /></p>

<h2 id="كيفية-مشاركة-البيانات-بين-حاويات-docker">
	تمهيد
</h2>

<p>
	بشكل عام، نستعمل حاويات Docker لمرة وحيدة فقط، وهي تعمل إلى أن ينتهي تنفيذ الأمر الموكل إليها. لكن في بعض الأحيان تحتاج التطبيقات إلى الوصول إلى بيانات أو حفظها بعد حذف الحاوية. أمثلة عن البيانات التي تحتاج التطبيقات إلى الوصول إليها تتضمن قواعد البيانات، والمحتوى المولّد من قِبل المستخدم لمواقع الويب، وملفات السجلات. يمكن الوصول إلى تلك البيانات بشكلٍ دائم باستخدام حجوم Docker (أي Docker Volumes).
</p>

<p style="text-align: center;">
	<img alt="main.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23339" data-unique="sr466qb27" src="https://academy.hsoub.com/uploads/monthly_2017_05/main.png.5874c047861ace24b9cca1a5f7d20961.png"></p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

<ul>
<li>
		خادوم أوبنتو 16.04 (أو 14.04) مضبوطٌ كما في درس «<a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">الإعداد الابتدائي لخادوم أوبنتو 14.04</a>»، بما في ذلك إعداد حساب مستخدم عادي لكنه يملك امتيازات الجذر (root) عبر الأداة <code>sudo</code>.
	</li>
	<li>
		برمجية Docker مثبّتة على حاسوبك
	</li>
</ul>
<p>
	<u><strong>ملاحظة:</strong></u> صحيحٌ أننا نفترض أنَّنا سنستعمل Docker على أوبنتو 16.04، لكن أوامر <code>docker</code> التي تتعامل مع حجوم Docker والمذكورة في هذا الدرس يجب أن تعمل عملًا صحيحًا على بقية الأنظمة لطالما كانت Docker مثبّتةً عليها وأُضيف المستخدم <code>sudo</code> إلى المجموعة <code>docker</code>.<br>
	يمكن إنشاء حجوم Docker ووصلها بأمرٍ واحد ألا وهو الأمر المُستخدَم لإنشاء الحاوية، أو يمكن إنشاء الحجوم بشكل مستقلٍ عن أيّة حاوية ثم وصلها إليها لاحقًا. سنناقش في هذا الدرس أربع طرائق مختلفة لمشاركة البيانات بين الحاويات.
</p>

<h2 id="أولا-إنشاء-حجم-مستقل">
	أولًا: إنشاء حجم مستقل
</h2>

<p>
	أتى الأمر <code>docker volume create</code> مع إصدار 1.9 من Docker والذي يسمح لك بإنشاء حجم دون ربطه بأية حاوية. سنستخدم هذا الأمر لإنشاء حجم باسم <code>DataVolume1</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs livecodeserver"><span class="pln">docker volume </span><span class="hljs-built_in"><span class="pln">create</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pun">--</span><span class="pln">name </span><span class="typ">DataVolume1</span></span></code></pre>

<p>
	إذا عُرِض الاسم، فذلك يُشير إلى نجاح تنفيذ الأمر السابق:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs "><span class="typ">DataVolume1</span></code></pre>

<p>
	لكي نستعمل هذا الحجم، علينا إنشاء حاوية جديدة مبنية على صورة ubuntu مستعملين الخيار <code>‎--‎rm</code> لحذف الحاوية تلقائيًا بعد خروجنا منها، وسنستخدم الخيار <code>‎-v</code> لوصل الحجم الجديد. الخيار <code>‎-v</code> يتطلب ذكر اسم الحجم متبوعًا بنقطتين رأسيتين <code>:</code> ثم المسار المطلق لمكان وصل الحجم داخل الحاوية. إذا لم يكن المجلد المذكور في المسار السابق موجودًا في صورة التوزيعة، فسيُنشَأ ثم سيُنفَّذ الأمر السابق؛ وفي حال كان المجلد موجودًا، فسيؤدي وصل الحجم إليه إلى إخفاء المحتوى الموجود في الصورة الأصلية.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">docker run </span><span class="pun">-</span><span class="pln">ti </span><span class="pun">--</span><span class="pln">rm </span><span class="pun">-</span><span class="pln">v </span><span class="hljs-constant"><span class="typ">DataVolume1</span></span><span class="hljs-symbol"><span class="pun">:/</span><span class="pln">datavolume1</span></span><span class="pln"> ubuntu</span></code></pre>

<p>
	لنكتب بعض البيانات إلى الحجم قبل إغلاق الحاوية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@802b0a78f2ef</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/</span></span><span class="hljs-comment"><span class="str"># echo "Example1" &gt; /</span><span class="pln">datavolume1</span><span class="pun">/</span><span class="typ">Example1</span><span class="pun">.</span><span class="pln">txt</span></span></code></pre>

<p>
	ولاستعمالنا الخيار <code>‎--rm</code> عند إنشاء الحاوية، فستُحذَف الحاوية تلقائيًا عند خروجنا منها. لكن الحجم سيبقى متاحًا للوصول.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@802b0a78f2ef</span></span><span class="hljs-symbol"><span class="pun">:/</span></span><span class="hljs-comment"><span class="pun">#</span><span class="pln"> </span><span class="kwd">exit</span></span></code></pre>

<p>
	يمكننا أن نتحقق أنَّ الحجم ما يزال موجودًا في النظام عبر الأمر <code>docker volume inspect</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs rsl"><span class="pln">docker </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> inspect </span><span class="typ">DataVolume1</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs json"><span class="pun">[</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"</span><span class="hljs-attribute"><span class="str">Name</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"DataVolume1"</span></span></span><span class="pun">,</span><span class="pln">
        </span><span class="str">"</span><span class="hljs-attribute"><span class="str">Driver</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"local"</span></span></span><span class="pun">,</span><span class="pln">
        </span><span class="str">"</span><span class="hljs-attribute"><span class="str">Mountpoint</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"/var/lib/docker/volumes/datavolume1/_data"</span></span></span><span class="pun">,</span><span class="pln">
        </span><span class="str">"</span><span class="hljs-attribute"><span class="str">Labels</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-literal"><span class="kwd">null</span></span></span><span class="pun">,</span><span class="pln">
        </span><span class="str">"</span><span class="hljs-attribute"><span class="str">Scope</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"local"</span></span><span class="pln">
    </span></span><span class="pun">}</span><span class="pln">
</span><span class="pun">]</span></code></pre>

<p>
	<u><strong>ملاحظة</strong></u>: يمكننا أيضًا تفحص البيانات الموجودة في المسار المذكور في سطر <code>Mountpoint</code> لكن لا يُستحسَن تعديلها، لأنَّ ذلك قد يؤدي إلى حدوث عطب في البيانات إن كانت الحاوية تعمل وتجري تعديلات على تلك الملفات.<br>
	لنبدأ الآن حاويةً جديدةً ونربط الحجم <code>DataVolume1</code> إليها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">docker run </span><span class="pun">--</span><span class="pln">rm </span><span class="pun">-</span><span class="pln">ti </span><span class="pun">-</span><span class="pln">v </span><span class="hljs-constant"><span class="typ">DataVolume1</span></span><span class="hljs-symbol"><span class="pun">:/</span><span class="pln">datavolume1</span></span><span class="pln"> ubuntu</span></code></pre>

<p>
	سنُنفِّذ الأمر الآتي داخل الحاوية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@d73eca0365fc</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/</span></span><span class="hljs-comment"><span class="str"># cat /</span><span class="pln">datavolume1</span><span class="pun">/</span><span class="typ">Example1</span><span class="pun">.</span><span class="pln">txt</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs "><span class="typ">Example1</span></code></pre>

<p>
	لنخرج الآن من الحاوية بالأمر <code>exit</code>.
</p>

<h2 id="ثانيا-إنشاء-حجم-مرتبط-بحاوية-لكن-سيبقى-موجودا-بعد-حذفها">
	ثانيًا: إنشاء حجم مرتبط بحاوية لكن سيبقى موجودًا بعد حذفها
</h2>

<p>
	سنُنشِئ في المثال الآتي حجمًا وحاويةً في آنٍ واحد، ومن ثم سنحذف الحاوية، ثم سنربط الحجم إلى حاويةٍ جديدة.<br>
	سنستخدم الأمر <code>docker run</code> لإنشاء حاوية جديدة بناءً على صورة <code>ubuntu</code>، وسيؤدي استخدام الخيار <code>‎-t</code> إلى منحنا وصولًا إلى الطرفية، والخيار <code>‎-i</code> سيسمح لنا بالتفاعل مع الحاوية. ولغرض التوضيح، سأستخدم الخيار <code>‎--name</code> لتحديد اسم للحاوية، ثم سأستخدم الخيار <code>‎-v</code> لإنشاء حجم جديد، وسنسميّه <code>DataVolume2</code>، وسنستخدم النقطتين الرأسيتين لفصل الاسم عن مسار وصل الحجم في الحاوية. وفي النهاية سنطلب إنشاء الحاوية لتبدأ تنفيذها بالأمر الافتراضي الموجود في ملف Docker لصورة Ubuntu (الذي هو الأمر <code>bash</code>) لكي نحصل على وصول إلى الصدفة (shell):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">docker run </span><span class="pun">-</span><span class="pln">ti </span><span class="pun">--</span><span class="pln">name</span><span class="pun">=</span><span class="hljs-constant"><span class="typ">Container2</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">v </span><span class="hljs-constant"><span class="typ">DataVolume2</span></span><span class="hljs-symbol"><span class="pun">:/</span><span class="pln">datavolume2</span></span><span class="pln"> ubuntu</span></code></pre>

<p>
	<u><strong>ملاحظة</strong></u>: الخيار <code>‎-v</code> هو خيارٌ مرنٌ جدًا، إذ يستطيع إنشاء وصل ترابطي، أو يمكنه إنشاء حجم جديد بتعديلٍ بسيط جدًا في شكله. فلو بدأ أوّل وسيطٍ بشرطة مائلة <code>/</code> أو <code>‎~/‎</code> فسيُنشِئ وصلًا ترابطيًا، لكن إن حذفت الشرطة في أوّل وسيط، فسيُنشِئ حجمًا.
</p>

<ul>
<li>
		<code>‎-v /path:/path/in/container</code> وصل المسار <code>‎/path</code> في الجهاز المضيف إلى <code>‎/path/in/container</code> في الحاوية.
	</li>
	<li>
		<code>‎-v path:/path/in/container</code> إنشاء حجم باسم <code>path</code> دون علاقة بالمضيف.
	</li>
</ul>
<p>
	ولمّا كنا داخل الحاوية، فلنكتب بعض البيانات إلى الحجم:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@87c33b5ae18a</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/</span></span><span class="hljs-comment"><span class="str"># echo "Example2" &gt; /</span><span class="pln">datavolume2</span><span class="pun">/</span><span class="typ">Example2</span><span class="pun">.</span><span class="pln">txt</span></span><span class="pln">
root</span><span class="hljs-variable"><span class="pln">@87c33b5ae18a</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/</span></span><span class="hljs-comment"><span class="str"># cat /</span><span class="pln">datavolume2</span><span class="pun">/</span><span class="typ">Example2</span><span class="pun">.</span><span class="pln">txt</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs "><span class="typ">Example2</span></code></pre>

<p>
	سنخرج من الحاوية باستخدام الأمر <code>exit</code>.<br>
	سنُعيد الآن تشغيل الحاوية مرةً أخرى، وسيتم وصل الحجم تلقائيًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs sql"><span class="pln">docker </span><span class="hljs-operator"><span class="hljs-keyword"><span class="pln">start</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">ai </span><span class="typ">Container2</span></span></code></pre>

<p>
	لنتأكد من أنَّ الحجم قد وصِلَ إلى الحاوية وما تزال البيانات موجودةً فيه:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@87c33b5ae18a</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/</span></span><span class="hljs-comment"><span class="str"># cat /</span><span class="pln">datavolume2</span><span class="pun">/</span><span class="typ">Example2</span><span class="pun">.</span><span class="pln">txt</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs "><span class="typ">Example2</span></code></pre>

<p>
	لنخرج مرةً أخرى من الحاوية بالأمر <code>exit</code>.<br>
	لن تسمح لنا Docker بحذف الحجم إذا كان مرتبطًا بحاوية، لننظر ماذا سيحدث لو جربنا ذلك:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs rsl"><span class="pln">docker </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> rm </span><span class="typ">DataVolume2</span></span></code></pre>

<p>
	ستخبرنا الرسالة الآتية أنَّ الحجم ما يزال مستخدم وستعطينا المُعرِّف الكامل للحاوية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs oxygene"><span class="typ">Error</span><span class="pln"> response </span><span class="hljs-keyword"><span class="kwd">from</span></span><span class="pln"> daemon</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Unable</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">remove</span></span><span class="pln"> volume</span><span class="pun">,</span><span class="pln"> 
volume still </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="kwd">use</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">remove</span></span><span class="pln"> </span><span class="typ">DataVolume2</span><span class="pun">:</span><span class="pln"> volume </span><span class="hljs-keyword"><span class="kwd">is</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> 
</span><span class="pun">[</span><span class="hljs-number"><span class="lit">719</span></span><span class="lit">f98391ecf1d6f0f053ffea1bbd84cd2dc9cf6d31d5a4f348c60d98392804c</span><span class="pun">]</span></code></pre>

<p>
	يمكننا استخدام المُعرِّف السابق لحذف الحاوية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs bash"><span class="pln">docker rm </span><span class="hljs-number"><span class="lit">719</span></span><span class="lit">f98391ecf1d6f0f053ffea1bbd84</span><span class="hljs-built_in"><span class="lit">cd</span></span><span class="lit">2dc9cf6d31d5a4f348c60d98392804c</span></code></pre>

<p>
	لن يؤثر حذف الحاوية على الحجم المرتبط بها، وما زال موجودًا في النظام، ونستطيع التحقق من ذلك باستخدام الأمر <code>docker volume ls</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs rsl"><span class="pln">docker </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> ls</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs lua"><span class="pln">DRIVER              VOLUME NAME
</span><span class="hljs-keyword"><span class="kwd">local</span></span><span class="pln">               </span><span class="typ">DataVolume2</span></code></pre>

<p>
	نستطيع الآن استخدام الأمر <code>docker volume rm</code> لحذف الحجم بتمرير اسمه إلى الأمر السابق:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs rsl"><span class="pln">docker </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> rm </span><span class="typ">DataVolume2</span></span></code></pre>

<p>
	أنشأنا في هذا المثال حجمًا فارغًا مع الحاوية الذي يرتبط بها في آنٍ واحد. أما في المثال القادم فسنرى ماذا سيحدث لو أنشأنا حجمًا ووصلناه إلى مجلدٍ فيه بيانات موجودة مسبقًا في الحاوية.
</p>

<h2 id="ثالثا-إنشاء-حجم-وربطه-بمجلد-فيه-بيانات">
	ثالثًا: إنشاء حجم وربطه بمجلدٍ فيه بيانات
</h2>

<p>
	عمومًا، لا يكون هنالك فرقٌ بين إنشاء حجم باستخدام الأمر <code>docker volume create</code> وبين إنشائه عند تشغيل الحاوية، لكن هنالك استثناءٌ وحيدٌ لهذه القاعدة، ويحدث عندما نُنشِئ حجمًا في نفس وقت إنشاء الحاوية وكان المسار الذي نريد ربط الحجم فيه مجلدًا موجودًا في الصورة الأصلية وفيه بيانات، وفي هذه الحالة ستُنسَخ البيانات الموجودة في ذاك المجلد إلى الحجم.<br>
	كمثال عن الحالة السابقة، سنُنشِئ حاويةً ونصل الحجم الجديد إلى المجلد <code>‎/var</code> الموجود مسبقًا في صورة التوزيعة والذي يحتوي على بيانات:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs lasso"><span class="pln">docker run </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ti</span></span><span class="pln"> </span><span class="hljs-subst"><span class="pun">--</span></span><span class="pln">rm </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">v</span></span><span class="pln"> </span><span class="typ">DataVolume3</span><span class="pun">:/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pln"> ubuntu</span></code></pre>

<p>
	جميع المحتوى الموجود في مجلد <code>‎/var</code> في الصورة الأصلية سيُنسَخ إلى الحجم، ثم يمكننا وصل الحجم إلى الحاوية الجديدة. وفي هذه المرة، سنُنفِّذ الأمر <code>ls</code> بدلًا من الأمر الافتراضي <code>bash</code>، والذي سيُظهِر محتويات الحجم دون الحاجة إلى الدخول إلى الصدفة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">docker run </span><span class="pun">--</span><span class="pln">rm </span><span class="pun">-</span><span class="pln">v </span><span class="hljs-constant"><span class="typ">DataVolume3</span></span><span class="hljs-symbol"><span class="pun">:/</span><span class="pln">datavolume3</span></span><span class="pln"> ubuntu ls </span><span class="hljs-constant"><span class="typ">DataVolume3</span></span></code></pre>

<p>
	كما توقعنا، سيحتوي الحجم <code>DataVolume3</code> على نسخةٍ من محتويات مجلد <code>‎/var</code> في الصورة الأصلية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs applescript"><span class="pln">backups
cache
lib
</span><span class="hljs-keyword"><span class="kwd">local</span></span><span class="pln">
</span><span class="kwd">lock</span><span class="pln">
</span><span class="hljs-command"><span class="pln">log</span></span><span class="pln">
mail
opt
</span><span class="hljs-command"><span class="pln">run</span></span><span class="pln">
spool
tmp</span></code></pre>

<p>
	من غير المرجّح أن نصل المجلد <code>‎/var</code> بهذه الطريقة، لكن قد تستفيد من المعلومات السابقة إذا أردت إنشاء صورة خاصة بك وتريد طريقةً سهلةً للحفاظ على البيانات.<br>
	سنشرح في المثال الآتي كيفية مشاركة الحجم مع أكثر من حاوية.
</p>

<h2 id="رابعا-مشاركة-البيانات-بين-أكثر-من-حاوية-docker">
	رابعًا: مشاركة البيانات بين أكثر من حاوية Docker
</h2>

<p>
	كل ما فعلناه منذ بداية هذا الدرس هو وصل الحجم إلى حاوية واحدة فقط بنفس الوقت، لكننا نرغب عادةً بالسماح بمشاركة البيانات بين أكثر من حاوية عبر وصل الحجم إلى عدِّة حاوية معًا. وهذا سهلٌ جدًا، لكن هنالك مشكلة محورية: لا تدعم Docker حاليًا ميزة التعامل مع قفل الملفات (file locking)، فلو احتاجت أكثر من حاوية إلى الكتابة على الحجم، فيجب أن تكون البرمجيات الموجودة في تلك الحاويات مصممةً لكي تكتب إلى أماكن تخزين البيانات المشتركة، لتجنّب تلف البيانات.
</p>

<h3 id="إنشاء-الحاوية-container4-والحجم-datavolume4">
	إنشاء الحاوية Container4 والحجم DataVolume4
</h3>

<p>
	سنستخدم الأمر <code>docker run</code> لإنشاء حاوية جديدة باسم <code>Container4</code> ووصل حجم جديد إليها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">docker run </span><span class="pun">-</span><span class="pln">ti </span><span class="pun">--</span><span class="pln">name</span><span class="pun">=</span><span class="hljs-constant"><span class="typ">Container4</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">v </span><span class="hljs-constant"><span class="typ">DataVolume4</span></span><span class="hljs-symbol"><span class="pun">:/</span><span class="pln">datavolume4</span></span><span class="pln"> ubuntu </span></code></pre>

<p>
	سنُنشِئ الآن ملفًا ونضع فيه بعض المحتوى النصي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@db6aaead532b</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/</span></span><span class="hljs-comment"><span class="str"># echo "This file is shared between containers" &gt; /</span><span class="pln">datavolume4</span><span class="pun">/</span><span class="typ">Example4</span><span class="pun">.</span><span class="pln">txt</span></span></code></pre>

<p>
	ثم سنخرج من الحاوية بالأمر <code>exit</code>.<br>
	سنعود الآن إلى سطر الأوامر في الجهاز المضيف، حيث سنُنشِئ حاويةً جديدةً ونصل فيها الحجم <code>DataVolume4</code>.
</p>

<h3 id="إنشاء-الحاوية-container5-ووصل-الحجم-الذي-كان-موصولا-في-container4">
	إنشاء الحاوية Container5 ووصل الحجم الذي كان موصولًا في Container4
</h3>

<p>
	سنُنشِئ حاويةً جديدةً باسم <code>Container5</code> ونصل فيها الحجم الذي كان موصولًا في Container4:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs applescript"><span class="pln">docker </span><span class="hljs-command"><span class="pln">run</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">ti </span><span class="hljs-comment"><span class="pun">--</span><span class="pln">name</span><span class="pun">=</span><span class="typ">Container5</span><span class="pln"> </span><span class="pun">--</span><span class="pln">volumes</span><span class="pun">-</span><span class="kwd">from</span><span class="pln"> </span><span class="typ">Container4</span><span class="pln"> ubuntu</span></span><span class="pln">
root@</span><span class="hljs-number"><span class="pln">81e7</span></span><span class="pln">a6153d28</span><span class="pun">:</span><span class="str">/</span><span class="hljs-comment"><span class="str"># cat /</span><span class="pln">datavolume4</span><span class="pun">/</span><span class="typ">Example4</span><span class="pun">.</span><span class="pln">txt</span></span><span class="pln">
</span><span class="typ">This</span><span class="pln"> </span><span class="hljs-type"><span class="pln">file</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">is</span></span><span class="pln"> shared </span><span class="hljs-keyword"><span class="pln">between</span></span><span class="pln"> containers</span></code></pre>

<p>
	لنضف بعض النصوص إلى أحد الملفات من الحاوية الثانية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@81e7a6153d28</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/</span></span><span class="hljs-comment"><span class="str"># echo "Both containers can write to DataVolume4" &gt;&gt; /</span><span class="pln">datavolume4</span><span class="pun">/</span><span class="typ">Example4</span><span class="pun">.</span><span class="pln">txt</span></span></code></pre>

<p>
	ثم سنخرج من الحاوية بالأمر <code>exit</code>.<br>
	سنتأكد الآن أنَّ البيانات الجديدة أصبحت متاحةً للحاوية Container4.
</p>

<h3 id="رؤية-التغييرات-التي-أجريناها-في-container5">
	رؤية التغييرات التي أجريناها في Container5
</h3>

<p>
	لنتحقق من أنَّ الحاوية Container5 قد كتبت البيانات على حجم DataVolume4 بإعادة تشغيل الحاوية Container4:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs applescript"><span class="pln">docker start </span><span class="pun">-</span><span class="pln">ai </span><span class="typ">Container4</span><span class="pln">
root@db6aaead532b</span><span class="pun">:</span><span class="str">/</span><span class="hljs-comment"><span class="str"># cat /</span><span class="pln">datavolume4</span><span class="pun">/</span><span class="typ">Example4</span><span class="pun">.</span><span class="pln">txt</span></span><span class="pln">
</span><span class="typ">This</span><span class="pln"> </span><span class="hljs-type"><span class="pln">file</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">is</span></span><span class="pln"> shared </span><span class="hljs-keyword"><span class="pln">between</span></span><span class="pln"> containers
</span><span class="typ">Both</span><span class="pln"> containers can </span><span class="hljs-command"><span class="pln">write</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> </span><span class="typ">DataVolume4</span></code></pre>

<p>
	بعد أن تأكدنا من إمكانية القراءة والكتابة إلى الحجم من كلا الحاويتين، فسنخرج من الحاوية بالأمر <code>exit</code>.<br>
	أكرِّر أنَّ Docker لا تملك ميزةً لقفل الملفات، لذا يجب أن تقفل التطبيقاتُ الملفاتَ بنفسها. لكن من الممكن وصل حجم Docker للقراءة فقط لكي نضمن عدم حدوث تلف في البيانات نتيجةً لخطأٍ ما، وذلك عبر إضافة الخيار <code>‎:ro</code>.
</p>

<h3 id="تشغيل-الحاوية-container6-ووصل-الحجم-للقراءة-فقط">
	تشغيل الحاوية Container6 ووصل الحجم للقراءة فقط
</h3>

<p>
	نستطيع –بعد وصل الحجم إلى الحاوية– أن نفصله ثم نصله مرةً أخرى للقراءة فقط، لكننا نستطيع أيضًا إنشاء حاوية تصل الحجم كما نشاء مباشرةً. وذلك بإضافة <code>‎:ro</code> بعد اسم الحاوية التي سنحاول وصل الحجم المرتبط بها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs brainfuck"><span class="hljs-comment"><span class="pln">docker</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">run</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-comment"><span class="pln">ti</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-comment"><span class="pln">name</span><span class="pun">=</span><span class="typ">Container6</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-comment"><span class="pln">volumes</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-comment"><span class="kwd">from</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Container4</span><span class="pun">:</span><span class="pln">ro</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">ubuntu</span></span></code></pre>

<p>
	سنتحقق من أنَّ الحجم موصولٌ للقراءة فقط بمحاولتنا حذف الملف الذي أنشأناه سابقًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln">root</span><span class="hljs-variable"><span class="pln">@ab63aebe534c</span></span><span class="hljs-symbol"><span class="pun">:</span><span class="str">/</span></span><span class="hljs-comment"><span class="str"># rm /</span><span class="pln">datavolume4</span><span class="pun">/</span><span class="typ">Example4</span><span class="pun">.</span><span class="pln">txt</span></span><span class="pln">
</span><span class="hljs-symbol"><span class="pln">rm</span><span class="pun">:</span></span><span class="pln"> cannot remove </span><span class="hljs-string"><span class="str">'/datavolume4/Example4.txt'</span></span><span class="hljs-symbol"><span class="pun">:</span></span><span class="pln"> </span><span class="hljs-constant"><span class="typ">Read</span></span><span class="pun">-</span><span class="pln">only file system</span></code></pre>

<p>
	بعد إغلاق هذه الحاوية (كالمعتاد، بالأمر <code>exit</code>) فيمكننا حذف الحاويات التي أنشأناها إضافةً إلى الحجم:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs rsl"><span class="pln">docker rm </span><span class="typ">Container4</span><span class="pln"> </span><span class="typ">Container5</span><span class="pln"> </span><span class="typ">Container6</span><span class="pln">
docker </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> rm </span><span class="typ">DataVolume4</span></span></code></pre>

<p>
	لقد رأينا في هذا المثال كيفية مشاركة البيانات بين حاويتين باستخدام الحجوم، بالإضافة إلى طريقة وصل الحجوم للقراءة فقط.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	أنشأنا في هذا الدرس حجم بيانات الذي يسمح لنا بالاحتفاظ بالبيانات حتى بعد حذفنا للحاوية. وشاركنا حجمًا بين عدِّة حاويات، ونوهنا إلى أهمية أن تكون التطبيقات المستعملة في الحاويات قادرةً على قفل الملفات لمنع تلف البيانات. وفي النهاية شاهدنا كيف يمكن وصل الحجم للقراءة فقط.<br>
	إذا كنتَ مهتمًا بكيفية مشاركة البيانات بين الحاويات والنظام المضيف، فأنصحك بقراءة درس «<a href="https://academy.hsoub.com/devops/cloud-computing/docker/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86-%D8%AD%D8%A7%D9%88%D9%8A%D8%A9-docker-%D9%88%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81-r314/" rel="">كيفية مشاركة البيانات بين حاوية Docker والمضيف</a>».
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-share-data-between-the-docker-container-and-the-host" rel="external nofollow">How To Share Data between the Docker Container and the Host</a>لصاحبته Melissa Anderson
</p>
]]></description><guid isPermaLink="false">317</guid><pubDate>Tue, 23 May 2017 07:05:57 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x645;&#x634;&#x627;&#x631;&#x643;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x628;&#x64A;&#x646; &#x62D;&#x627;&#x648;&#x64A;&#x629; Docker &#x648;&#x627;&#x644;&#x645;&#x636;&#x64A;&#x641;</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86-%D8%AD%D8%A7%D9%88%D9%8A%D8%A9-docker-%D9%88%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81-r314/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_05/main.png.8752cf2ed30b20fc9977e69ae60a7e33.png" /></p>

<h2 id="كيفية-مشاركة-البيانات-بين-حاوية-docker-والمضيف">
	تمهيد
</h2>

<p>
	عمومًا، نستعمل حاويات Docker لمرة وحيدة فقط، وهي تعمل إلى أن ينتهي تنفيذ الأمر الموكل إليها. وافتراضيًا تكون البيانات المُنشَأة داخل الحاوية متاحةً فقط إلى الحاوية وقابلة للوصول عند تشغيل الحاوية فقط.
</p>

<p style="text-align: center;">
	<img alt="main.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23167" data-unique="273rju42m" src="https://academy.hsoub.com/uploads/monthly_2017_05/main.png.6f4a2f3b7b9d380369d6584f999c0b2b.png"></p>

<p>
	<br>
	حجوم Docker (أي Docker volumes) يمكن أن تُستخدَم لمشاركة الملفات بين النظام المضيف (host system) وحاوية Docker. لنقل –على سبيل المثال– أننا نريد استخدام صورة Nginx الرسمية ونحتفظ بسجل دائم لخادوم Nginx لكي نحلل معلوماته لاحقًا. وافتراضيًا، ستكتب صورة Niginx الرسمية سجلاتها إلى <code>‎/var/log/nginx</code> داخل الحاوية، والتي لا نستطيع في الحالة العادية الوصول إلى ذاك الملف من النظام المضيف.<br>
	سنشرح في هذا الدرس كيفية جعل البيانات الموجودة داخل الحاوية متاحةً للجهاز المضيف.
</p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

<ul>
<li>
		خادوم أوبنتو 16.04 (أو 14.04) مضبوطٌ كما في درس «<a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">الإعداد الابتدائي لخادوم أوبنتو 14.04</a>»، بما في ذلك إعداد حساب مستخدم عادي لكنه يملك امتيازات الجذر (root) عبر الأداة <code>sudo</code>.
	</li>
	<li>
		برمجية Docker مثبّتة على حاسوبك
	</li>
</ul>
<p>
	إذا كنتَ جديدًا على Docker، فسلسلة «<a href="https://academy.hsoub.com/tags/docker%20ecosystem/" rel="">docker ecosystem</a>» المنشورة على الأكاديمية تعطيك لمحةً عن طريقة استعمالها.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			صحيحٌ أننا نفترض أنَّك ستستعمل Docker على أوبنتو 16.04، لكن أوامر <code>docker</code> التي تتعامل مع حجوم Docker والمذكورة في هذا الدرس يجب أن تعمل عملًا صحيحًا على بقية الأنظمة لطالما كانت Docker مثبّتةً عليها.
		</p>
	</div>
</blockquote>

<h2 id="الخطوة-الأولى-الوصل-الترابطي-لحجم-التخزين">
	الخطوة الأولى: الوصل الترابطي لحجم التخزين
</h2>

<p>
	الأمر الآتي سيُنشِئ مجلدًا باسم <code>nginxlogs</code> في مجلد المنزل (Home) للمستخدم الحالي ويصله وصلًا ترابطيًا (bindmount) إلى <code>‎/var/log/nginx</code> في الحاوية:
</p>

<pre class="ipsCode" id="ips_uid_1395_9">
docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx</pre>

<p>
	لنأخذ دقيقةً من الزمن لتفحص الأمر بالتفصيل:
</p>

<ul>
<li>
		<code>‎--name=nginx</code>: تسمية الحاوية لكي نستطيع الإشارة إليها لاحقًا بسهولة.
	</li>
	<li>
		<code>‎-d</code>: فصل العملية الحالية من الطرفية وتشغيلها في الخلفية، وإلا فسنرى مِحَث Nginx فارغ ولن نتمكن من استعمال جلسة الطرفية إلا بعد انتهاء تنفيذ Nginx.
	</li>
	<li>
		<code>‎-v ~/nginxlogs:/var/log/nginx</code>: ضبط حجم الوصل الترابطي الذي يربِط بين مجلد <code>‎/var/log/nginx</code> داخل حاوية Nginx إلى مجلد <code>‎‎~/nginxlogs</code> في الجهاز المضيف. تَستعمِل Docker النقطتين الرأسيتين <code>:</code> لفصل مسار المضيف عن مسار الحاوية، ويجب ذكر مسار المضيف أولًا.
	</li>
	<li>
		<code>‎-p 5000:80</code>: ضبط تمرير المنافذ؛ حيث تستمع خدمة Nginx داخل الحاوية إلى المنفذ 80 افتراضيًا، وهذا الخيار يؤدي إلى ربط المنفذ 80 في الحاوية إلى المنفذ 5000 في النظام المضيف.
	</li>
	<li>
		<code>nginx</code>: تحديد أنَّ هذه الحاوية يجب بناؤها على صورة Nginx، والتي تُنفِّذ الأمر <code>nginx -g "deamon off"‎</code> لتشغيل Nginx.
	</li>
</ul>
<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			الخيار <code>‎-v</code> هو خيارٌ مرنٌ جدًا، إذ يستطيع إنشاء وصل ترابطي، أو يمكنه إنشاء حجم جديد بتعديلٍ بسيط جدًا في شكله. فلو بدأ أوّل وسيم بشرطة مائلة <code>/</code> أو <code>‎~/‎</code> فسيُنشِئ وصلًا ترابطيًا، لكن إن حذفت الشرطة في أوّل وسيط، فسيُنشِئ حجمًا.
		</p>
	</div>
</blockquote>

<ul>
<li>
		<code>‎-v /path:/path/in/container</code> وصل المسار <code>‎/path</code> في الجهاز المضيف إلى <code>‎/path/in/container</code> في الحاوية.
	</li>
	<li>
		<code>‎-v path:/path/in/container</code> إنشاء حجم باسم <code>path</code> دون علاقة بالمضيف.
	</li>
</ul>
<h2 id="الخطوة-الثانية-الوصول-إلى-البيانات-من-المضيف">
	الخطوة الثانية: الوصول إلى البيانات من المضيف
</h2>

<p>
	لدينا الآن خادوم Nginx يعمل داخل حاوية موجودة في جهازنا المحلي، ولدينا المنفذ 5000 الموجود في جهاز المضيف مرتبطٌ بالمنفذ 80 للحاوية.<br>
	افتح عنوان خادوم الويب في متصفحك، مستخدمًا عنوان IP لجهازك المحلي ورقم المنفذ 5000، مثلًا: <code>http://203.0.113.0:5000</code> ويجب أن تشاهد الرسالة الآتية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="23166" href="https://academy.hsoub.com/uploads/monthly_2017_05/1-nginx.png.815b0b6a949e342377fb39d9bcf37637.png" rel=""><img alt="1-nginx.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23166" data-unique="o2pbpr2x9" src="https://academy.hsoub.com/uploads/monthly_2017_05/1-nginx.thumb.png.2330127946b70d1fbfefeb40b0d7a2a7.png"></a>
</p>

<p>
	وإذا نظرنا الآن في مجلد <code>‎~/nginxlogs</code> الموجود في المضيف، فسنرى الملف <code>access.log</code> المُنشَأ من حاوية <code>nginx</code> والذي تظهر فيه الطلبية التي أجريناها:
</p>

<pre class="ipsCode" id="ips_uid_1395_11">
cat ~/nginxlogs/access.log
</pre>

<p>
	يجب أن يحتوي شيئًا شبيهًا بما يلي:
</p>

<pre class="ipsCode" id="ips_uid_1395_13">
203.0.113.0 - - [11/Nov/2016:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-" 
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"</pre>

<p>
	إذا أجريتَ أيّة تعديلات إلى مجلد <code>‎~/nginxlogs</code> فيجب أن تراها من داخل الحاوية مباشرةً.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	شرحنا في هذا الدرس كيفية إنشاء حجم Docker لمشاركة المعلومات بين الحاوين والنظام المضيف، مما يفيدنا كثيرًا في بيئات التطوير، حيث من الضروري الوصول إلى السجلات لتحليلها. 
</p>

<p>
	<br>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-share-data-between-the-docker-container-and-the-host" rel="external nofollow">How To Share Data between the Docker Container and the Host</a> لصاحبته Melissa Anderson
</p>
]]></description><guid isPermaLink="false">314</guid><pubDate>Mon, 08 May 2017 21:00:00 +0000</pubDate></item><item><title>&#x62B;&#x644;&#x627;&#x62B; &#x646;&#x635;&#x627;&#x626;&#x62D; &#x644;&#x62A;&#x633;&#x645;&#x64A;&#x629; &#x62D;&#x627;&#x648;&#x64A;&#x627;&#x62A; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D8%AB%D9%84%D8%A7%D8%AB-%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%84%D8%AA%D8%B3%D9%85%D9%8A%D8%A9-%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA-docker-r311/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.dbd384538c66e144543bd042ef9f97d5.png" /></p>

<h3>
	تمهيد
</h3>

<p>
	عندما تُنشِئ حاوية Docker فسيُسنَد إليها مُعرِّف عالمي فريد (UUID) وهو ضروريٌ لتفادي التضاربات في الأسماء ولتسهيل أتمتة إنشاء الحاويات دون تدخل البشر. وهو مفيدٌ لكي يتعرف الحاسوب المضيف (والشبكة) على المضيف. لكن يصعب التفريق بين الحاويات بالنسبة للبشر، سواءً كنّا نقصد الاسم الطويل (64 محرف) أو المُعرِّف القصير (12 محرف) الذي يبدو كالآتي <code>285c9f0f9d3d</code>.
</p>

<p style="text-align: center;">
	<img alt="main.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22680" data-unique="97pg8m3lt" src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.f8d8e114b9040ef24b0eba4cd72a0738.png"></p>

<p>
	توفِّر Docker أسماءً مولّدةً تلقائيًا للحاويات تأتي من جمع كلمتين عشوائيتين بشرطة سفلية، مثلًا: <code>evil_ptolemy</code>، مما يُسهِّل التفريق بين الحاويات، لكن الأسماء العشوائية لا تعطينا أيّة فكرة عن وظيفة الحاوية مَثَلُهَا كمثل مُعرِّف UUID.
</p>

<p>
	سأخبرك بثلاث نصائح التي ستُسهِّل من التعرف على الحاويات.
</p>

<h3>
	أولًا: سمِّ الحاوية عندما تُنشِئها
</h3>

<p>
	وذلك بإضافة الخيار <code>‎--name=meaningful_name</code> إلى الأمر <code>docker run</code>، وبهذا سيصبح اسم الحاوية ذا معنى عند استخدام الجلسات التفاعلية وفي ناتج بعض الأوامر مثل <code>docker ps</code>. لكن هنالك بعض المحدوديات، لأن أسماء الحاويات يجب أن تكون فريدةً، لهذا لا يمكن استخدام نفس الاسم لأكثر من حاوية.
</p>

<p>
	ضع ما يلي في سطر الأوامر أو في ملف Docker:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3933_9">
<span class="pln">docker run –name=meaningful_name
</span></pre>

<p>
	على سبيل المثال، إذا أردنا إنشاء حاوية مبنيةً على صورة <code>nginx</code> فسنُنفِّذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3933_7">
<span class="pln">docker run --name nginx -d nginx</span></pre>

<p>
	وسيظهر الاسم في قائمة الحاويات التي تعمل حاليًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3933_9">
<code>docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
08f333ef7216        nginx               "nginx -g 'daemon off"   15 seconds ago      Up 14 seconds       80/tcp, 443/tcp      nginx
</code></pre>

<p>
	صحيحٌ أنَّ الاسم سيظهر في ناتج الأمر <code>docker ps</code> ويمكن استخدامه لإدارة الحاوية، لكنه لن يظهر في مِحَث (prompt) سطر الأوامر إذا فتحتَه، أو في السجلات. ولفعل ذلك عليك أن تُسنِد «اسم مضيف» (hostname) إلى الحاوية.
</p>

<h3>
	ثانيًا: إسناد اسم مضيف إلى الحاوية
</h3>

<p>
	القيمة المُمرَّرة إلى الخيار <code>‎--hostname</code> ستُضبِط اسم المضيف داخل الحاوية في الملفين <code>‎/etc/hostname</code> و <code>‎/etc/hosts</code>. وبناءً على ذلك، سيظهر اسم المضيف في مِحَث سطر الأوامر، وسيلعب اسم المضيف دورًا في ضبط خدمة DNS للحاوية وقد يكون مفيدًا عند تعلم التعامل مع أكثر من حاوية. لكنه ليس ضروريًا للوصول إلى الحاوية من خارجها، إلا أنَّه سيظهر في ملفات السجل التابعة للحاوية، وعندما تُكتَب تلك الملفات إلى جهاز تخزين مستقل عن الحاسوب المضيف، فسيسهل التعرف على الحاوية بناءً على اسم المضيف الخاص بها.
</p>

<p>
	ضع ما يلي في سطر الأوامر أو في ملف Docker:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3933_16">
<span class="pln">docker run –hostname=value 
</span></pre>

<p style="text-align: left;">
	أو
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3933_14">
<span class="pln">docker run -h value
</span></pre>

<p>
	وصحيحٌ أنَّ <code>‎--name</code> و <code>‎--hostname</code> مفيدان للتعرف على الحاويات، لكن الأمر ليس متعلقًا بإطلاق اسم على الحاوية فحسب، وإنما ستستفيد منه (في السجلات مثلًا) إذا ضبطتَ الحاوية لكي تُحذَف تلقائيًا بعد انتهاءك منها.
</p>

<h3>
	ثالثًا: حذف الحاويات تلقائيًا بعد انتهاء تنفيذها
</h3>

<p>
	عندما تجرّب مع حاويات Docker، فقد تستفيد في بعض الأحيان من الحفاظ على الحاوية بعد انتهاء تنفيذها. يمكنك حفظ البيانات مثل ملفات السجلات وتتفحص آخر حالة للحاوية. لكن في بعض الأحيان لا ترغب في بقاء الحاوية بعد انتهاء التجربة معها، وفي هذه الحالة يمكنك استخدام الخيار <code>‎--rm</code> لحذفها عند انتهاء تنفيذها. وهذا سيُسهِّل من «تنظيف» بيئة التجارب.
</p>

<p>
	لكن انتبه! إذا كنتَ تستخدم حجوم Docker ‏(Docker volumes) فالخيار <code>‎--rm</code> سيؤدي إلى <a href="https://docs.docker.com/engine/reference/run/#/clean-up---rm" rel="external nofollow">حذف أيّة حجوم مرتبطة بالحاوية</a>.
</p>

<p>
	ضع ما يلي في سطر الأوامر أو في ملف Docker:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3933_12">
<span class="pln">docker run –rm
</span></pre>

<p>
	ستستفيد من هذا الخيار كثيرًا عند إنشائك لصورة Docker وتحتاج إلى الوصول إلى حاوية للتجربة عليها، لكنك لا تريد أن تملأ كامل قرصك بحاويات لن تستعملها مرةً أخرى.
</p>

<h3>
	الخلاصة
</h3>

<p>
	هنالك ثلاثة خيارات للأمر <code>docker run</code>: الخيار <code>‎--name</code> و <code>‎--hostname</code> و <code>‎--rm</code> التي تُسهِّل من تعاملك مع حاويات Docker عندما تحاول تعلم التعامل معها. يمكنك العثور على مزيدٍ من المعلومات حول الأمر <code>docker run</code> في درس «<a href="https://academy.hsoub.com/devops/cloud-computing/docker/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA-docker-r310/" rel="">التعامل مع حاويات Docker</a>».
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/naming-docker-containers-3-tips-for-beginners" rel="external nofollow">Naming Docker Containers: 3 Tips for Beginners</a> لصاحبته Melissa Anderson
</p>
]]></description><guid isPermaLink="false">311</guid><pubDate>Sat, 15 Apr 2017 11:32:03 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x62D;&#x627;&#x648;&#x64A;&#x627;&#x62A; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA-docker-r310/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.79db98e33ab70256980580fc78e21708.png" /></p>

<p>
	Docker هي أداةٌ لإنشاء الحاويات تُستخدَم لتوفير برمجيات مع نظام ملفات الذي يحتوي كل شيءٍ تحتاج له تلك البرمجيات لتعمل. استخدام حاويات Docker يضمن أنَّ البرمجيات ستعمل عملًا صحيحًا بغض النظر عن النظام الذي ستعمل داخله، لأنَّ بيئة التشغيل ستكون متماثلة في جميع الحالات. سنوفِّر في هذا الدرس لمحةً عن العلاقة بين صور Docker (أي Docker images) وحاويات Docker (أي Docker containers). ثم سنتعلم كيفية تشغيل وإيقاف وحذف الحاويات.
</p>

<p style="text-align: center;">
	<img alt="main.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22582" data-unique="du0tvjhle" src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.1e2ab1687cdb99030739f85a4815373d.png"></p>

<h3>
	لمحة عن حاويات Docker
</h3>

<p>
	يمكننا أن نتخيل «صورة Docker» على أنها قالبٌ (template) يُستخدم لإنشاء حاويات Docker. تبدأ الصور عادةً بنظام ملفات رئيسي، وتُضاف التعديلات على نظام الملفات (والمعاملات المترافقة معها) على شكل طبقات متتالية. وعلى النقيض من توزيعات لينكس الاعتيادية، تحتوي صورة Docker على المكوِّنات الأساسية اللازمة لتشغيل التطبيق (ولا تحتوي على جميع الأدوات الموجودة في التوزيعات التقليدية). ولا تتغير صور Docker، وإنما تكوِّن نقطة انطلاق لإنشاء حاويات Docker.
</p>

<p>
	هذا المزيج بين الطبقات المتاحة للقراءة فقط والتي تعلوها طبقةٌ قابلةٌ للكتابة والقراءة يُشكِّل ما يُعرَف بنظام الملفات الاتحادي (union file system). فعند حدوث تغيير إلى ملفٍ موجودٍ في حاوية فسيُنسَخ الملف من الفضاء المتاح للقراءة فقط إلى الطبقة التي يُسمَح فيها بالقراءة والكتابة، ثم ستُطبَّق التغييرات، والنسخة الموجودة في الطبقة المتاحة للقراءة والكتابة تؤدي إلى «إخفاء» الملف الأصلي لكنها لا تحذفه. التغييرات التي تحدث في الطبقة المتاحة للقراءة والكتابة تتواجد في الحاويات المستقلة فقط، وعندما تُحذَف إحدى الحاويات فستضيع جميع التغييرات إلا إن اتخذنا إجراءات لحفظها.
</p>

<h3>
	التعامل مع الحاويات
</h3>

<p>
	في كل مرة تستعمل فيها الأمر <code>docker run</code> سيؤدي إلى إنشاء حاوية جديدة من الصورة التي حدَّدتَها. ما سبق قد يُسبِّب بعض الالتباس، لذا لنأخذ بعض الأمثلة للتوضيح.
</p>

<h3>
	الخطوة الأولى: إنشاء حاويتَين
</h3>

<p>
	الأمر <code>docker run</code> الآتي سيُنشِئ حاويةً جديدةً تستعمل الصورة <code>ubuntu</code>، ويمنحنا الخيار <code>‎-t</code> وصولًا إلى الطرفية، والخيار <code>‎-i</code> يسمح لنا بالتفاعل معها. سنعتمد على الأمر الافتراضي الموجود في <a href="https://github.com/dockerfile/ubuntu/blob/master/Dockerfile#L32" rel="external nofollow">ملف Docker لتوزيعة أوبنتو</a> (وهو bash) لكي نحصل على وصولٍ للصدفة (shell):
</p>

<pre class="ipsCode" id="ips_uid_5463_7">
$   docker run -ti ubuntu</pre>

<p>
	سيتغير مِحَث سطر الأوامر (prompt) ليُشير إلى أننا نعمل داخل الحاوية بحساب الجذر، متبوعًا بمُعرِّفٍ ذي 12 محرفًا للحاوية، ويبدو المِحث كالآتي:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
root@11cc47339ee1:/#
</code></pre>

<p>
	سنُجري تعديلًا على الحاوية عبر كتابة جملة نصيّة إلى ملفٍ داخل مجلد <code>‎/tmp</code>، ثم سنستخدم الأمر <code>cat</code> للتأكد من أنَّ الملف قد تعدّل:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
echo "Example1" &gt; /tmp/Example1.txt
cat /tmp/Example1.txt
</code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
Example1
</code></pre>

<p>
	لنخرج الآن من الحاوية بالأمر <code>exit</code>. سيوقف تشغيل حاويات Docker عند انتهاء تنفيذ الأمر الذي بدأت به، لذا ستتوقف حاويتنا عن العمل عند خروجنا من الصدفة bash. ولو نفَّذنا الأمر <code>docker ps</code> الذي يعرض الحاويات التي تعمل حاليًا، فلن نشاهد حاويتنا مذكورةً بينها:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
</code></pre>

<p>
	أما إذا استعملنا الخيار <code>‎-a</code> الذي يعرض جميع الحاويات، سواءً كانت متوقفةً أم تعمل حاليًا، فستظهر عندئذٍ حاويتنا في القائمة:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
11cc47339ee1        ubuntu              "/bin/bash"         6 minutes ago       Exited (127) 8 seconds ago                       small_sinoussi
</code></pre>

<p>
	عندما أُنشِئَت الحاوية، أُعطيَتْ مُعرَّفًا واسمٍ مولِّدٍ تلقائيًا. وكان مُعرِّف الحاوية في حالتنا هو <code>11cc47339ee1</code> والاسم المولَّد تلقائيًا هو <code>small_sinoussi</code>. الخيار <code>ps -a</code> يُظهِر هذه القيمة بالإضافة إلى اسم الصورة التي بُنيَت الحاوية عليها (<code>ubuntu</code>)، ومتى أُنشِئَت الحاوية (<code>‎6 minutes ago</code>)، وما الأمر الذي بدأت الحاوية به (<code>‎/bin/bash</code>). والناتج يعرض أيضًا حالة الحاوية (<code>Exited</code>) ومتى دخلت الحاوية بهذه الحالة (<code>‎8 seconds ago</code>). إذا ما زالت الحاوية تعمل عند تنفيذ الأمر، فستظهر الحالة <code>Up</code> مع بيان مدّة تشغيلها. إذا أعدنا تنفيذ الأمر السابق، فستُنشَأ حاويةٌ جديدة:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
docker run -ti ubuntu
</code></pre>

<p>
	سنعرف أنَّ هذه حاويةٌ جديدة لأنَّ مُعرِّف الحاوية الظاهر في المِحَث مختلف، وإذا حاولنا عرض الملف Example1 فلن نجده:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
root@6e4341887b69:/# cat /tmp/Example1
</code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
cat: /tmp/Example1: No such file or directory
</code></pre>

<p>
	قد تظن أنَّ الناتج السابق يعني أنَّ البيانات قد اختفت، لكن ذلك ليس صحيحًا. سنخرج الآن من الحاوية الثانية لنتأكد من أنَّ كلا الحاويتين ما زالتا موجودتين في نظام الملفات، ولم تُحذَف الحاوية الأولى التي أنشأنا فيها الملف.
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                       PORTS                           NAMES
6e4341887b69        ubuntu              "/bin/bash"              About a minute ago   Exited (1) 6 seconds ago                                     kickass_borg
11cc47339ee1        ubuntu              "/bin/bash"              13 minutes ago       Exited (127) 6 minutes ago                                   small_sinoussi
</code></pre>

<h3>
	الخطوة الثانية: إعادة تشغيل الحاوية الأولى
</h3>

<p>
	لإعادة تشغيل حاوية موجودة مسبقًا، فسنستخدم الأمر <code>start</code> مع الخيار <code>‎-a</code> و <code>‎-i</code>، متبوعًا باسم الحاوية أو مُعرِّفها. احرص على أن تضع مُعرِّف الحاوية التي أنشأتها في نظامك في الأمر الآتي:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
docker start -ai 11cc47339ee1
</code></pre>

<p>
	سنجد أنفسنا داخل صدفة bash مرةً أخرى، وعندما نستخدم الأمر <code>cat</code> على الملف الذي أنشأناه مسبقًا فسنرى أنَّه ما يزال موجودًا:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
root@11cc47339ee1:/# cat /tmp/Example1.txt
Example1
</code></pre>

<p>
	يمكننا الآن أن نخرج من الحاوية بالأمر <code>exit</code>. الناتج السابق يُظهِر أنَّ التعديلات التي أُجرِيَت داخل الحاوية ستبقى حتى لو أوقفناها ثم أعدنا تشغيلها مرةً أخرى. ولن يُحذَف محتواها إلا عند إزالة الحاوية. وهذا المثال يبيّن أنَّ التعديلات ستبقى محصورةً في الحاوية، ولن تؤثر على ما سواها، وعند بدء حاوية أخرى فستأخذ بنية نظام الملفات من الصورة الأصلية.
</p>

<h3>
	الخطوة الثالثة: حذف كلا الحاويتين
</h3>

<p>
	لقد أنشأنا في هذا الدرس حاويتين، وسنختمه بتوضيح كيف نحذفهما. يسمح لنا الأمر <code>docker rm</code> –الذي يعمل على الحاويات المتوقفة فقط– بحذف حاوية أو أكثر عبر تحديد اسمها أو مُعرِّفها كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_2608_7">
<code>
docker rm 11cc47339ee1 kickass_borg

11cc47339ee1
kickass_borg
</code></pre>

<p>
	لقد حُذِفَت الحاويتان مع جميع محتوياتها.
</p>

<h3>
	الخلاصة
</h3>

<p>
	لقد ألقينا نظرةً مفصّلةً على الأمر <code>docker run</code> ورأينا كيف يُنشِئ حاويةً جديدةً في كل مرّة يُنفَّذ فيها، ورأينا أيضًا كيفية الحصول على معلومات عن حاوية متوقفة وكيفية تشغيلها والوصول إليها.
</p>

<p>
	 
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/working-with-docker-containers" rel="external nofollow">Working with Docker Containers</a> لصاحبته Melissa Anderson
</p>
]]></description><guid isPermaLink="false">310</guid><pubDate>Fri, 14 Apr 2017 06:15:15 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x634;&#x63A;&#x64A;&#x644; Nginx &#x641;&#x64A; &#x62D;&#x627;&#x648;&#x64A;&#x629; Docker &#x639;&#x644;&#x649; Ubuntu</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-nginx-%D9%81%D9%8A-%D8%AD%D8%A7%D9%88%D9%8A%D8%A9-docker-%D8%B9%D9%84%D9%89-ubuntu-r137/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/docker-nginx.png.5bb14d379f15a3ddd7dd0878dbbd2a17.png" /></p>

<p dir="rtl">يشرح هذا الدّرس كيفيّة نشر Nginx في حاوية Docker container.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/docker-nginx.png.8599830a49f5cefcd869ea738adc82ce.png"><img data-fileid="7042" class="ipsImage ipsImage_thumbnailed" alt="docker-nginx.thumb.png.9a3eccd6306427ee4" src="https://academy.hsoub.com/uploads/monthly_2015_11/docker-nginx.thumb.png.9a3eccd6306427ee40c80724da3d8512.png"></a></p><p dir="rtl">نقلّل باحتواء Nginx من نفقات إدارة النظام، فلن نعود في حاجة إلى إدارة Nginx عبر مُدير الحِزَم أو بنائِه من المصدر، تسمح لنا حاوية Docker ببساطة أن نستبدل كامل الحاوية عند إطلاق إصدار جديد من Nginx، نحتاج فقط إلى الحفاظ على ملفّات إعدادات Nginx ومحتوانا.</p><p dir="rtl">يصف Nginx نفسه كما يلي:</p><blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote=""><p dir="rtl">إنّ engine x] nginx] هو عبارة عن خادوم وسيط عكسي (reverse proxy server) وHTTP، خادوم وسيط بريد (mail proxy server)، وخادوم وسيط TCP عام تمّت كتابته في الأصل بواسطة Igor Sysoev.</p></blockquote><p dir="rtl">يُستَخدَم Nginx من قبل العديد من مديري النُظُم sysadmins في الممارسة العمليّة لتخديم محتوى الويب، ابتداءً من مواقع الملفّات الثابتة flat-file وحتى upstream APIs في NodeJS، سنقوم في هذا الدّرس بتخديم صفحة ويب أساسيّة حتى نستطيع التركيز على إعداد Nginx مع حاوية Docker.</p><p dir="rtl">إنّ حاويات Docker هي شكل شائع من ممارسات عمليّة قديمة نسبيًّا وهي الاحتواء containerization.</p><p dir="rtl">يختلف الاحتواء عن الآلات الافتراضية<span style="color:#FF0000;"> </span>(virtualization) في أنّ الإيهام يقوم بعزل العتاد hardware بعيدًا، بينما يقوم الاحتواء بعزل نظام التشغيل الأساسي بعيدًا أيضًا، يعني هذا من النّاحية العمليّة أنّه يمكننا أخذ تطبيق (أو مجموعة تطبيقات) ووضعها في حاوية (أو حاويات) لجعلها من النمط التركيبي modular، محمولة portable، قابلة للتركيب composable، وخفيفة الوزن lightweight.</p><p dir="rtl">تعني قابليّة النقل portability أنّنا نستطيع تثبيت مُحرِّك Docker Engine (تتم الإشارة له أيضًا بلُب Docker Core، أو حتى Docker فقط) على مجموعة واسعة من أنظمة التّشغيل، وأي حاوية وظيفيّة مكتوبة من قبل أي شخص ستعمل عليه.</p><p dir="rtl">إن أردت تعلّم المزيد حول Docker بإمكانك الاطلاع على <a href="https://academy.hsoub.com/devops/cloud-computing/docker/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-docker-r3/">درس Docker التّمهيدي</a>.</p><p dir="rtl">سنقوم بتثبيت مُحرِّك Docker على Ubuntu لأغراض هذا الدّرس.</p><p dir="rtl">سنثبّت إصدار Docker المستقر الحالي لـ Ubuntu وهو 1.8.1.</p><p dir="rtl">هذا الدّرس مُخصَّص لمستخدمي Nginx الجديدين على Docker، إن كنت تريد الأوامر المجرّدة لإعداد حاوية Nginx لديك تستطيع تطبيق الخطوة الأولى ومن ثمّ الانتقال إلى الخطوة الخامسة.</p><p dir="rtl">إن كنت ترغب ببناء حاويتك خطوة بخطوة والتعلّم عن تعيين المنافذ port mapping والوضع المنفصل detached mode فقم باتّباع كامل الدّرس.</p><h2 dir="rtl">المتطلبات الأساسية</h2><p dir="rtl">من أجل احتواء Nginx يجب علينا إتمام ما يلي:</p><ul dir="rtl"><li>إعداد خادوم Ubuntu ويُفضَّل أن يكون مع مفاتيح SSH Keys من أجل الأمان.</li><li>إعداد مستخدم بصلاحيات الجذر sudo.</li><li>التحقّق من إصدار النّواة Kernel لدينا.</li></ul><p dir="rtl">يعتمد Docker 1.8.1 إلى حدٍّ ما على بعض الميّزات الأخيرة للنواة، لذا تأكّد من أن يكون إصدار النّواة 3.10 أو أعلى، تمتلك أنظمة تشغيل لينِكس الحديثة نواة جديدة نسبيًّا، ولكن إن كنت تريد التحقّق قم بتنفيذ الأمر <span style="font-family:courier new,courier,monospace;">uname –r</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">uname -r</pre><p dir="rtl">لقد قمنا بتضمين الخَرْج output من نسخة Ubuntu 14.04، والتي تحتوي إصدار نواة أعلى من 3.10، لذا لا يجب أن تقلق ما لم تقم بتنفيذ هذا الأمر على نسخة أقدم:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">3.13.0-57-generic</pre><h2 dir="rtl">الخطوة الأولى – تثبيت Docker</h2><p dir="rtl">يستضيف Docker على موقعه script بدء للحصول على Docker وتشغيله على جهازنا، نستطيع ببساطة تنفيذ الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo curl -sSL https://get.docker.com/ | sh</pre><p dir="rtl">لا ينبغي بشكل عام تمرير scripts عشوائيّة من الإنترنت إلى الصّدفة Shell عن طريق الأنبوب (Pipe (<span style="font-family:courier new,courier,monospace;">| sh</span>، لأنّها قد تقوم بفعل أي شيء، ألقِ نظرة على <span style="font-family:courier new,courier,monospace;">get.docker.com</span> إن كنت تريد معرفة ما أنت مُقبِلٌ عليه.</p><p dir="rtl">بعد أن ينتهي تنفيذ الأمر السّابق سنرى الإصدار المُثبَّت كما يلي (قد تكون الأرقام لديك أحدث ولا مشكلة في هذا) وبعض التعليمات حول التشغيل كمستخدم غير جذري non-root\بدون sudo، نقوم في هذا الدّرس بالتشغيل كمستخدم sudo لذا لا داعي للقلق حول هذا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Client:
  Version:     1.8.3
  API version: 1.20
  Go version:  go1.4.2
  Git commit:  f4bf5c7
  Built:       Mon Oct 12 05:37:18 UTC 2015
  OS/Arch:     linux/amd64

Server:
  Version:     1.8.3
  API version: 1.20
  Go version:  go1.4.2
  Git commit:  f4bf5c7
  Built:       Mon Oct 12 05:37:18 UTC 2015
  OS/Arch:     linux/amd64</pre><p dir="rtl"><strong>اختياري:</strong> قم بتشغيل الحاوية<span style="font-family:courier new,courier,monospace;"> hello-world </span>للتحقّق من أنّ كل شيء يعمل كما هو متوقَّع:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker run hello-world</pre><p dir="rtl">يجب أن ترى خَرْجًا مشابهًا للتالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Already exists
library/hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:d5fbd996e6562438f7ea5389d7da867fe58e04d581810e230df4cc073271ea52
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
  1. The Docker client contacted the Docker daemon.
  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
  3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
  4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com

For more examples and ideas, visit:
https://docs.docker.com/userguide/</pre><p dir="rtl">نستطيع بعد الانتهاء ممّا سبق الخوض في أساسيّات Docker.</p><h2 dir="rtl">الخطوة الثانية (اختيارية) – مراجعة أساسيات الحاوية: التشغيل Run، السرد List، الإزالة Remove</h2><p dir="rtl">يشرح هذا القسم كيفيّة تشغيل حاوية أساسيّة ومن ثمّ إزالتها، إن كنت تعرف مُسبقًا كيفيّة استخدام Docker بشكل عام وتريد التخطّي إلى القسم المتعلّق بـ Nginx فاذهب إلى الخطوة الخامسة.</p><p dir="rtl">لقد ثبّتنا عميل Docker Client كجزء من تثبيت Docker لدينا، لذا نمتلك أداة سطر الأوامر التي تسمح لنا بالتفاعل مع حاوياتنا.</p><p dir="rtl">إن قمنا بتنفيذ الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker ps -a</pre><p dir="rtl">ينبغي أن نحصل على خَرْج مُشابِه لما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">CONTAINER ID    IMAGE          COMMAND      CREATED        STATUS                   PORTS        NAMES
a3b149c3ddea    hello-world    "/hello"    3 minutes ago  Exited (0) 3 minutes ago            nostalgic_hopper</pre><p dir="rtl">نستطيع مشاهدة بعض المعلومات الأساسيّة حول حاويتنا.</p><p dir="rtl">سنلاحظ أنّها تملك اسمًا لا معنى له مثل <span style="font-family:courier new,courier,monospace;">nostalgic_hopper</span>، يتم توليد هذه الأسماء تلقائيًّا إن لم نُحدِّد اسمًا عند إنشاء الحاوية.</p><p dir="rtl">نرى أيضًا في هذا المثال أنّه تم تشغيل الحاوية منذ 3 دقائق وتم إنشاؤها منذ 3 دقائق.</p><p dir="rtl">إن قمنا بتشغيل الحاوية مرّة أخرى باستخدام هذا الأمر (مع وضع اسم حاويتنا بدلًا من <span style="font-family:courier new,courier,monospace;">nostalgic_hopper</span>):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker start nostalgic_hopper</pre><p dir="rtl">ومن ثمّ نفّذنا الأمر التالي لعرض الحاويات:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker ps -a</pre><p dir="rtl">يجب أن نشاهد أنّه تم تشغيل الحاوية مؤخّرًا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">CONTAINER ID   IMAGE        COMMAND   CREATED         STATUS                    PORTS   NAMES
a3b149c3ddea   hello-world  "/hello"   4 minutes ago  Exited (0) 9 seconds ago           nostalgic_hopper</pre><p dir="rtl">تقوم حاويات Docker افتراضيًّا بتنفيذ الأوامر المسندة إليها ومن ثمّ الخروج.</p><p dir="rtl">تكون بعض الحاويات مُعدّة لتنفيذ بعض المهام ومن ثمّ الانتهاء من ذلك، بينما يبقى بعضها يعمل بدون وقت مُحدّد.</p><p dir="rtl">الآن وقد مررنا على بعض أساسيّات Docker فلنقم بإزالة الصّورة image التي تُدعى <span style="font-family:courier new,courier,monospace;">hello-world</span>، حيث أنّنا لن نحتاجها مرّة أخرى (تذكّر أن تضع اسم حاويتك بدلًا من <span style="font-family:courier new,courier,monospace;">nostalgic_hopper</span> أو استخدم مُعرِّف ID الحاوية).</p><p dir="rtl">سنبدأ بعد ذلك باستخدام Nginx.</p><h2 dir="rtl">الخطوة الثالثة (اختيارية) – تعلم كيفية عرض expose المنفذ port</h2><p dir="rtl">سنقوم في هذا القسم بتنزيل صورة Nginx Docker image ونرى كيفيّة تشغيل الحاوية بحيث تكون مُتاحة للعوام كخادوم ويب.</p><p dir="rtl">تكون الحاويات افتراضيًّا غير مُتاحة للوصول من قبل الإنترنت، لذا نحتاج إلى تعيين منفذ الحاوية الدّاخلي إلى منفذ Droplet لدينا، هذا ما سنتعلّمه في هذا القسم.</p><p dir="rtl">سنحصل في البداية على صورة Nginx.</p><p dir="rtl">تحتوي الخطوة الخامسة على الأوامر النهائيّة لنشر الحاوية كاملة، لذا إن لم تكن مهتمًّا بتفاصيل التنفيذ تستطيع التخطّي والانتقال إلى هناك.</p><p dir="rtl">نقوم بتنفيذ الأمر التالي للحصول على صورة Nginx Docker:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker pull nginx</pre><p dir="rtl">يقوم هذا بتنزيل جميع العناصر الضّروريّة للحاوية، يُخبِّئ Docker كل هذا في ذاكرة مؤقتة cache حتى لا نحتاج إلى تنزيل صورة الحاوية في كل مرّة نريد فيها تشغيل الحاوية.</p><p dir="rtl">تحتفظ Docker بموقع يُدعى Dockerhub وهو مستودع عام لملفّات Docker (يتضمّن كل من الصّور الرسميّة والمُقدَّمة من قبل المستخدمين)، الصّورة التي قمنا بتنزيلها هي صورة Nginx الرسميّة، والتي توفّر علينا عناء بناء الصّورة الخاصّة بنا.</p><p dir="rtl">فلنقم بتشغيل حاوية Nginx Docker باستخدام هذا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker run --name docker-nginx -p 80:80 nginx</pre><p dir="rtl"><span style="font-family:courier new,courier,monospace;">run</span> هو أمر إنشاء حاوية جديدة</p><ul dir="rtl"><li>يُحدِّد العَلَم <span style="font-family:courier new,courier,monospace;">name--</span> اسم الحاوية (إن تركناه فارغًا سيتم تعيينه تلقائيًّا لنا، مثل <span style="font-family:courier new,courier,monospace;">nostalgic_hopper</span> في الخطوة الثّانية)</li><li>يُحدِّد <span style="font-family:courier new,courier,monospace;">p-</span> المنفذ الذي نقوم بعرضه على هيئة <span style="font-family:courier new,courier,monospace;">p local-machine-port:internal-container-port-</span>، في هذه الحالة نقوم بتعيين المنفذ 80 في الحاوية إلى المنفذ 80 على الخادوم</li><li>nginx هو عبارة عن اسم الصورة على dockerhub (قمنا بتنزيلها من قبل باستخدام الأمر pull، ولكن يقوم Docker بهذا تلقائيًّا إن كانت الصورة مفقودة)</li></ul><p dir="rtl">هذا هو كل ما نحتاجه للحصول على Nginx وتشغيله، نقوم الآن بكتابة عنوان IP لـ Droplet لدينا في متصفّح الويب وهنا يجب أن نرى صفحة "Welcome to nginx".</p><p dir="rtl">سنلاحظ أيضًا في جلسة الصّدفة shell لدينا أنّه يتم تحديث سِجِل Nginx عندما نقوم بطلبات إلى خادومنا، لأنّنا نشغّل الحاويات لدينا بشكل تفاعلي.</p><p dir="rtl">فلنضغط على الاختصار <span style="font-family:courier new,courier,monospace;">CTRL+C</span> للعودة إلى جلسة الصّدفة shell لدينا.</p><p dir="rtl">إن حاولنا الآن تحميل الصفحة سنتلقّى الصّفحة "تم رفض الاتصال" "connection refused"، وقد حدث هذا لأنّنا قمنا بإيقاف تشغيل حاويتنا، بإمكاننا التحقّق من ذلك باستخدام هذا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker ps -a</pre><p dir="rtl">يجب أن نرى شيئًا مشابهًا للخَرْج التّالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">CONTAINER ID   IMAGE   COMMAND                 CREATED         STATUS                     PORTS  NAMES
05012ab02ca1   nginx   "nginx -g 'daemon off"  57 seconds ago  Exited (0) 47 seconds ago         docker-nginx</pre><p dir="rtl">نستطيع أن نرى أنّه تمّ الخروج من حاوية Docker لدينا.</p><p dir="rtl">لن يكون Nginx مفيدًا جدًّا إن كان يجب علينا أن نكون متصلين attached إلى صورة الحاوية من أجل أن يعمل، لذا سنشرح في الخطوة التالية كيفية فصل detach الحاوية للسماح لها بالعمل بشكل مستقل.</p><p dir="rtl">نقوم بإزالة الحاوية <span style="font-family:courier new,courier,monospace;">docker-nginx</span> الحالية عن طريق هذا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker rm docker-nginx</pre><p dir="rtl">سنشرح في الخطوة التالية كيفيّة تشغيلها في الوضع المنفصل detached mode.</p><h2 dir="rtl">الخطوة الرابعة (اختيارية) – تعلم كيفية التشغيل في الوضع المنفصل</h2><p dir="rtl">نُنشِئ حاوية Nginx جديدة منفصلة باستخدام هذا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker run --name docker-nginx -p 80:80 -d nginx</pre><p dir="rtl">أضفنا العَلَم <span style="font-family:courier new,courier,monospace;">d-</span> لتشغيل هذه الحاوية في الخلفيّة.</p><p dir="rtl">يجب أن يكون الخَرْج ببساطة مُعرِّف ID الحاوية الجديدة.</p><p dir="rtl">إن قُمنا بتشغيل أمر السّرد <span style="font-family:courier new,courier,monospace;">list</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker ps</pre><p dir="rtl">سنرى في الخَرْج العديد من الأشياء التي لم نشاهدها من قبل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">CONTAINER ID  IMAGE  COMMAND                 CREATED             STATUS             PORTS              NAMES
b91f3ce26553  nginx  "nginx -g 'daemon off"  About a minute ago  Up About a minute  0.0.0.0:80-&gt;80/tcp, 443/tcp             docker-nginx</pre><p dir="rtl">بإمكاننا أن نرى أنّه بدلًا من <span style="font-family:courier new,courier,monospace;">Exited (0) X minutes ago</span> نمتلك الآن <span style="font-family:courier new,courier,monospace;">Up About a minute</span>، ونرى أيضًا تعيين المنفذ port mapping.</p><p dir="rtl">إن ذهبنا إلى عنوان IP خادومنا باستخدام المتصفّح فسنشاهد الصفحة "!Welcome to nginx" مرّة أخرى، ولكن في هذه المرّة تعمل الحاوية في الخلفيّة لأنّنا حدّدنا العَلَم <span style="font-family:courier new,courier,monospace;">d-</span> والذي يُخبِر Docker أن يُشغِّل هذه الحاوية في الوضع المنفصل.</p><p dir="rtl">نمتلك الآن نسخة من Nginx تعمل في الوضع المنفصل.</p><p dir="rtl">وبالرغم من ذلك فهي ليست مفيدة بما فيه الكفاية حتى الآن، لأنّنا لا نستطيع تحرير edit ملف الإعدادات ولا تمتلك الحاوية نفاذًا إلى أي من ملفّات مواقع الويب لدينا.</p><p dir="rtl">نوقف الحاوية بتنفيذ الأمر التّالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker stop docker-nginx</pre><p dir="rtl">والآن وقد توقفت الحاوية عن العمل (نستطيع التحقّق باستخدام الأمر <span style="font-family:courier new,courier,monospace;">sudo docker ps –a</span> إن أردنا أن نكون متأكدين من ذلك) فبإمكاننا إزالتها بتنفيذ الأمر التّالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker rm docker-nginx</pre><p dir="rtl">سنصل الآن إلى الإصدار النّهائي لحاويتنا مع وقفة سريعة لإنشاء ملف مُخصَّص لموقع الإنترنت.</p><h2 dir="rtl">الخطوة الخامسة – بناء صفحة ويب ليتم تخديمها على Nginx</h2><p dir="rtl">سنُنشِئ في هذه الخطوة صفحة فهرس index مُخصَّصة لموقعنا، يسمح لنا هذا الإعداد بأن نملك محتوى للموقع بشكل دائم تتم استضافته خارج الحاوية (العابرة transient).</p><p dir="rtl">فلنقم بإنشاء دليل جديد من أجل محتوى موقعنا بداخل الدّليل الرئيسي home directory والانتقال إليه بتنفيذ الأوامر التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">mkdir -p ~/docker-nginx/html
cd ~/docker-nginx/html</pre><p dir="rtl">نُنشِئ الآن ملف HTML (طبّقنا الأوامر من أجل مُحرِّر النّصوص Vim ولكن تستطيع استخدام أي مُحرِّر نصوص آخر).</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">vim index.html</pre><p dir="rtl">ننتقل إلى وضع الإدخال insert mode عن طريق الضغط على <span style="font-family:courier new,courier,monospace;">i</span>، ونلصق المحتوى التّالي بداخل الملف السّابق (أو بإمكانك إضافة محتوى HTML الخاص بك):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;html&gt;
&lt;head&gt;
    &lt;link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous"&gt;
    &lt;title&gt;Docker nginx Tutorial&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div class="container"&gt;
        &lt;h1&gt;Hello Digital Ocean&lt;/h1&gt;
        &lt;p&gt;This nginx page is brought to you by Docker and Digital Ocean&lt;/p&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p dir="rtl">إن كنت على معرفة بـ HTML سترى أنّها صفحة ويب بسيطة، قمنا بتضمين وسم <span style="font-family:courier new,courier,monospace;">&lt;link&gt; </span>يُشير إلى شبكة توزيع محتوى CDN من أجل Bootstrap (وهو إطار عمل CSS يُعطي لصفحتنا مجموعة من التنسيقات المتجاوبة responsive)، تستطيع قراءة المزيد عن Bootstrap.</p><p dir="rtl">نحفظ هذا الملف الآن عن طريق الضغط على <span style="font-family:courier new,courier,monospace;">ESC</span> ومن ثمّ <span style="font-family:courier new,courier,monospace;">wq:</span> و <span style="font-family:courier new,courier,monospace;">ENTER</span>:</p><ul dir="rtl"><li>تُخبِر (write (<span style="font-family:courier new,courier,monospace;">w</span> أن يقوم Vim بكتابة التغييرات إلى الملف.</li><li>تُخبِر (quit (<span style="font-family:courier new,courier,monospace;">q</span> أن يقوم Vim بالخروج.</li></ul><p dir="rtl">نمتلك الآن صفحة فهرس index بسيطة بدلًا من صفحة هبوط Nginx الافتراضيّة.</p><h2 dir="rtl">الخطوة السادسة – ربط الحاوية إلى نظام الملفات المحلي</h2><p dir="rtl">في هذا القسم سنضع كل ما سبق معًا، سنقوم بتشغيل حاوية Nginx لدينا بحيث تكون قابلة للنفاذ على الإنترنت عبر المنفذ 80، وسنقوم بتوصيلها إلى محتوى موقع الويب لدينا على الخادوم.</p><h3 dir="rtl">معلومات أساسية حول مسارات التخزين<span style="color:#FF0000;"> </span>(volumes) والتي هي الرّبط إلى محتوى خادوم بشكل دائم من قبل الحاوية الخاصة بنا</h3><p dir="rtl">يسمح لنا Docker بربط الأدلّة directories من نظام الملفّات المحلّي للجهاز الافتراضي Virtual Machine لدينا إلى حاوياتنا.</p><p dir="rtl">وفي حالتنا بما أنّنا نريد تخديم صفحات ويب نحتاج إلى إعطاء حاويتنا الملفّات التي نريد تقديمها.</p><p dir="rtl">كان باستطاعتنا نسخ الملفّات إلى الحاوية كجزء من ملفّات Docker، أو نسخها إلى الحاوية بعد إسقاطها أو توقيفها، ولكن هاتين الطريقتين تبقيان موقعنا في حالة ثابتة بداخل حاويتنا، أمّا باستخدام ميزة حجوم volumes البيانات بإمكاننا إنشاء ارتباط رمزي بين نظام ملفّات Droplet ونظام ملفّات الحاوية، يسمح لنا هذا بتحرير ملفّات صفحات الويب الموجودة حاليًّا وإضافة ملفّات جديدة إلى الدّليل وستكون الحاوية قادرة على النفاذ لها بشكل تلقائي، إن كنت ترغب بقراءة المزيد حول Docker ومسارات التخزين volumes تحقّق من وثائق حجوم البيانات data volumes.</p><p dir="rtl">تكون حاوية Nginx مُعدَّة افتراضيًّا لتبحث عن صفحة فهرس index في المسار <span style="font-family:courier new,courier,monospace;">usr/share/nginx/html/</span>، لذا نحتاج في حاوية Docker الجديدة الخاصّة بنا أن نقوم بإعطائها نفاذًا إلى ملفّاتنا في ذلك الموقع.</p><h3 dir="rtl">إنشاء الربط</h3><p dir="rtl">لإنشاء الربط نستخدم العَلَم<span style="font-family:courier new,courier,monospace;"> v-</span> لتعيين مُجلَّد من جهازنا المحلّي (<span style="font-family:courier new,courier,monospace;">docker-nginx/html/~</span>) إلى مسار نسبي في الحاوية (<span style="font-family:courier new,courier,monospace;">usr/share/nginx/html/</span>).</p><p dir="rtl">نستطيع إتمام هذا بتنفيذ الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker run --name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx</pre><p dir="rtl">نرى أنّ الإضافة الجديدة إلى الأمر <span style="font-family:courier new,courier,monospace;">v ~/docker-nginx/html:/usr/share/nginx/html-</span> هي رابط مسار تخزين volume لدينا.</p><ul dir="rtl"><li>تُحدِّد<span style="font-family:courier new,courier,monospace;"> v-</span> أنّنا نقوم بربط<span style="color:#FF0000;"> </span>مسار تخزين volume.</li><li>الجزء الذي على يسار "<span style="font-family:courier new,courier,monospace;">:"</span> هو موقع ملفّنا/دليلنا على الجهاز الافتراضي (docker-nginx/html/~).</li><li>الجزء الذي على يمين "<span style="font-family:courier new,courier,monospace;">:</span>" هو الموقع الذي نقوم بالرّبط إليه في حاويتنا (usr/share/nginx/html/).</li></ul><p dir="rtl">إن قمنا بعد تنفيذ هذا الأمر بالتوجّه باستخدام المتصفّح إلى عنوان IP الخاص بـ DigitalOcean Droplet مثلا (إن كنت على DigitalOcean) لدينا فيجب أن نرى الترويسة الأولى من Hello Digital Ocean (أو أي صفحة ويب أنشأتها في الخطوة الخامسة).</p><p dir="rtl">إن كنت سعيدًا بإعدادات Nginx الافتراضيّة الأخرى فأنت الآن جاهز.</p><p dir="rtl">تستطيع رفع المزيد من المحتوى إلى الدّليل docker-nginx/html/~ وستتم إضافته إلى موقعك بشكل مباشر.</p><p dir="rtl">إن قمنا على سبيل المثال بتعديل ملف الفهرس لدينا وأعدنا تحميل نافذة متصفحنا، سنرى أنّ التحديث يحدث آنيًّا، نستطيع بناء موقع كامل من ملفّات HTML ثابتة بهذه الطريقة، على سبيل المثال إن أضفنا صفحة<span style="font-family:courier new,courier,monospace;"> about.html</span> فبإمكاننا النفاذ إليها على الرّابط <a rel="external nofollow" href="http://your_server_ip/about.html">http://your_server_ip/about.html</a> بدون الحاجة للتعامل مع حاويتنا.</p><h2 dir="rtl">الخطوة السابعة (اختيارية) – استخدام ملف إعدادات Nginx الخاص بنا</h2><p dir="rtl">هذ القسم مُخصَّص للمستخدمين المتقدّمين الذين يرغبون باستخدام ملف إعدادات Nginx الخاص بهم مع حاوية Nginx لديهم، قم بتجاوز هذه الخطوة إن كنت لا تملك ملف إعدادات مُخصَّص تريد استخدامه.</p><p dir="rtl">فلنقم بالعودة دليلًا إلى الوراء كيلا نكتب إلى دليل HTML المتاح للعوام لدينا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd ~/docker-nginx</pre><p dir="rtl">إن كنّا نرغب بإلقاء نظرة على ملف الإعدادات الافتراضي نقوم فقط بنسخه باستخدام أمر Docker للنسخ:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf</pre><p dir="rtl">وبما أنّنا سنقوم باستخدام ملف <span style="font-family:courier new,courier,monospace;">conf.</span> مُخصَّص من أجل Nginx سنحتاج إلى إعادة بناء الحاوية.</p><p dir="rtl">نقوم في البداية بإيقاف الحاوية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker stop docker-nginx</pre><p dir="rtl">نزيل الحاوية باستخدام الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker rm docker-nginx</pre><p dir="rtl">نستطيع الآن تحرير الملف الافتراضي محليًّا (لتخديم دليل جديد أو استخدام <span style="font-family:courier new,courier,monospace;">proxy_pass</span> لتمرير حركة مرور البيانات traffic إلى تطبيق أو حاوية أخرى كما كنّا نفعل مع تثبيت Nginx الاعتيادي)، تستطيع القراءة حول ملف إعدادات Nginx في دليل ملف إعدادات Nginx.</p><p dir="rtl">بعد أن نقوم بحفظ ملف إعداداتنا المُخصَّص يحين الوقت لصنع حاوية Nginx، نضيف ببساطة علم <span style="font-family:courier new,courier,monospace;">v-</span> آخر مع المسار المناسب لإعطاء حاوية Nginx الجديدة الروابط المناسبة لتعمل من خلال ملف إعداداتنا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker run --name docker-nginx -p 80:80 -v ~/docker-nginx/html:/usr/share/nginx/html -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx</pre><p dir="rtl">لا يزال هذا الأمر يربط صفحات الموقع المُخصَّصة إلى الحاوية أيضًا.</p><p dir="rtl">نلاحظ أنّنا سنحتاج إلى إعادة تشغيل الحاوية باستخدام الأمر <span style="font-family:courier new,courier,monospace;">docker restart</span> بعد أي تغيير لملف الإعدادات أثناء تشغيل الحاوية، لأنّ Nginx لا يقوم بإعادة تحميل فوري إن تمّ تغيير ملف إعداداته:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo docker restart docker-nginx</pre><h2 dir="rtl">الخاتمة</h2><p dir="rtl"><a rel="external nofollow" name="_GoBack"></a> نمتلك الآن حاوية Nginx قيد التشغيل وتُخدِّم صفحة ويب مُخصَّصة.</p><p dir="rtl">نوصي من هذه النقطة القراءة حول ربط حاوية Docker إن كنت تريد التعلّم حول ربط الحاويات ببعضها لأغراض استخدام Nginx كوسيط عكسي reverse proxy لتخديم تطبيقات الويب الأخرى المعتمدة على الحاوية.</p><p dir="rtl">إن كنت تريد إدارة مجموعة من الحاويات مثل حاوية تطبيق، حاوية قاعدة بيانات، وحاوية Nginx، فألقِ نظرة على تركيب Docker Compose.</p><p dir="rtl">ترجمة -وبتصرّف- لـ <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-run-nginx-in-a-docker-container-on-ubuntu-14-04">How To Run Nginx in a Docker Container on Ubuntu 14.04</a> لصاحبه Thomas Taege.</p>
]]></description><guid isPermaLink="false">137</guid><pubDate>Sun, 08 Nov 2015 21:34:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x648;&#x627;&#x644;&#x62C;&#x62F;&#x648;&#x644;&#x629; &#x644;&#x640;&#x650; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%88%D8%A7%D9%84%D8%AC%D8%AF%D9%88%D9%84%D8%A9-%D9%84%D9%80%D9%90-docker-r40/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/docker-orch-sched.jpg.29affbce17945120e3060fb366802983.jpg" /></p>

<p dir="rtl">يُوفِّر Docker كل الدّوال (Functions) المطلوبة لبناء، رفع Upload، تنزيل Download، بدْء تشغيل وإيقاف الحاويّات؛ وهو مناسِب جدًّا لإدارة كل هذه العمليّات في بيئة من مُستضيف وحيد بعدد محدود من الحاويّات. رغم ذلك يلجأ كثيرون لاستخدام هذه المنصّة كأداة لبناء حاويّات تتوزَّع على عدّة مستضيفات مختلفة. تُمثِّل إدارة عناقيد من المُستضيفات Clustered hosts تحدِّيًّا جدّيًا يتطلّب مجموعةً مختلفة من الأدوات.</p><p dir="rtl">سنعرِض في هذا المقال المُجدوِلاتِ Schedulers وأدواتِ التّنسيق Orchestration المُستَخدمةَ مع Docker. تُمثّل هذه الأدوات الواجهة الرّئيسة لإدارة الحاويّات والنّشر المُوزَّع.</p><h2 dir="rtl">جدولة الحاويات، التنسيق وإدراة العنقود</h2><p dir="rtl">القدرة على إدارة كل نظام مُستضيف وتفادي تعقيدات البنية التّحتيّة لبيئة العمل هي إحدى الوظائف الأكثر جاذبية عند التّطرق إلى توسّع Scaling التّطبيقات عبر عدة أنظمة مستضيفة. يظهر في هذا الإطار مُصطلح التّنسيق الّذي يشمل جدولة الحاويّات، وإدارة العنقود، وفي بعض الأحيان تجهيز وإعداد مُستضيفات جديدة.</p><p dir="rtl">تُحيل الجدولة Scheduling عند الحديث عن النّظام البيئي لDocker إلى القدرة على رفع ملفّ يُعرِّف كيفيّة تشغيل حاويّة مُعيَّنة إلى النّظام المُستضيف؛ في حين نعني بالمُجدوِلات الأدواتِ المسؤولةَ عن التّدخّل في نِظام التّهيِئة الأوّليّة Init system لإدارة الخدمات حسب المطلوب.</p><p dir="rtl">أمّا إدارة العنقود فتُشير إلى التّحكّم في مجموعة من المُستضيفات. يُمكِن أن تشمل هذه العمليّة إضافة أو إخراج مُستضيفات من العنقود، الحصول على معلومات عن حالة المُستضيفات أو الحاويّات، وبدْء تشغيل أو إيقاف العمليّات Processes. ترتبط إدارة العنقود بشكل وثيق مع الجدولة، إذ يجب أن تكون لدى المُجدوِل القدرةُ على الوصول إلى كل واحد من المستضيفات الموجودة في العنقود من أجل جدولة الخدمات. لهذا السبّب يغلُب استخدام نفس الأداة للتّنسيق والجدولة.</p><p dir="rtl">من أجل إدارة وتشغيل الحاويّات على المُستضيفات المتواجدة على العنقود، يجب على المُجدوِل التّعاطي مع نظام التهيئة الأوّليّة لكلّ واحد من المُستضيفات. يجب على المُجدوِل في نفس الوقت، لتسهيل الإدارة، تقديمُ رؤية مُوَّحّدة لحالة الخدمات على كامل العنقود؛ ممّا يقوده إلى أن يعمل كنظام تهيئة أوليّة عابر للعنقود. لهذا السّبب تلجأ العديد من المُجدوِلات إلى أخذ صوّر طبق الأصل من بنية أوامر أنظمة التّهيئة الأوّليّة، ثمّ تعمل على تجريدها Abstract (إخفاء تعقيدات التّعامل مع بنية هذه الأنظمة).</p><p dir="rtl">يُعتَبر اختيّارُ المُستضيف أحد أهمّ مسؤوليّات المُجدوِل، حيثُ إنه يتولّى تحديد المُستضيف الّذي ستعمل عليه الخدمة (الحاويّة) أوتوماتيكِيًّا بعدَ اتّخاذ المُدير قرار تنفيذها. يُمكِن للمُدير تحديد قيود على اختيّار المُستضيف، لكن في النّهاية المُجدوِل هو من سيُنفّذ هذه التّعليمات.</p><h2 dir="rtl">كيف يتّخذ المُجدوِل قراراته؟</h2><p dir="rtl">تُعرِّف المجدوِلات عادةً سياسة افتراضيّة للجدولة. تُحدِّد هذه السّيّاسة كيف ستُنَفَّذ الخدمات في حال عدم وجود مُدخَلات من طرف المُدير. على سبيل يُمكن أن تكون السّيّاسة الافتراضيّة هيّ وضع الخدمات الجديدة على المُستضيفات الّتي يوجد بها أقلّ عدد من التّطبيقات النّشِطة.</p><p dir="rtl">تُتيح المُجدوِلات إمكانيّة إعادة كتابة آليّاتِها، ممّا يسمح للمُديرين بتدقيق ضبط عمليّة الاختيّار لتستجيبَ لمُتطَلَّبات مُحدَّدة. على سبيل المثال، إذا وجَب تشغيل حاويّتَين على نفس المُستضيف لكونهما تعملان كوِحدة Unit، فيُمكِن إعلان هذا الغرض أثناء الجدولة. بالمِثل، يُمكِن فصلُ حاويَّتيْن بحيثُ لا تعملان على نفس المُستضيف، لأغراض تتعلّق بالتّوفّر العالي High availability لنظيرَيْن Instances من نفس الخدمة على سبيل المثال.</p><p dir="rtl">قد تُمثَّل القيود الّتي يُمكِن لمُجدوِل أخذها في الحسبان، على هيأة بيانات وصفيّة Metadata مُوَّجَّهة لأغراض التّحكّم، فتُوضع لصائق Labels على المُستضيفات ليستعين بها المُجدوِل. يكون هذا ضروريًّا إذا كان المُستضيف يحوي تجزئةَ بيانات Data volume يحتاجها أحد التّطبيقات. تحتاج بعض الخدمات إلى أن تُنشَر على كلّ مُستضيف في العنقود، وهو ما تُتيحه المُجدوِلات.</p><h2 dir="rtl">ما وظائف إدارة العنقود التي توفرها المُجدوِلات؟</h2><p dir="rtl">ترتبِط وظيفتا الجدولة وإدارة العنقود ارتباطًا وثيقًا لأنّ كلًّا منهما تتطلّب القدرة على العمل على مُستضيفات مُحدَّدة وعلى العنقود ككلّ.</p><p dir="rtl">تُستخدَم برامج إدارة العناقيد لطلب معلومات عن أعضاء عنقود، إضافة أو حذف أعضاء، أو حتّى الاتّصال بمُستضيف مُعيَّن لإدارة أكثر تخصيصًا. يُمكِن أن تُضاف هذه الوظائف إلى المُجدوِل كما يُمكِن إدراجها ضمن مسؤوليّة برنامج مُستقلّ.</p><p dir="rtl">ترتبِط إدارة العنقود في كثيرٍ من الحالات بأداة استكشاف الخدمة أو مخزن إعدادات بصيغة مفتاح-قيمة. يُفيد هذا الارتباط في توزيع المعلومات وحفظها عبرَ كامل العنقود، كما أنّ المنصّة في هذه الحالة جاهزة لوظيفتها الأوليّة.</p><p dir="rtl">في هذه الحالة (ارتباط أداة الإدارة باستكشاف الخدمة ومخزن الإعدادات) يحتاج إجراء بعض مهامّ إدارة العنقود، إن لم تتوفّّر طُرُق Methods للتّخاطُب مع المُجدوِل، إلى تغيير قيّم موجودة في مخزن الإعدادات عن طريق واجهته لبرمجة التّطبيقات Application programming interface, <abbr title="واجهة برمجية | Application Programming Interface">API</abbr>. على سبيل المثال: تُغَيَّر عضويّات العنقود عن طريق التّعديل على قيّم في مخزن الإعدادات.</p><p dir="rtl">يُحتفَظ بالبيانات الوصفيّة المُتعلِّقة بالمُستضيفات في مخزن الإعدادات؛ حيثُ يُمكن استخدامها كما ذكرنا سابِقًا لاستهداف مستضيف أو مجموعة من المُستضيفات بقرارات جدولة.</p><h2 dir="rtl">كيف تكون الجدولة في حالة تجميع الحاويّات؟</h2><p dir="rtl">يتوجّب في بعض الأحيان إدارة عدّة خدمات كما لو كانت تطبيقًا واحدًا، ففي بعض الحالات لا يُمكن حتى نشر خدمة دون نشر خدمة أخرى مُصاحِبة لها، لارتباط عملهما. تُوفّر عدّة مشاريع تنسيقًا متقدِّمًا يأخذ في الحسبان تجميع الحاويّات، ولهذه الوظيفة عدّة فوائد.</p><p dir="rtl">تسمح إدارة الحاويّات على مجموعات للمُدير بالتّعامل مع تشكيلة من الحاويّات على أنّها تطبيق واحد. يُبسِّط تشغيلُ عدّة عناصر مُرتبِطة بإحكام إدارةَ التّطبيقات دون أن يكون ذلك على حساب فوائد تقسيمها إلى حاويّات لكلٍّ منها وظيفة منفصِلة؛ حيثُ يسمح للمُدير بالحفاظ على فوائد استخدام التّصميم خدَمي التّوجّه Service-oriented مع تقليل جهد الإدارة.</p><p dir="rtl">يُمكِن أن يعنيَ تجميعُ التّطبيقات ببساطة جدولتَها وإتاحة إمكانيّة تشغيلها أو إيقافها معًا؛ كما أنّه قد يُشير إلى تصوّرات أكثر تعقيدًا مثل فصل كل مجموعة ضمن شبكة فرعيّة أو العمل على توسّع Scaling مجموعة من الحاويّات بدل العناية بالتّوسّع الفردي لكل واحدة منها.</p><h2 dir="rtl">ماذا نعني بالتّجهيز Provisioning؟</h2><p dir="rtl">يرتبِط مفهوم التّجهيز بإدارة العناقيد. نعني بالتّجهيز مجموعة الآليّات الّتي تسمح بإضافة وإعداد مُستضيفات جديدة لتكون جاهزةً للعمل ضمن العنقود. في حالة نشر التّطبيقات عبر Docker فإنّ التّجهيز يعني إعداد Docker وضبطَ المُستضيف الجديد للالتحاق بعنقود موجود.</p><p dir="rtl">تختلف طريقة التّجهيز بشكل كبير حسب الأدوات المُستخدَمة ونوعيّة المُستضيف، ولكن الهدف في الأخير هو نظام جديد جاهز للعمل. على سبيل المثال، إذا كان المُستضيف آلة تخيّليّة Virtual machine فإن أدواتٍ مثل Vagrant يُمكِن أن تُستخدَم لإعداد المستضيف الجديد. يسمح معظَم مزوّدي الخدمات السّحابية Cloud providers بإنشاء مُستضيفات جديدة اعتمادًا على واجهة تطبيقات برمجيّة <abbr title="واجهة برمجية | Application Programming Interface">API</abbr>. على الجانب الآخر، يحتاج تجهيزُ عتاد خام (حاسوب بدون نظام تشغيل) لتدخّل يدوي أكثر؛ يُمكن اللّجوء إلى أدوات مثل Ansible، Puppet، Chef أو Salt من أجل الإعداد التّمهيدي للمُستضيف وتجهيزه بالمعلومات المطلوبة للاتّصال بالعنقود.</p><p dir="rtl">يوجد خيارات للتّجهيز: إمّا أن يكون عمليّة يدويّة يُطلِقها المُدير، أو أن يكون جزْءًا من أدوات إدارة العنقود من أجل أتممة التوسّع Automation. يتطلّب الخيّارُ الأخير تعريفَ إجراء يطلُب مُستضيفات جديدة والشّروط الّتي يجب أن يحصُل حسبها الطّلب. على سبيل المثال، إذا كان تطبيقٌ يُعاني من الحِمل الزّائد على الخادوم، فيُمكِن ضبط مُستضيفات وإلحاقُها بالنِّظام لتتوسَّعَ الحاويّات أفقيًّا عبر البُنية التّحتيّة الجديدة، من أجل التّخفيف من الضّغط على الخادوم.</p><h2 dir="rtl">ماهيّ المُجدوِلات الأكثر انتشارًا؟</h2><p dir="rtl">من بين المشاريع الأكثر شهرةً في الجدولة وإدارة العناقيد (الوظائف الأساسيّة):</p><ul><li><p dir="rtl"><strong>Fleet:</strong> أداة الجدولة وإدارة العناقيد ضمن توزيعة CoreOs. تقرأ Fleet معلومات الاتّصال لكل مُستضيف في العنقود من etcd ( أداة استكشاف خدمة وإعداد عموميّ مُوزَّع لكل من الحاويّات والأنظمة المُستضيفة، جزْء من توزيعة CoreOs) وتُوفِّر خدمة إدارة شبيهة بSystemd (نِظام تهيئة أوّليّة بدأت الكثير من توزيعات غنو/لينوكس اعتمادَه ليكون بديلًا عن أنظمة التّهيِئة الأوّليّة التّقليديّة).</p></li><li><p dir="rtl"><strong>Marathon:</strong> وهو العنصُر المسؤول عن الجدولة وإدارة الخدمات في Mesosphere (نظام تشغيل مُوجَّه لإدارة مراكز البيانات Data centers). يعمل مع mesos (أداة لتجريد وإدارة جميع موارد العنقود) للتّحكّم في الخدمات الّتي تعمل لفترات زمنيّة طويلة. كما أنّه يُوفِّر واجهة ويب لإدارة الحاويّات.</p></li><li><p dir="rtl"><strong>Swarm: </strong>أعلن مشروع Docker عن مُجدوِل Swarm في ديسمبر/كانون الأوّل سنة 2014، ويأمل في أن يُقدِّمَ مجدوِلًا جيّدًا يُمكنه تقسيم الحاويّات على المُستضيفات المُجهَّزَة على Docker، وذلك باستخدام نفس الصّيّاغة Syntax الّتي يستخدمها Docker.</p></li></ul><p dir="rtl">بالنّسبة للجدولة المُتقدّمة والتّحكّم في مجموعات الحاويّات، توجد المشاريع التّاليّة:</p><ul><li><p dir="rtl"><strong>kubernetes:</strong> مُجدوِل مُتقدّم من Google. يُتيح kubernetes تحكّمًا متقدّمًا في الحاويّات؛ حيث يُمكِن توصيف الحاويّات، تجميعها، وإعطاءُها شبكات فرعيّة مستقلّة للاتّصال.</p></li><li><p dir="rtl"><strong>compose:</strong> مشروع تابِع لـ Docker، أُنشِئ لإضافة إمكانيّة إدارة مجموعات من الحاويّات باستخدام ملفّات إعداد تقريريّة Declarative. يستخدِم روابط Docker لمعرفة معلومات عن علاقات التّبعيّة بين الحاويّات.</p></li></ul><h2 dir="rtl">خلاصة</h2><p dir="rtl">تُمثِّل إدارة العناقيد والجدولة جزأين مهمَّيْن من إعداد وتنفيذ خدمات تعتمد على الحاويّات في بيئة مُوزَّعة مُكوَّنة من عدّة مُستضيفات، إذ تُوفِّران الوظائف الأساسيّة من أجل بدْء تشغيل الخدمات والتّحكّم فيها. يُمكِن عبر استخدام المُجدوِلات بفعاليّة إحداثُ تغييرات كبيرة على عمل التّطبيقات، بالقليل من الجُهد.</p><p dir="rtl"> </p><p dir="rtl"> </p>
]]></description><guid isPermaLink="false">40</guid><pubDate>Sat, 02 May 2015 11:23:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x651;&#x634;&#x628;&#x64A;&#x643; &#x648;&#x627;&#x644;&#x62A;&#x651;&#x648;&#x627;&#x635;&#x64F;&#x644; &#x639;&#x644;&#x649; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D8%A7%D9%84%D8%AA%D9%91%D8%B4%D8%A8%D9%8A%D9%83-%D9%88%D8%A7%D9%84%D8%AA%D9%91%D9%88%D8%A7%D8%B5%D9%8F%D9%84-%D8%B9%D9%84%D9%89-docker-r37/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/docker-containers_480x300.jpg.7f7ec515a8c21d2e631f755695c63408.jpg" /></p>
<h2 dir="rtl">&#1605;&#1602;&#1583;&#1617;&#1605;&#1577;</h2><p dir="rtl">&#1610;&#1603;&#1578;&#1587;&#1610; &#1575;&#1604;&#1578;&#1617;&#1608;&#1575;&#1589;&#1604; Communication &#1608;&#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; Networking &#1571;&#1607;&#1605;&#1610;&#1617;&#1577;&#1611; &#1576;&#1575;&#1604;&#1594;&#1577; &#1593;&#1606;&#1583; &#1576;&#1606;&#1575;&#1569; &#1606;&#1615;&#1592;&#1615;&#1605; &#1605;&#1608;&#1586;&#1617;&#1614;&#1593;&#1577; &#1578;&#1593;&#1605;&#1604; &#1593;&#1604;&#1610;&#1607;&#1575; &#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; Docker&#1563; &#1581;&#1610;&#1579;&#1615; &#1578;&#1593;&#1578;&#1605;&#1583; &#1576;&#1606;&#1610;&#1577; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1578;&#1576;&#1593; &#1575;&#1604;&#1578;&#1617;&#1589;&#1605;&#1610;&#1605; &#1582;&#1614;&#1583;&#1614;&#1605;&#1610; &#1575;&#1604;&#1578;&#1617;&#1608;&#1580;&#1617;&#1607; Service-oriented &#1576;&#1588;&#1603;&#1604; &#1603;&#1576;&#1610;&#1585; &#1593;&#1604;&#1609; &#1578;&#1608;&#1575;&#1589;&#1615;&#1604; &#1575;&#1604;&#1605;&#1603;&#1608;&#1617;&#1616;&#1606;&#1575;&#1578; &#1601;&#1610; &#1605;&#1575; &#1576;&#1610;&#1606;&#1607;&#1575; &#1581;&#1578;&#1609; &#1578;&#1593;&#1605;&#1604; &#1603;&#1605;&#1575; &#1610;&#1615;&#1585;&#1575;&#1583;&#1615; &#1604;&#1607;&#1575;.</p><p dir="rtl">&#1587;&#1606;&#1584;&#1603;&#1615;&#1585; &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1583;&#1617;&#1585;&#1587;&nbsp;&#1571;&#1583;&#1608;&#1575;&#1578;&#1616; &#1608;&#1573;&#1587;&#1578;&#1585;&#1575;&#1578;&#1610;&#1580;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1575;&#1604;&#1605;&#1615;&#1578;&#1593;&#1583;&#1617;&#1583;&#1577; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1582;&#1583;&#1614;&#1605;&#1577; &#1604;&#1590;&#1576;&#1591; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1593;&#1605;&#1604; &#1593;&#1604;&#1610;&#1607;&#1575; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578;&#1563; &#1608;&#1584;&#1604;&#1603; &#1605;&#1606; &#1571;&#1580;&#1604; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1609; &#1575;&#1604;&#1608;&#1590;&#1593;&#1610;&#1577; &#1575;&#1604;&#1605;&#1585;&#1594;&#1608;&#1576;&#1577; &#1604;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577;. &#1610;&#1615;&#1605;&#1603;&#1606; &#1601;&#1610; &#1576;&#1593;&#1590; &#1575;&#1604;&#1581;&#1575;&#1604;&#1575;&#1578; &#1575;&#1604;&#1575;&#1593;&#1578;&#1605;&#1575;&#1583; &#1593;&#1604;&#1609; &#1575;&#1604;&#1581;&#1604;&#1608;&#1604; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1608;&#1601;&#1617;&#1585;&#1607;&#1575; Docker &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1611;&#1575;&#1548; &#1573;&#1604;&#1617;&#1575; &#1571;&#1606;&#1617; &#1601;&#1610; &#1576;&#1593;&#1590; &#1575;&#1604;&#1581;&#1575;&#1604;&#1575;&#1578; &#1578;&#1578;&#1591;&#1604;&#1617;&#1576; &#1575;&#1604;&#1575;&#1587;&#1578;&#1593;&#1575;&#1606;&#1577; &#1576;&#1576;&#1593;&#1590; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1575;&#1604;&#1576;&#1583;&#1610;&#1604;&#1577;.</p><h2 dir="rtl">&#1575;&#1604;&#1581;&#1604; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610; &#1604;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1593;&#1604;&#1609; Docker</h2><p dir="rtl">&#1610;&#1602;&#1583;&#1617;&#1605; Docker &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1611;&#1575; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1604;&#1602;&#1575;&#1593;&#1583;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1591;&#1604;&#1608;&#1576;&#1577; &#1604;&#1604;&#1578;&#1617;&#1608;&#1575;&#1589;&#1604; &#1576;&#1610;&#1606; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; Container-to-container &#1608;&#1576;&#1610;&#1606; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1608;&#1575;&#1604;&#1606;&#1617;&#1616;&#1592;&#1575;&#1605; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; Container-to-host.</p><p dir="rtl">&#1610;&#1590;&#1576;&#1615;&#1591;&#1615; Docker &#1593;&#1606;&#1583; &#1578;&#1588;&#1594;&#1610;&#1604;&#1607; &#1608;&#1575;&#1580;&#1607;&#1577; &#1608;&#1607;&#1605;&#1610;&#1617;&#1577; Virtual interface &#1580;&#1583;&#1610;&#1583;&#1577; &#1604;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; &#1576;&#1575;&#1587;&#1605; docker0 &#1593;&#1604;&#1609; &#1575;&#1604;&#1606;&#1617;&#1592;&#1575;&#1605; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;. &#1578;&#1593;&#1605;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1608;&#1575;&#1580;&#1607;&#1577; &#1603;&#1580;&#1587;&#1585; Bridge &#1610;&#1615;&#1605;&#1603;&#1617;&#1606; Docker &#1605;&#1606; &#1573;&#1606;&#1588;&#1575;&#1569; &#1588;&#1576;&#1603;&#1577; &#1601;&#1585;&#1593;&#1610;&#1617;&#1577; Subnet &#1578;&#1587;&#1578;&#1582;&#1583;&#1605;&#1607;&#1575; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1601;&#1610; &#1605;&#1575; &#1576;&#1593;&#1583;&#1563; &#1573;&#1590;&#1575;&#1601;&#1577;&#1611; &#1573;&#1604;&#1609; &#1593;&#1605;&#1604;&#1607;&#1575; &#1603;&#1606;&#1602;&#1591;&#1577; &#1608;&#1589;&#1604; &#1576;&#1610;&#1606; &#1570;&#1604;&#1610;&#1577; &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1601;&#1610; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1608;&#1578;&#1604;&#1603; &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1601;&#1610; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;.</p><p dir="rtl">&#1578;&#1615;&#1606;&#1588;&#1614;&#1571; &#1608;&#1575;&#1580;&#1607;&#1577; &#1608;&#1607;&#1605;&#1610;&#1617;&#1577; &#1593;&#1606;&#1583;&#1605;&#1575; &#1610;&#1576;&#1583;&#1571; Docker &#1578;&#1588;&#1594;&#1610;&#1604; &#1581;&#1575;&#1608;&#1610;&#1577; &#1580;&#1583;&#1610;&#1583;&#1577;&#1548; &#1608;&#1578;&#1615;&#1605;&#1606;&#1581; &#1593;&#1606;&#1608;&#1575;&#1606; IP &#1590;&#1605;&#1606; &#1605;&#1580;&#1575;&#1604; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; &#1575;&#1604;&#1601;&#1585;&#1593;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1584;&#1603;&#1608;&#1585;&#1577; &#1587;&#1575;&#1576;&#1602;&#1611;&#1575;. &#1610;&#1583;&#1582;&#1615;&#1604; &#1593;&#1606;&#1608;&#1575;&#1606; IP &#1575;&#1604;&#1608;&#1575;&#1580;&#1607;&#1577; &#1575;&#1604;&#1608;&#1607;&#1605;&#1610;&#1577; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583;&#1577; &#1601;&#1610; &#1573;&#1591;&#1575;&#1585;&#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; &#1575;&#1604;&#1583;&#1617;&#1575;&#1582;&#1604;&#1610;&#1617;&#1577; &#1604;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1605;&#1605;&#1617;&#1575; &#1610;&#1608;&#1601;&#1617;&#1616;&#1585; &#1605;&#1587;&#1575;&#1585;&#1611;&#1575; &#1610;&#1615;&#1605;&#1603;&#1606; &#1604;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602;&#1607; &#1576;&#1575;&#1604;&#1580;&#1587;&#1585; docker0 &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583; &#1593;&#1604;&#1609; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;. &#1610;&#1590;&#1576;&#1615;&#1591; Docker &#1570;&#1604;&#1610;&#1617;&#1611;&#1575; &#1602;&#1608;&#1575;&#1593;&#1583; Iptables &#1604;&#1604;&#1587;&#1617;&#1605;&#1575;&#1581; &#1576;&#1573;&#1593;&#1575;&#1583;&#1577; &#1575;&#1604;&#1578;&#1617;&#1608;&#1580;&#1610;&#1607; Forwarding &#1608;&#1610;&#1615;&#1593;&#1583;&#1617; &#1570;&#1604;&#1610;&#1617;&#1577; &#1578;&#1585;&#1580;&#1605;&#1577; &#1575;&#1604;&#1593;&#1606;&#1575;&#1608;&#1610;&#1606; &#1593;&#1604;&#1609; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; Network address translation (&#1571;&#1608; NAT &#1575;&#1582;&#1578;&#1589;&#1575;&#1585;&#1611;&#1575;) &#1604;&#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1593;&#1606;&#1583; &#1578;&#1576;&#1575;&#1583;&#1604; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1576;&#1610;&#1606; docker0 &#1608;&#1575;&#1604;&#1593;&#1575;&#1604;&#1605; &#1575;&#1604;&#1582;&#1575;&#1585;&#1580;&#1610;.</p><h3 dir="rtl">1- &#1603;&#1610;&#1601; &#1578;&#1593;&#1585;&#1616;&#1590; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1582;&#1583;&#1605;&#1575;&#1578;&#1616; &#1604;&#1604;&#1593;&#1605;&#1604;&#1575;&#1569;&#1567;</h3><p dir="rtl">&#1604;&#1575; &#1578;&#1581;&#1578;&#1575;&#1580; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1604;&#1571;&#1610; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1573;&#1590;&#1575;&#1601;&#1610;&#1617;&#1577; &#1604;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1583;&#1605;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1602;&#1583;&#1617;&#1614;&#1605;&#1577; &#1605;&#1606; &#1591;&#1585;&#1601; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1605;&#1578;&#1608;&#1575;&#1580;&#1583;&#1577; &#1593;&#1604;&#1609; &#1606;&#1601;&#1587; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1548; &#1581;&#1610;&#1579;&#1615; &#1573;&#1606;&#1617; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; &#1587;&#1610;&#1615;&#1608;&#1580;&#1617;&#1616;&#1607; &#1575;&#1604;&#1591;&#1617;&#1604;&#1576;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1585;&#1587;&#1614;&#1604; &#1605;&#1606; &#1575;&#1604;&#1608;&#1575;&#1580;&#1607;&#1577; docker0 &#1608;&#1578;&#1578;&#1617;&#1580;&#1607; &#1573;&#1604;&#1610;&#1607;&#1575; (&#1603;&#1604;&#1617; &#1605;&#1606; &#1575;&#1604;&#1605;&#1589;&#1583;&#1614;&#1585; &#1608;&#1575;&#1604;&#1608;&#1616;&#1580;&#1607;&#1577; &#1610;&#1608;&#1580;&#1583;&#1575;&#1606; &#1593;&#1604;&#1609; &#1606;&#1601;&#1587; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; &#1575;&#1604;&#1601;&#1585;&#1593;&#1610;&#1617;&#1577;) &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1603;&#1575;&#1606; &#1575;&#1604;&#1605;&#1615;&#1606;&#1575;&#1587;&#1616;&#1576;.</p><p dir="rtl">&#1610;&#1615;&#1605;&#1603;&#1606; &#1604;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1593;&#1585;&#1590;&#1615; expose &#1605;&#1606;&#1575;&#1601;&#1584;&#1607;&#1575; Ports &#1593;&#1576;&#1585;&#1614; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; &#1604;&#1578;&#1604;&#1602;&#1610; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1610;&#1606;&#1602;&#1604;&#1607;&#1575; &#1607;&#1584;&#1575; &#1575;&#1604;&#1571;&#1582;&#1610;&#1585; &#1573;&#1604;&#1610;&#1607;&#1575; &#1605;&#1606; &#1575;&#1604;&#1593;&#1575;&#1604;&#1605; &#1575;&#1604;&#1582;&#1575;&#1585;&#1580;&#1610;. &#1610;&#1615;&#1605;&#1603;&#1606; &#1602;&#1585;&#1606; Mapping &#1605;&#1606;&#1575;&#1601;&#1584; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1593;&#1585;&#1608;&#1590;&#1577; &#1576;&#1605;&#1606;&#1601;&#1584; &#1605;&#1606; &#1575;&#1604;&#1606;&#1617;&#1616;&#1592;&#1575;&#1605; &#1575;&#1604;&#1605;&#1587;&#1578;&#1590;&#1610;&#1601; (&#1578;&#1615;&#1606;&#1602;&#1604; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1578;&#1576;&#1575;&#1583;&#1604;&#1614;&#1577; &#1593;&#1576;&#1585; &#1605;&#1606;&#1601;&#1584; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; &#1573;&#1604;&#1609; &#1605;&#1606;&#1575;&#1601;&#1584; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1602;&#1585;&#1608;&#1606;&#1577; &#1576;&#1607;&#1575;) &#1573;&#1605;&#1617;&#1575; &#1576;&#1575;&#1582;&#1578;&#1610;&#1575;&#1585; &#1605;&#1606;&#1601;&#1614;&#1584; &#1605;&#1615;&#1581;&#1583;&#1617;&#1614;&#1583;&#1563; &#1571;&#1608; &#1578;&#1585;&#1603; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1607;&#1605;&#1617;&#1577; &#1604;&#1600;&nbsp;Docker&#1548; &#1601;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1581;&#1575;&#1604;&#1577; &#1610;&#1582;&#1578;&#1575;&#1585; Docker &#1605;&#1606;&#1601;&#1584;&#1611;&#1575; &#1593;&#1588;&#1608;&#1575;&#1574;&#1610;&#1611;&#1575; &#1594;&#1610;&#1585; &#1605;&#1615;&#1587;&#1578;&#1593;&#1605;&#1604; &#1576;&#1585;&#1602;&#1605; &#1593;&#1575;&#1604;&#1613;. &#1610;&#1578;&#1608;&#1604;&#1617;&#1609; Docker &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1573;&#1591;&#1575;&#1585; &#1573;&#1583;&#1575;&#1585;&#1577; &#1602;&#1608;&#1575;&#1593;&#1583; &#1575;&#1604;&#1578;&#1608;&#1617;&#1580;&#1610;&#1607; &#1608;&#1573;&#1593;&#1583;&#1575;&#1583;&#1578; iptables &#1604;&#1573;&#1610;&#1589;&#1575;&#1604; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1573;&#1604;&#1609; &#1608;&#1580;&#1607;&#1578;&#1607;&#1575; &#1575;&#1604;&#1589;&#1617;&#1581;&#1610;&#1581;&#1577;.</p><h3 dir="rtl">2- &#1605;&#1575; &#1575;&#1604;&#1601;&#1585;&#1602; &#1576;&#1610;&#1606; &#1593;&#1585;&#1590; &#1608;&#1606;&#1588;&#1585;&nbsp;&#1605;&#1606;&#1601;&#1614;&#1584;&nbsp;Publishing &#1567;</h3><p dir="rtl">&#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1593;&#1606;&#1583; &#1573;&#1593;&#1583;&#1575;&#1583; &#1589;&#1608;&#1585;&#1577; &#1571;&#1608; &#1576;&#1583;&#1618;&#1569; &#1578;&#1588;&#1594;&#1610;&#1604; &#1581;&#1575;&#1608;&#1610;&#1617;&#1577;&#1548; &#1575;&#1604;&#1575;&#1582;&#1578;&#1610;&#1575;&#1585;&#1615; &#1576;&#1610;&#1606; &#1593;&#1585;&#1590; &#1571;&#1608; &#1606;&#1588;&#1585; &#1575;&#1604;&#1605;&#1606;&#1575;&#1601;&#1584;. &#1605;&#1606; &#1575;&#1604;&#1605;&#1607;&#1605;&#1617; &#1575;&#1604;&#1578;&#1617;&#1601;&#1585;&#1610;&#1602;&#1615; &#1576;&#1610;&#1606; &#1575;&#1604;&#1575;&#1579;&#1606;&#1610;&#1606;.</p><p dir="rtl">&#1610;&#1593;&#1606;&#1610; &#1593;&#1585;&#1590;&#1615; &#1605;&#1606;&#1601;&#1614;&#1584; &#1605;&#1617;&#1575; &#1573;&#1593;&#1604;&#1575;&#1605;&#1614; Docker &#1571;&#1606;&#1617; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1578;&#1587;&#1578;&#1582;&#1583;&#1616;&#1605; &#1575;&#1604;&#1605;&#1606;&#1601;&#1614;&#1584; &#1575;&#1604;&#1605;&#1584;&#1603;&#1608;&#1585;&#1548; &#1608;&#1610;&#1615;&#1605;&#1603;&#1606; &#1576;&#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1606;&#1601;&#1584; &#1604;&#1571;&#1594;&#1585;&#1575;&#1590; &#1575;&#1604;&#1585;&#1617;&#1576;&#1591; Linking &#1571;&#1608; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601;. &#1610;&#1615;&#1593;&#1591;&#1610; &#1601;&#1581;&#1589;&#1615; &#1581;&#1575;&#1608;&#1610;&#1617;&#1577; - &#1593;&#1604;&#1609; &#1587;&#1576;&#1610;&#1604; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; - &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578;&#1613; &#1593;&#1606; &#1575;&#1604;&#1605;&#1606;&#1575;&#1601;&#1584; &#1575;&#1604;&#1605;&#1593;&#1585;&#1608;&#1590;&#1577;&#1548; &#1608;&#1593;&#1606;&#1583; &#1585;&#1576;&#1591; &#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1601;&#1573;&#1606;&#1617; &#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1574;&#1577; &#1578;&#1615;&#1590;&#1576;&#1614;&#1591; &#1604;&#1605;&#1593;&#1585;&#1601;&#1577; &#1575;&#1604;&#1605;&#1606;&#1575;&#1601;&#1616;&#1584; &#1575;&#1604;&#1605;&#1593;&#1585;&#1608;&#1590;&#1577; &#1601;&#1610; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1571;&#1589;&#1604;&#1610;&#1617;&#1577;.&#1610;&#1615;&#1605;&#1603;&#1606; - &#1601;&#1610; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610; - &#1604;&#1604;&#1606;&#1617;&#1616;&#1592;&#1575;&#1605; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604;&#1615; &#1573;&#1604;&#1609; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577;&#1563; &#1606;&#1601;&#1587; &#1575;&#1604;&#1588;&#1617;&#1610;&#1569; &#1576;&#1575;&#1604;&#1606;&#1617;&#1587;&#1576;&#1577; &#1604;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1593;&#1604;&#1609; &#1606;&#1601;&#1587; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;. &#1578;&#1602;&#1578;&#1589;&#1616;&#1585; &#1601;&#1575;&#1574;&#1583;&#1577; &#1593;&#1585;&#1590; &#1575;&#1604;&#1605;&#1606;&#1575;&#1601;&#1616;&#1584; &#1601;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1581;&#1575;&#1604;&#1577; &#1593;&#1604;&#1609; &#1578;&#1608;&#1579;&#1610;&#1602; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1605;&#1606;&#1601;&#1584; &#1608;&#1580;&#1593;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1577; &#1605;&#1615;&#1578;&#1575;&#1581;&#1577;&#1611; &#1604;&#1604;&#1585;&#1617;&#1576;&#1591; &#1608;&#1575;&#1604;&#1578;&#1617;&#1593;&#1610;&#1610;&#1606; &#1575;&#1604;&#1570;&#1604;&#1610;&#1617;&#1610;&#1618;&#1606;.</p><p dir="rtl">&#1593;&#1604;&#1609; &#1575;&#1604;&#1580;&#1575;&#1606;&#1576; &#1575;&#1604;&#1570;&#1582;&#1585;&#1548; &#1610;&#1572;&#1583;&#1617;&#1610; &#1606;&#1588;&#1585;&nbsp;&#1605;&#1606;&#1601;&#1584; &#1573;&#1604;&#1609; &#1580;&#1593;&#1604;&#1607; &#1605;&#1578;&#1575;&#1581;&#1611;&#1575; &#1604;&#1604;&#1593;&#1575;&#1604;&#1605; &#1575;&#1604;&#1582;&#1575;&#1585;&#1580;&#1610; &#1593;&#1576;&#1585; &#1602;&#1585;&#1606;&#1607; &#1576;&#1608;&#1575;&#1580;&#1607;&#1577; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;.</p><h3 dir="rtl">3- &#1605;&#1575;&#1607;&#1610;&#1617; &#1585;&#1608;&#1575;&#1576;&#1616;&#1591; Docker&#1567;</h3><p dir="rtl">&#1610;&#1615;&#1608;&#1601;&#1617;&#1585; Docker &#1570;&#1604;&#1610;&#1577;&#1611; &#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1576;&#1610;&#1606; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578;&#1548; &#1578;&#1615;&#1587;&#1614;&#1605;&#1617;&#1609; "&#1585;&#1608;&#1575;&#1576;&#1591; Docker" . &#1578;&#1581;&#1589;&#1615;&#1604; &#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1580;&#1583;&#1610;&#1583;&#1577; &#1593;&#1606;&#1583;&#1614; &#1585;&#1576;&#1591;&#1607;&#1575; &#1576;&#1571;&#1582;&#1585;&#1609; &#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1593;&#1604;&#1609; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1575;&#1604;&#1571;&#1582;&#1610;&#1585;&#1577; &#1593;&#1576;&#1585; &#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1575;&#1578; &#1605;&#1615;&#1588;&#1578;&#1585;&#1614;&#1603;&#1577; &#1601;&#1610; &#1576;&#1610;&#1574;&#1577; &#1575;&#1604;&#1578;&#1617;&#1606;&#1601;&#1610;&#1584;. &#1578;&#1615;&#1588;&#1603;&#1617;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1608;&#1587;&#1610;&#1604;&#1577; &#1591;&#1585;&#1610;&#1602;&#1577;&#1611; &#1587;&#1607;&#1604;&#1577; &#1604;&#1604;&#1578;&#1617;&#1571;&#1587;&#1610;&#1587; &#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1576;&#1610;&#1606; &#1581;&#1575;&#1608;&#1610;&#1617;&#1578;&#1610;&#1618;&#1606; &#1593;&#1576;&#1585; &#1573;&#1593;&#1591;&#1575;&#1569; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583;&#1577; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1605;&#1615;&#1601;&#1589;&#1617;&#1614;&#1604;&#1577; &#1593;&#1606; &#1603;&#1610;&#1601;&#1610;&#1577; &#1575;&#1604;&#1606;&#1601;&#1575;&#1584; &#1573;&#1604;&#1609; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1577; &#1575;&#1604;&#1605;&#1615;&#1589;&#1575;&#1581;&#1616;&#1576;&#1577;. &#1578;&#1615;&#1590;&#1576;&#1614;&#1591; &#1575;&#1604;&#1605;&#1578;&#1594;&#1610;&#1617;&#1585;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1588;&#1578;&#1585;&#1614;&#1603;&#1577; &#1581;&#1587;&#1576; &#1575;&#1604;&#1605;&#1606;&#1575;&#1601;&#1584; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1593;&#1585;&#1590;&#1607;&#1575; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1576;&#1610;&#1606;&#1605;&#1575; &#1610;&#1590;&#1576;&#1591; Docker &#1593;&#1606;&#1608;&#1575;&#1606; IP &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1608;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1571;&#1582;&#1585;&#1609;.</p><h2 dir="rtl">&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1604;&#1604;&#1585;&#1617;&#1601;&#1593; &#1605;&#1606; &#1602;&#1583;&#1585;&#1575;&#1578; Docker &#1601;&#1610; &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603;</h2><p dir="rtl">&#1606;&#1605;&#1608;&#1584;&#1580; &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1575;&#1604;&#1605;&#1615;&#1602;&#1583;&#1617;&#1614;&#1605; &#1571;&#1593;&#1604;&#1575;&#1607; &#1610;&#1615;&#1588;&#1603;&#1617;&#1616;&#1604; &#1606;&#1602;&#1591;&#1577; &#1576;&#1583;&#1618;&#1569; &#1580;&#1610;&#1617;&#1583;&#1577; &#1601;&#1610; &#1576;&#1606;&#1575;&#1569; &#1608;&#1585;&#1576;&#1591; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578;. &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1576;&#1610;&#1606; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1593;&#1604;&#1609; &#1606;&#1601;&#1587; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; &#1610;&#1593;&#1605;&#1604; &#1576;&#1588;&#1603;&#1604; &#1605;&#1615;&#1576;&#1575;&#1588;&#1585;. &#1576;&#1575;&#1604;&#1606;&#1617;&#1587;&#1576;&#1577; &#1604;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1576;&#1610;&#1606; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; &#1601;&#1610;&#1593;&#1605;&#1604; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1575;&#1604;&#1593;&#1605;&#1608;&#1605;&#1610;&#1577; Public networks &#1605;&#1575; &#1583;&#1575;&#1605;&#1578; &#1575;&#1604;&#1605;&#1606;&#1575;&#1601;&#1584; &#1605;&#1602;&#1585;&#1608;&#1606;&#1577; &#1576;&#1588;&#1603;&#1604; &#1589;&#1581;&#1610;&#1581; &#1608;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1605;&#1578;&#1608;&#1601;&#1617;&#1585;&#1577; &#1604;&#1583;&#1609; &#1575;&#1604;&#1591;&#1617;&#1585;&#1601; &#1575;&#1604;&#1570;&#1582;&#1585;.</p><p dir="rtl">&#1593;&#1604;&#1609; &#1575;&#1604;&#1585;&#1617;&#1594;&#1605; &#1605;&#1606; &#1605;&#1575; &#1587;&#1576;&#1602;&#1548; &#1578;&#1578;&#1591;&#1604;&#1617;&#1576; &#1576;&#1593;&#1590; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1576;&#1610;&#1574;&#1575;&#1578; &#1588;&#1576;&#1603;&#1610;&#1617;&#1577; &#1582;&#1575;&#1589;&#1617;&#1577; (&#1606;&#1592;&#1585;&#1611;&#1575; &#1604;&#1576;&#1593;&#1590; &#1575;&#1604;&#1571;&#1607;&#1583;&#1575;&#1601; &#1575;&#1604;&#1571;&#1605;&#1606;&#1610;&#1617;&#1577; &#1571;&#1608; &#1575;&#1604;&#1608;&#1592;&#1610;&#1601;&#1610;&#1617;&#1577;) &#1604;&#1575; &#1610;&#1587;&#1578;&#1591;&#1610;&#1593; &#1606;&#1605;&#1608;&#1584;&#1580; &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1575;&#1604;&#1571;&#1589;&#1604;&#1610; &#1601;&#1610; Docker &#1578;&#1608;&#1601;&#1610;&#1585;&#1607;&#1575;. &#1604;&#1607;&#1584;&#1575; &#1575;&#1604;&#1587;&#1617;&#1576;&#1576; &#1571;&#1615;&#1606;&#1588;&#1616;&#1574;&#1578; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1593;&#1583;&#1610;&#1583;&#1577; &#1604;&#1586;&#1610;&#1575;&#1583;&#1577; &#1602;&#1615;&#1583;&#1615;&#1585;&#1575;&#1578; Docker &#1601;&#1610; &#1575;&#1604;&#1585;&#1617;&#1576;&#1591; &#1576;&#1610;&#1606; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578;.</p><h3 dir="rtl">1- &#1573;&#1606;&#1588;&#1575;&#1569; &#1588;&#1576;&#1603;&#1575;&#1578; &#1601;&#1608;&#1602;&#1610;&#1617;&#1577; Overlay &#1604;&#1578;&#1580;&#1585;&#1610;&#1583; Abstract &#1575;&#1604;&#1576;&#1606;&#1610;&#1577; &#1575;&#1604;&#1578;&#1617;&#1581;&#1578;&#1610;&#1617;&#1577;</h3><p dir="rtl">&#1585;&#1603;&#1617;&#1586;&#1578; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1593;&#1604;&#1609; &#1578;&#1581;&#1587;&#1610;&#1606; &#1608;&#1592;&#1610;&#1601;&#1610; &#1610;&#1578;&#1605;&#1579;&#1617;&#1604; &#1601;&#1610; &#1575;&#1604;&#1578;&#1571;&#1587;&#1610;&#1587; &#1604;&#1588;&#1576;&#1603;&#1575;&#1578; &#1601;&#1608;&#1602;&#1610;&#1617;&#1577; Overlay Networks&#1563; &#1608;&#1607;&#1610;&#1617; &#1593;&#1576;&#1575;&#1585;&#1577; &#1593;&#1606; &#1588;&#1576;&#1603;&#1575;&#1578; &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; &#1605;&#1576;&#1606;&#1610;&#1617;&#1577; &#1593;&#1604;&#1609; &#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1605;&#1615;&#1587;&#1576;&#1614;&#1602;&#1611;&#1575;. &#1610;&#1615;&#1605;&#1603;&#1617;&#1606; &#1575;&#1604;&#1578;&#1617;&#1571;&#1587;&#1610;&#1587; &#1604;&#1588;&#1576;&#1603;&#1575;&#1578; &#1601;&#1608;&#1602;&#1610;&#1617;&#1577; &#1605;&#1606; &#1573;&#1606;&#1588;&#1575;&#1569; &#1576;&#1610;&#1574;&#1575;&#1578; &#1578;&#1588;&#1576;&#1610;&#1603; &#1605;&#1606;&#1578;&#1592;&#1616;&#1605;&#1577; &#1610;&#1615;&#1605;&#1603;&#1606; &#1575;&#1604;&#1578;&#1617;&#1606;&#1576;&#1617;&#1572; &#1576;&#1607;&#1575;&#1548; &#1608;&#1578;&#1585;&#1576;&#1591; &#1576;&#1610;&#1606; &#1593;&#1583;&#1617;&#1577; &#1605;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578;. &#1610;&#1615;&#1587;&#1575;&#1593;&#1583; &#1607;&#1584;&#1575; &#1575;&#1604;&#1571;&#1605;&#1585; &#1601;&#1610; &#1578;&#1587;&#1607;&#1610;&#1604; &#1585;&#1576;&#1591; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1576;&#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; &#1583;&#1608;&#1606; &#1575;&#1604;&#1575;&#1607;&#1578;&#1605;&#1575;&#1605; &#1576;&#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; &#1575;&#1604;&#1584;&#1610; &#1578;&#1593;&#1605;&#1604; &#1593;&#1604;&#1610;&#1607; &#1607;&#1584;&#1607; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578;.</p><p dir="rtl">&#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1607;&#1584;&#1607; &#1575;&#1604;&#1591;&#1617;&#1585;&#1610;&#1602;&#1577; &#1604;&#1576;&#1606;&#1575;&#1569; &#1588;&#1576;&#1603;&#1577; &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; &#1608;&#1575;&#1581;&#1583;&#1577; &#1578;&#1605;&#1578;&#1583;&#1617; &#1593;&#1604;&#1609; &#1593;&#1583;&#1617;&#1577; &#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578;&#1548; &#1571;&#1608; &#1604;&#1576;&#1606;&#1575;&#1569; &#1588;&#1576;&#1603;&#1575;&#1578; &#1601;&#1585;&#1593;&#1610;&#1617;&#1577; &#1604;&#1603;&#1604; &#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; &#1575;&#1593;&#1578;&#1605;&#1575;&#1583;&#1611;&#1575; &#1593;&#1604;&#1609; &#1606;&#1601;&#1587; &#1575;&#1604;&#1588;&#1576;&#1603;&#1577; &#1575;&#1604;&#1601;&#1608;&#1602;&#1610;&#1617;&#1577;.</p><p dir="rtl">&#1578;&#1615;&#1578;&#1610;&#1581; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1575;&#1604;&#1601;&#1608;&#1602;&#1610;&#1617;&#1577; &#1571;&#1610;&#1590;&#1611;&#1575; &#1576;&#1606;&#1575;&#1569; &#1606;&#1587;&#1610;&#1580; &#1593;&#1606;&#1602;&#1608;&#1583;&#1610; Fabric clusters. &#1578;&#1593;&#1605;&#1604; &#1575;&#1604;&#1581;&#1608;&#1587;&#1576;&#1577; &#1575;&#1604;&#1606;&#1587;&#1610;&#1580;&#1610;&#1617;&#1577; Fabric computing (&#1610;&#1615;&#1591;&#1604;&#1614;&#1602; &#1593;&#1604;&#1610;&#1607;&#1575; &#1571;&#1581;&#1610;&#1575;&#1606;&#1611;&#1575; &#1575;&#1604;&#1581;&#1608;&#1587;&#1576;&#1577; &#1575;&#1604;&#1578;&#1608;&#1581;&#1610;&#1583;&#1610;&#1617;&#1577; Unified computing) &#1593;&#1604;&#1609; &#1578;&#1608;&#1581;&#1610;&#1583; &#1593;&#1583;&#1617;&#1577; &#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; &#1608;&#1573;&#1583;&#1575;&#1585;&#1578;&#1607;&#1575; &#1603;&#1605;&#1575; &#1604;&#1608; &#1603;&#1575;&#1606;&#1578; &#1603;&#1610;&#1575;&#1606;&#1611;&#1575; &#1608;&#1575;&#1581;&#1583;&#1611;&#1575; &#1576;&#1605;&#1608;&#1575;&#1585;&#1583; &#1571;&#1603;&#1576;&#1585;.</p><p dir="rtl">&#1610;&#1587;&#1605;&#1581; &#1573;&#1606;&#1580;&#1575;&#1586; &#1605;&#1576;&#1583;&#1571; &#1575;&#1604;&#1581;&#1608;&#1587;&#1576;&#1577; &#1575;&#1604;&#1606;&#1587;&#1610;&#1580;&#1610;&#1617;&#1577; &#1604;&#1604;&#1605;&#1615;&#1587;&#1578;&#1582;&#1583;&#1616;&#1605; &#1575;&#1604;&#1606;&#1617;&#1607;&#1575;&#1574;&#1610; &#1576;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1593;&#1606;&#1602;&#1608;&#1583; &#1603;&#1608;&#1581;&#1583;&#1577; &#1576;&#1583;&#1604;&#1611;&#1575; &#1605;&#1606; &#1605;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; &#1605;&#1578;&#1601;&#1585;&#1617;&#1602;&#1577;. &#1610;&#1604;&#1593;&#1576; &#1585;&#1576;&#1591;&#1615; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1580;&#1586;&#1569;&#1611;&#1575; &#1603;&#1576;&#1610;&#1585;&#1611;&#1575; &#1605;&#1606; &#1573;&#1606;&#1588;&#1575;&#1569; &#1593;&#1606;&#1575;&#1602;&#1610;&#1583; &#1581;&#1587;&#1576; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1576;&#1583;&#1571;.</p><h3 dir="rtl">2- &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1605;&#1578;&#1602;&#1583;&#1617;&#1605; &#1604;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603;</h3><p dir="rtl">&#1578;&#1578;&#1608;&#1604;&#1617;&#1609; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593;&#1615; &#1571;&#1582;&#1585;&#1609; &#1575;&#1604;&#1585;&#1617;&#1601;&#1593; &#1605;&#1606; &#1602;&#1583;&#1585;&#1575;&#1578; Docker &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603;&#1610;&#1617;&#1577; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1578;&#1608;&#1601;&#1610;&#1585; &#1605;&#1585;&#1608;&#1606;&#1577; &#1571;&#1603;&#1576;&#1585;.</p><p dir="rtl">&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1575;&#1604;&#1571;&#1589;&#1604;&#1610; &#1601;&#1610; Docker &#1610;&#1602;&#1608;&#1605; &#1576;&#1575;&#1604;&#1608;&#1592;&#1610;&#1601;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1571;&#1615;&#1606;&#1588;&#1574; &#1605;&#1606; &#1571;&#1580;&#1604;&#1607;&#1575;&#1548; &#1608;&#1604;&#1603;&#1606;&#1617;&#1607; &#1576;&#1587;&#1610;&#1591; &#1580;&#1583;&#1617;&#1575;. &#1593;&#1604;&#1609; &#1575;&#1604;&#1585;&#1594;&#1605; &#1605;&#1606; &#1571;&#1606;&#1617; &#1575;&#1604;&#1581;&#1608;&#1575;&#1580;&#1586; &#1575;&#1604;&#1608;&#1592;&#1610;&#1601;&#1610;&#1617;&#1577; &#1604;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610; &#1604;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1601;&#1610; Docker &#1602;&#1583; &#1578;&#1592;&#1607;&#1585; &#1593;&#1606;&#1583; &#1578;&#1582;&#1589;&#1610;&#1589; &#1605;&#1615;&#1578;&#1591;&#1604;&#1617;&#1614;&#1576;&#1575;&#1578; &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1601;&#1610; &#1605;&#1587;&#1578;&#1590;&#1610;&#1601; &#1608;&#1575;&#1581;&#1583;&#1548; &#1573;&#1604;&#1617;&#1575; &#1571;&#1606;&#1617;&#1607;&#1575; &#1578;&#1592;&#1607;&#1585; &#1576;&#1588;&#1603;&#1604; &#1571;&#1608;&#1590;&#1581; &#1593;&#1606;&#1583; &#1575;&#1604;&#1578;&#1617;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1588;&#1576;&#1603;&#1575;&#1578; &#1593;&#1575;&#1576;&#1585;&#1577; &#1604;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578;. &#1610;&#1615;&#1604;&#1580;&#1571; - &#1605;&#1606; &#1571;&#1580;&#1604; &#1573;&#1590;&#1575;&#1601;&#1577; &#1608;&#1592;&#1575;&#1574;&#1601; &#1580;&#1583;&#1610;&#1583;&#1577; &#1573;&#1604;&#1609; "&#1578;&#1591;&#1608;&#1610;&#1593;" &#1578;&#1604;&#1603; &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1605;&#1615;&#1587;&#1576;&#1614;&#1602;&#1611;&#1575;. &#1604;&#1575; &#1578;&#1615;&#1590;&#1610;&#1601; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1582;&#1575;&#1585;&#1602;&#1577; &#1604;&#1603;&#1606;&#1617;&#1607;&#1575; &#1578;&#1587;&#1605;&#1581; &#1576;&#1585;&#1576;&#1591; &#1571;&#1580;&#1586;&#1575;&#1569; &#1601;&#1610; &#1605;&#1575; &#1576;&#1610;&#1606;&#1607;&#1575; &#1604;&#1573;&#1606;&#1588;&#1575;&#1569; &#1578;&#1589;&#1608;&#1617;&#1585;&#1575;&#1578; &#1571;&#1603;&#1579;&#1585; &#1578;&#1593;&#1602;&#1610;&#1583;&#1611;&#1575; &#1604;&#1593;&#1605;&#1604; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578;.</p><p dir="rtl">&#1578;&#1605;&#1578;&#1583; &#1575;&#1604;&#1608;&#1592;&#1575;&#1574;&#1601; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1590;&#1610;&#1601;&#1607;&#1575; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1605;&#1606; &#1605;&#1580;&#1585;&#1617;&#1583; &#1573;&#1606;&#1588;&#1575;&#1569; &#1608;&#1585;&#1576;&#1591; &#1588;&#1576;&#1603;&#1575;&#1578; &#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1610;&#1606; &#1576;&#1593;&#1590; &#1575;&#1604;&#1605;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; &#1573;&#1604;&#1609; &#1590;&#1576;&#1591; &#1580;&#1587;&#1608;&#1585;&#1548; &#1588;&#1576;&#1603;&#1575;&#1578; &#1605;&#1581;&#1604;&#1610;&#1617;&#1577; &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577;&#1548; &#1578;&#1582;&#1589;&#1610;&#1589; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1575;&#1604;&#1601;&#1585;&#1593;&#1610;&#1617;&#1577; &#1608;&#1575;&#1604;&#1576;&#1608;&#1617;&#1575;&#1576;&#1575;&#1578; Gateways.</p><p dir="rtl">&#1578;&#1608;&#1580;&#1583; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1608;&#1571;&#1583;&#1608;&#1575;&#1578; &#1571;&#1582;&#1585;&#1609; &#1578;&#1615;&#1587;&#1578;&#1582;&#1583;&#1605; &#1603;&#1579;&#1610;&#1585;&#1611;&#1575; &#1601;&#1610; &#1576;&#1610;&#1574;&#1575;&#1578; Docker &#1604;&#1578;&#1608;&#1601;&#1610;&#1585; &#1608;&#1592;&#1575;&#1574;&#1601; &#1580;&#1583;&#1610;&#1583;&#1577;&#1548; &#1608;&#1584;&#1604;&#1603; &#1585;&#1594;&#1605; &#1571;&#1606;&#1617;&#1607;&#1575; &#1604;&#1605; &#1578;&#1615;&#1591;&#1608;&#1617;&#1614;&#1585; &#1582;&#1589;&#1617;&#1610;&#1589;&#1611;&#1575; &#1604;&#1600;Docker. &#1610;&#1578;&#1593;&#1604;&#1617;&#1602; &#1575;&#1604;&#1571;&#1605;&#1585; &#1582;&#1589;&#1608;&#1589;&#1611;&#1575; &#1576;&#1578;&#1602;&#1606;&#1610;&#1617;&#1575;&#1578; &#1608;&#1589;&#1604;&#1578; &#1604;&#1605;&#1585;&#1581;&#1604;&#1577; &#1575;&#1604;&#1606;&#1617;&#1590;&#1608;&#1580; &#1601;&#1610; &#1573;&#1606;&#1588;&#1575;&#1569; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1608;&#1575;&#1604;&#1571;&#1606;&#1601;&#1575;&#1602; Tunnels &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1587;&#1578;&#1582;&#1583;&#1614;&#1605; &#1594;&#1575;&#1604;&#1616;&#1576;&#1611;&#1575; &#1604;&#1578;&#1571;&#1605;&#1610;&#1606; &#1575;&#1604;&#1578;&#1617;&#1608;&#1575;&#1589;&#1604; &#1576;&#1610;&#1606; &#1575;&#1604;&#1605;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; &#1608;&#1593;&#1576;&#1585; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578;.</p><h2 dir="rtl">&#1607;&#1604; &#1605;&#1606; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1588;&#1575;&#1574;&#1593;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1604;&#1604;&#1578;&#1581;&#1587;&#1610;&#1606; &#1605;&#1606; &#1571;&#1583;&#1575;&#1569; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1601;&#1610; Docker&#1567;</h2><p dir="rtl">&#1578;&#1608;&#1580;&#1583; &#1593;&#1583;&#1617;&#1577; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1578;&#1615;&#1585;&#1603;&#1617;&#1616;&#1586; &#1593;&#1604;&#1609; &#1578;&#1608;&#1601;&#1610;&#1585; &#1588;&#1576;&#1603;&#1577; &#1601;&#1608;&#1602;&#1610;&#1617;&#1577; &#1604;&#1605;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; Docker. &#1601;&#1610; &#1605;&#1575; &#1610;&#1604;&#1610; &#1576;&#1593;&#1590; &#1571;&#1603;&#1579;&#1585; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1588;&#1610;&#1608;&#1593;&#1611;&#1575;:</p><ul><li><p dir="rtl">flannel: &#1610;&#1615;&#1591;&#1608;&#1617;&#1616;&#1585;&#1607; &#1601;&#1585;&#1610;&#1602; CoreOs. &#1571;&#1615;&#1606;&#1588;&#1574; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1588;&#1585;&#1608;&#1593; &#1571;&#1589;&#1604;&#1611;&#1575; &#1604;&#1573;&#1593;&#1591;&#1575;&#1569; &#1603;&#1604; &#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601; &#1588;&#1576;&#1603;&#1577; &#1601;&#1585;&#1593;&#1610;&#1617;&#1577; &#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1607; &#1590;&#1605;&#1606;&#1614; &#1588;&#1576;&#1603;&#1577; &#1605;&#1615;&#1588;&#1578;&#1585;&#1614;&#1603;&#1577;&#1563; &#1608;&#1607;&#1608; &#1588;&#1585;&#1591; &#1590;&#1585;&#1608;&#1585;&#1610; &#1604;&#1593;&#1605;&#1604; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1578;&#1617;&#1606;&#1587;&#1610;&#1602; kubernetes &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1591;&#1608;&#1617;&#1616;&#1585;&#1607;&#1575; Google&#1548; &#1604;&#1603;&#1606;&#1617;&#1607; &#1605;&#1601;&#1610;&#1583; &#1571;&#1610;&#1590;&#1611;&#1575; &#1601;&#1610; &#1581;&#1575;&#1604;&#1575;&#1578; &#1571;&#1582;&#1585;&#1609;.</p></li><li><p dir="rtl">weave: &#1578;&#1615;&#1606;&#1588;&#1574; &#1571;&#1583;&#1575;&#1577; Wweave &#1588;&#1576;&#1603;&#1577; &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; &#1578;&#1585;&#1576;&#1591; &#1576;&#1610;&#1606; &#1605;&#1582;&#1578;&#1604;&#1601; &#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; Docker. &#1610;&#1615;&#1587;&#1607;&#1617;&#1604; &#1607;&#1584;&#1575; &#1575;&#1604;&#1571;&#1605;&#1585; &#1605;&#1606; &#1578;&#1608;&#1580;&#1610;&#1607; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1548; &#1573;&#1584; &#1571;&#1606;&#1617; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1578;&#1576;&#1583;&#1608; &#1603;&#1605;&#1575; &#1604;&#1608; &#1603;&#1575;&#1606;&#1578; &#1603;&#1604;&#1617;&#1607;&#1575; &#1593;&#1604;&#1609; &#1606;&#1601;&#1587; &#1575;&#1604;&#1605;&#1615;&#1608;&#1586;&#1617;&#1616;&#1593; Switch.</p></li></ul><p dir="rtl">&#1576;&#1575;&#1604;&#1606;&#1587;&#1576;&#1577; &#1604;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1575;&#1604;&#1605;&#1578;&#1602;&#1583;&#1617;&#1605;&#1548; &#1578;&#1607;&#1583;&#1601; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1571;&#1583;&#1606;&#1575;&#1607; &#1573;&#1604;&#1609; &#1578;&#1608;&#1601;&#1610;&#1585; &#1602;&#1583;&#1585;&#1575;&#1578; &#1578;&#1591;&#1608;&#1610;&#1593; &#1571;&#1603;&#1579;&#1585; &#1604;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577;.</p><p dir="rtl">pipework: &#1610;&#1607;&#1583;&#1601; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1588;&#1585;&#1608;&#1593; &#1573;&#1604;&#1609; &#1587;&#1583; &#1575;&#1604;&#1601;&#1580;&#1608;&#1577; &#1601;&#1610; &#1570;&#1604;&#1610;&#1577; &#1575;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603; &#1575;&#1604;&#1571;&#1589;&#1604;&#1610;&#1617;&#1577; &#1601;&#1610; Docker &#1605;&#1606; &#1581;&#1610;&#1579; &#1606;&#1602;&#1589; &#1575;&#1604;&#1608;&#1592;&#1575;&#1574;&#1601; &#1575;&#1604;&#1605;&#1578;&#1602;&#1583;&#1617;&#1616;&#1605;&#1577;&#1548; &#1601;&#1610; &#1575;&#1606;&#1578;&#1592;&#1575;&#1585; &#1578;&#1591;&#1617;&#1608;&#1585;&#1607;&#1575; &#1581;&#1610;&#1579;&#1615; &#1610;&#1615;&#1587;&#1607;&#1617;&#1604; &#1575;&#1604;&#1578;&#1581;&#1603;&#1617;&#1605; &#1601;&#1610; &#1608;&#1590;&#1576;&#1591;&#1614; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1605;&#1578;&#1602;&#1583;&#1617;&#1605;&#1577; &#1604;&#1604;&#1578;&#1617;&#1588;&#1576;&#1610;&#1603;.</p><p dir="rtl">&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1617;&#1577; &#1607;&#1610; &#1605;&#1579;&#1575;&#1604; &#1593;&#1604;&#1609; &#1575;&#1582;&#1578;&#1610;&#1617;&#1575;&#1585; &#1576;&#1585;&#1605;&#1580;&#1610;&#1617;&#1575;&#1578; &#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1582;&#1575;&#1585;&#1580; &#1575;&#1604;&#1606;&#1617;&#1592;&#1575;&#1605; &#1575;&#1604;&#1576;&#1610;&#1574;&#1610; &#1604;&#1600;Docker &#1608;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1607;&#1575; &#1576;&#1573;&#1590;&#1575;&#1601;&#1577; &#1608;&#1592;&#1575;&#1574;&#1601; &#1580;&#1583;&#1610;&#1583;&#1577; &#1573;&#1604;&#1610;&#1607;.</p><ul><li><p dir="rtl">tinc: &#1593;&#1576;&#1575;&#1585;&#1577; &#1593;&#1606; &#1576;&#1585;&#1606;&#1575;&#1605;&#1580; &#1604;&#1573;&#1606;&#1588;&#1575;&#1569; &#1588;&#1576;&#1603;&#1577; &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; &#1582;&#1575;&#1589;&#1617;&#1577; Virtual private network (&#1571;&#1608; VPN &#1575;&#1582;&#1578;&#1589;&#1575;&#1585;&#1611;&#1575;) &#1610;&#1593;&#1578;&#1605;&#1583; &#1593;&#1604;&#1609; &#1575;&#1604;&#1578;&#1617;&#1593;&#1605;&#1610;&#1617;&#1577; Encryption &#1608;&#1575;&#1604;&#1571;&#1606;&#1601;&#1575;&#1602;. &#1578;&#1615;&#1602;&#1583;&#1617;&#1605; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; &#1591;&#1585;&#1610;&#1602;&#1577; &#1608;&#1587;&#1610;&#1604;&#1577; &#1589;&#1604;&#1576;&#1577; &#1604;&#1580;&#1593;&#1604; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1588;&#1601;&#1617;&#1575;&#1601;&#1611;&#1575; &#1576;&#1575;&#1604;&#1606;&#1617;&#1587;&#1576;&#1577; &#1604;&#1571;&#1610;&#1617; &#1578;&#1591;&#1576;&#1610;&#1602;.</p></li></ul><h2 dir="rtl">&#1582;&#1575;&#1578;&#1605;&#1577;</h2><p dir="rtl">&#1610;&#1593;&#1578;&#1605;&#1583; &#1606;&#1605;&#1608;&#1584;&#1580; Docker &#1593;&#1604;&#1609; &#1578;&#1608;&#1601;&#1610;&#1585; &#1582;&#1583;&#1605;&#1575;&#1578; &#1593;&#1576;&#1585; &#1593;&#1606;&#1575;&#1589;&#1585; &#1583;&#1575;&#1582;&#1604;&#1610;&#1617;&#1577; &#1608;&#1571;&#1582;&#1585;&#1609; &#1582;&#1575;&#1585;&#1580;&#1610;&#1617;&#1577;&#1548; &#1608;&#1607;&#1608; &#1605;&#1575; &#1610;&#1580;&#1593;&#1604; &#1605;&#1606; &#1575;&#1604;&#1575;&#1593;&#1578;&#1576;&#1575;&#1585;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1578;&#1593;&#1604;&#1617;&#1602;&#1577; &#1576;&#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; &#1605;&#1607;&#1605;&#1617;&#1577;&#1611; &#1604;&#1604;&#1594;&#1575;&#1610;&#1577;. &#1610;&#1615;&#1608;&#1601;&#1617;&#1585; Docker &#1608;&#1592;&#1575;&#1574;&#1601; &#1571;&#1587;&#1575;&#1587;&#1610;&#1617;&#1577; &#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1605;&#1579;&#1604; &#1575;&#1604;&#1608;&#1575;&#1580;&#1607;&#1575;&#1578; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577;&#1548; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1575;&#1578; &#1575;&#1604;&#1601;&#1585;&#1593;&#1610;&#1617;&#1577;&#1548; iptables &#1608;&#1573;&#1583;&#1575;&#1585;&#1577; &#1578;&#1585;&#1580;&#1605;&#1577; &#1575;&#1604;&#1593;&#1606;&#1575;&#1608;&#1610;&#1606; &#1593;&#1604;&#1609; &#1575;&#1604;&#1588;&#1617;&#1576;&#1603;&#1577; (NAT)&#1563; &#1608;&#1607;&#1610;&#1617; &#1575;&#1604;&#1608;&#1592;&#1575;&#1574;&#1601; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1603;&#1605;&#1617;&#1604;&#1607;&#1575; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1571;&#1582;&#1585;&#1609; &#1571;&#1615;&#1606;&#1588;&#1616;&#1574;&#1578; &#1604;&#1573;&#1578;&#1575;&#1581;&#1577; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1590;&#1576;&#1591; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1571;&#1603;&#1579;&#1585; &#1578;&#1602;&#1583;&#1617;&#1605;&#1611;&#1575;.</p><p dir="rtl">&#1587;&#1606;&#1578;&#1591;&#1585;&#1617;&#1602; &#1601;&#1610; &#1575;&#1604;&#1583;&#1617;&#1585;&#1587; &#1575;&#1604;&#1602;&#1575;&#1583;&#1605; &#1604;&#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1593;&#1605;&#1604; &#1575;&#1604;&#1605;&#1615;&#1580;&#1583;&#1608;&#1616;&#1604;&#1575;&#1578; Schedulers &#1608;&#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1604;&#1578;&#1617;&#1606;&#1587;&#1610;&#1602; orchestration &#1575;&#1604;&#1605;&#1576;&#1606;&#1610;&#1617;&#1577; &#1593;&#1604;&#1609; &#1607;&#1584;&#1575; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587; &#1576;&#1607;&#1583;&#1601; &#1573;&#1583;&#1575;&#1585;&#1577; &#1593;&#1606;&#1602;&#1608;&#1583; &#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578;.</p>
]]></description><guid isPermaLink="false">37</guid><pubDate>Wed, 29 Apr 2015 05:48:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x643;&#x634;&#x627;&#x641;&#x64F; &#x627;&#x644;&#x62E;&#x62F;&#x645;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x645;&#x62E;&#x627;&#x632;&#x650;&#x646;&#x64F; &#x627;&#x644;&#x645;&#x64F;&#x648;&#x632;&#x651;&#x64E;&#x639;&#x629; &#x644;&#x644;&#x625;&#x639;&#x62F;&#x627;&#x62F;&#x627;&#x62A; &#x639;&#x644;&#x649; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81%D9%8F-%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%AE%D8%A7%D8%B2%D9%90%D9%86%D9%8F-%D8%A7%D9%84%D9%85%D9%8F%D9%88%D8%B2%D9%91%D9%8E%D8%B9%D8%A9-%D9%84%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-docker-r26/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/containers-2_480x300.png.5e9e5972ef61ffc84ced5f7db7da12ad.png" /></p>
<h2 dir="rtl">&#1605;&#1602;&#1583;&#1617;&#1605;&#1577;</h2><p dir="rtl">&#1578;&#1615;&#1605;&#1579;&#1617;&#1616;&#1604; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1581;&#1604;&#1617;&#1611;&#1575; &#1571;&#1606;&#1610;&#1602;&#1611;&#1575; &#1604;&#1605;&#1606; &#1610;&#1576;&#1581;&#1579; &#1593;&#1606; &#1578;&#1589;&#1605;&#1610;&#1605; &#1608;&#1606;&#1588;&#1585; &#1578;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1578;&#1593;&#1605;&#1604; &#1593;&#1604;&#1609; &#1606;&#1591;&#1575;&#1602; &#1608;&#1575;&#1587;&#1593;. &#1610;&#1615;&#1608;&#1601;&#1617;&#1585; Docker &#1575;&#1604;&#1578;&#1617;&#1602;&#1606;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1587;&#1572;&#1608;&#1604;&#1577; &#1593;&#1606; &#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578;&#1548; &#1608;&#1578;&#1615;&#1587;&#1575;&#1593;&#1583;&#1607; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1571;&#1582;&#1585;&#1609; &#1593;&#1583;&#1610;&#1583;&#1577; &#1593;&#1576;&#1585; &#1578;&#1591;&#1608;&#1610;&#1585; &#1575;&#1604;&#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1604;&#1605;&#1591;&#1604;&#1608;&#1576;&#1577; &#1604;&#1578;&#1581;&#1590;&#1610;&#1585; &#1575;&#1604;&#1606;&#1617;&#1588;&#1585; &#1601;&#1610; &#1576;&#1610;&#1574;&#1577; &#1575;&#1604;&#1593;&#1605;&#1604; &#1608;&#1604;&#1604;&#1578;&#1617;&#1608;&#1575;&#1589;&#1604; &#1576;&#1610;&#1606; &#1605;&#1582;&#1578;&#1604;&#1601; &#1605;&#1603;&#1608;&#1617;&#1606;&#1575;&#1578;&#1607;.</p><p dir="rtl">&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; Service discovery &#1607;&#1610; &#1573;&#1581;&#1583;&#1609; &#1575;&#1604;&#1578;&#1617;&#1602;&#1606;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1605;&#1585;&#1603;&#1586;&#1610;&#1617;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1593;&#1578;&#1605;&#1583; &#1593;&#1604;&#1610;&#1607;&#1575; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1576;&#1610;&#1574;&#1575;&#1578; Docker. &#1578;&#1615;&#1605;&#1603;&#1617;&#1606; &#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1617;&#1602;&#1606;&#1610;&#1617;&#1577; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578;&#1616; &#1571;&#1608; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1585;&#1614; &#1575;&#1604;&#1605;&#1615;&#1603;&#1608;&#1617;&#1606;&#1577;&#1614; &#1604;&#1607;&#1575; &#1605;&#1606; &#1605;&#1593;&#1585;&#1601;&#1577; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1593;&#1606; &#1576;&#1610;&#1574;&#1577; &#1593;&#1605;&#1604;&#1607;&#1575;. &#1610;&#1615;&#1587;&#1578;&#1593;&#1575;&#1606; &#1593;&#1575;&#1583;&#1577;&#1611; &#1576;&#1605;&#1582;&#1575;&#1586;&#1606; &#1578;&#1593;&#1578;&#1605;&#1583; &#1589;&#1610;&#1594;&#1577; &#1605;&#1601;&#1578;&#1575;&#1581;-&#1602;&#1610;&#1605;&#1577; key-value &#1604;&#1607;&#1584;&#1575; &#1575;&#1604;&#1594;&#1585;&#1590;.</p><p dir="rtl">&#1578;&#1615;&#1587;&#1578;&#1582;&#1583;&#1614;&#1605; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1582;&#1575;&#1586;&#1606; &#1571;&#1610;&#1590;&#1611;&#1575; &#1604;&#1573;&#1605;&#1604;&#1575;&#1569; &#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1581;&#1608;&#1604; &#1590;&#1576;&#1591; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;. &#1610;&#1615;&#1578;&#1610;&#1581; &#1590;&#1576;&#1591;&#1615; &#1571;&#1583;&#1575;&#1577; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1575;&#1581;&#1578;&#1601;&#1575;&#1592;&#1614; &#1576;&#1573;&#1593;&#1583;&#1575;&#1583; &#1578;&#1588;&#1594;&#1610;&#1604; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1582;&#1575;&#1585;&#1580;&#1607;&#1575; &#1608;&#1607;&#1608; &#1605;&#1575; &#1610;&#1615;&#1587;&#1575;&#1593;&#1583; &#1605;&#1606; &#1573;&#1593;&#1575;&#1583;&#1577; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1606;&#1601;&#1587; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1601;&#1610; &#1593;&#1583;&#1617;&#1577; &#1576;&#1610;&#1574;&#1575;&#1578; &#1593;&#1576;&#1585; &#1573;&#1606;&#1588;&#1575;&#1569; &#1589;&#1608;&#1585;&#1577; &#1605;&#1606;&#1607;&#1575;.</p><p dir="rtl">&#1610;&#1607;&#1583;&#1601; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1602;&#1575;&#1604; &#1573;&#1604;&#1609; &#1593;&#1585;&#1590; &#1601;&#1608;&#1575;&#1574;&#1583; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1570;&#1604;&#1610;&#1617;&#1577; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1601;&#1610; &#1576;&#1610;&#1574;&#1577; &#1593;&#1606;&#1602;&#1608;&#1583;&#1610;&#1617;&#1577; Clustered &#1605;&#1606; &#1605;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; Docker. &#1587;&#1606;&#1615;&#1585;&#1603;&#1617;&#1586; &#1593;&#1604;&#1609; &#1575;&#1604;&#1605;&#1601;&#1575;&#1607;&#1610;&#1605; &#1575;&#1604;&#1593;&#1575;&#1605;&#1617;&#1577; &#1605;&#1593; &#1573;&#1593;&#1591;&#1575;&#1569; &#1571;&#1605;&#1579;&#1604;&#1577; &#1605;&#1615;&#1581;&#1583;&#1617;&#1614;&#1583;&#1577; &#1593;&#1606;&#1583;&#1605;&#1575; &#1610;&#1603;&#1608;&#1606; &#1584;&#1604;&#1603; &#1605;&#1606;&#1575;&#1587;&#1616;&#1576;&#1611;&#1575;.</p><h2 dir="rtl">&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1608;&#1605;&#1582;&#1575;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1593;&#1575;&#1605;&#1617;&#1577; Global Configuration Stores</h2><p dir="rtl">&#1578;&#1602;&#1608;&#1605; &#1578;&#1602;&#1606;&#1610;&#1617;&#1577; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1593;&#1604;&#1609; &#1601;&#1603;&#1585;&#1577; &#1571;&#1587;&#1575;&#1587;&#1610;&#1617;&#1577; &#1578;&#1578;&#1605;&#1579;&#1617;&#1604; &#1601;&#1610; &#1571;&#1606;&#1617;&#1607; &#1610;&#1580;&#1576; &#1571;&#1606; &#1578;&#1603;&#1608;&#1606; &#1604;&#1583;&#1609; &#1571;&#1610; &#1606;&#1592;&#1610;&#1585; &#1605;&#1606; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; Instance &#1575;&#1604;&#1602;&#1615;&#1583;&#1585;&#1577; &#1593;&#1604;&#1609; &#1575;&#1604;&#1578;&#1617;&#1593;&#1585;&#1601; &#1576;&#1585;&#1605;&#1580;&#1610;&#1617;&#1611;&#1575; &#1593;&#1604;&#1609; &#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1575;&#1604;&#1576;&#1610;&#1574;&#1577; &#1575;&#1604;&#1578;&#1610; &#1610;&#1593;&#1605;&#1604; &#1601;&#1610;&#1607;&#1575;. &#1607;&#1584;&#1575; &#1575;&#1604;&#1571;&#1605;&#1585; &#1590;&#1585;&#1608;&#1585;&#1610; &#1604;&#1578;&#1605;&#1603;&#1610;&#1606; "&#1586;&#1585;&#1593;" &#1575;&#1604;&#1606;&#1617;&#1592;&#1610;&#1585; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583; &#1601;&#1610; &#1576;&#1610;&#1574;&#1577; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1583;&#1608;&#1606; &#1575;&#1604;&#1581;&#1575;&#1580;&#1577; &#1604;&#1604;&#1578;&#1617;&#1583;&#1582;&#1604; &#1575;&#1604;&#1610;&#1583;&#1608;&#1610;. &#1578;&#1615;&#1606;&#1614;&#1601;&#1617;&#1614;&#1584; &#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1601;&#1610; &#1575;&#1604;&#1593;&#1575;&#1583;&#1577; &#1593;&#1604;&#1609; &#1607;&#1610;&#1574;&#1577; &#1587;&#1580;&#1604;&#1617;&#1575;&#1578; &#1578;&#1615;&#1582;&#1586;&#1617;&#1606; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578;&#1613; &#1593;&#1606; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1571;&#1608; &#1575;&#1604;&#1582;&#1583;&#1605;&#1575;&#1578; &#1575;&#1604;&#1593;&#1575;&#1605;&#1604;&#1577; &#1581;&#1575;&#1604;&#1610;&#1617;&#1611;&#1575; &#1590;&#1605;&#1606; &#1576;&#1610;&#1574;&#1577; &#1575;&#1604;&#1593;&#1605;&#1604;&#1548; &#1608;&#1610;&#1615;&#1605;&#1603;&#1606; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1610;&#1607;&#1575; &#1605;&#1606; &#1580;&#1605;&#1610;&#1593; &#1593;&#1606;&#1575;&#1589;&#1585; &#1575;&#1604;&#1576;&#1610;&#1574;&#1577;. &#1578;&#1615;&#1608;&#1586;&#1617;&#1614;&#1593; &#1607;&#1584;&#1607; &#1575;&#1604;&#1587;&#1617;&#1580;&#1604;&#1617;&#1575;&#1578; &#1576;&#1610;&#1606; &#1593;&#1583;&#1617;&#1577; &#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; &#1604;&#1580;&#1593;&#1604;&#1607;&#1575; &#1602;&#1575;&#1576;&#1604;&#1577;&#1611; &#1604;&#1604;&#1578;&#1617;&#1608;&#1587;&#1617;&#1593;Scalable &#1608;&#1602;&#1575;&#1583;&#1585;&#1577;&#1611; &#1593;&#1604;&#1609; &#1575;&#1604;&#1593;&#1605;&#1604; &#1593;&#1606;&#1583; &#1581;&#1589;&#1608;&#1604; &#1571;&#1582;&#1591;&#1575;&#1569;.</p><p dir="rtl">&#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1605;&#1606;&#1589;&#1617;&#1575;&#1578; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1604;&#1581;&#1601;&#1592; &#1571;&#1610;&#1617; &#1606;&#1608;&#1593; &#1605;&#1606; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1548; &#1585;&#1594;&#1605; &#1571;&#1606;&#1617; &#1575;&#1604;&#1607;&#1583;&#1601; &#1575;&#1604;&#1571;&#1608;&#1604;&#1610;&#1617; &#1605;&#1606; &#1573;&#1606;&#1588;&#1575;&#1574;&#1607;&#1575; &#1607;&#1608; &#1578;&#1602;&#1583;&#1610;&#1605; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1604;&#1585;&#1576;&#1591; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1601;&#1610; &#1605;&#1575; &#1576;&#1610;&#1606;&#1607;&#1575;. &#1578;&#1587;&#1578;&#1601;&#1610;&#1583; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1593;&#1605;&#1604;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1606;&#1617;&#1588;&#1585; &#1605;&#1606; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1610;&#1586;&#1577; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1581;&#1601;&#1592; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1604;&#1583;&#1609; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601;&#1563; &#1581;&#1610;&#1579;&#1615; &#1573;&#1606; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1578;&#1587;&#1578;&#1591;&#1610;&#1593; &#1578;&#1594;&#1610;&#1610;&#1585; &#1587;&#1604;&#1608;&#1603;&#1607;&#1575; &#1575;&#1593;&#1578;&#1605;&#1575;&#1583;&#1611;&#1575; &#1593;&#1604;&#1609; &#1605;&#1575; &#1578;&#1593;&#1579;&#1615;&#1585; &#1593;&#1604;&#1610;&#1607; &#1605;&#1606; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1548; &#1573;&#1584;&#1575; &#1603;&#1575;&#1606;&#1578; &#1605;&#1590;&#1576;&#1608;&#1591;&#1577;&#1611; &#1604;&#1604;&#1602;&#1610;&#1617;&#1575;&#1605; &#1576;&#1584;&#1604;&#1603;.</p><h3 dir="rtl">&#1603;&#1610;&#1601; &#1578;&#1593;&#1605;&#1604; &#1571;&#1583;&#1575;&#1577; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577;&#1567;</h3><p dir="rtl">&#1578;&#1615;&#1608;&#1601;&#1617;&#1616;&#1585; &#1603;&#1604; &#1571;&#1583;&#1575;&#1577; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1608;&#1575;&#1580;&#1607;&#1577;&#1614; &#1578;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1576;&#1585;&#1605;&#1580;&#1610;&#1617;&#1577; <abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface"><abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface"><abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface"><abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface"><abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface">API</abbr></abbr></abbr></abbr></abbr> &#1610;&#1615;&#1605;&#1603;&#1606; &#1604;&#1604;&#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1615;&#1607;&#1575; &#1604;&#1590;&#1576;&#1591; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1607;&#1575; &#1571;&#1608; &#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578;. &#1604;&#1607;&#1584;&#1575; &#1575;&#1604;&#1587;&#1617;&#1576;&#1576; &#1606;&#1580;&#1583; &#1571;&#1606;&#1617; &#1603;&#1604; &#1578;&#1591;&#1576;&#1610;&#1602; &#1610;&#1615;&#1590;&#1605;&#1617;&#1616;&#1606; &#1593;&#1606;&#1608;&#1575;&#1606;&#1614; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1605;&#1615;&#1576;&#1575;&#1588;&#1585;&#1577;&#1611; &#1601;&#1610; &#1575;&#1604;&#1605;&#1589;&#1583;&#1614;&#1585; Source &#1571;&#1608; &#1610;&#1615;&#1608;&#1601;&#1617;&#1585;&#1607; &#1603;&#1582;&#1610;&#1617;&#1575;&#1585; &#1571;&#1579;&#1606;&#1575;&#1569; &#1575;&#1604;&#1578;&#1617;&#1588;&#1594;&#1610;&#1604;. &#1578;&#1615;&#1578;&#1610;&#1581; &#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1609; &#1575;&#1604;&#1602;&#1610;&#1617;&#1605; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1581;&#1578;&#1601;&#1616;&#1592; &#1576;&#1607;&#1575; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1591;&#1604;&#1576;&#1575;&#1578; Http.</p><p dir="rtl">&#1578;&#1587;&#1580;&#1610;&#1604;&#1615; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1604;&#1606;&#1601;&#1587;&#1607; &#1604;&#1583;&#1609; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1605;&#1576;&#1575;&#1588;&#1585;&#1577;&#1611; &#1576;&#1593;&#1583; &#1576;&#1583;&#1618;&#1569; &#1593;&#1605;&#1604;&#1607;&#1548; &#1607;&#1608; &#1571;&#1608;&#1604;&#1609; &#1582;&#1591;&#1608;&#1575;&#1578; &#1593;&#1605;&#1604; &#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601;&#1563; &#1601;&#1610;&#1615;&#1587;&#1580;&#1617;&#1604; &#1603;&#1604; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1587;&#1578;&#1581;&#1578;&#1575;&#1580;&#1607;&#1575; &#1576;&#1602;&#1610;&#1617;&#1577; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1585; &#1593;&#1606;&#1583; &#1605;&#1581;&#1575;&#1608;&#1604;&#1578;&#1607;&#1575; &#1575;&#1604;&#1575;&#1587;&#1578;&#1601;&#1575;&#1583;&#1577; &#1605;&#1606; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1602;&#1583;&#1617;&#1616;&#1605;&#1607;&#1575;.&#1610;&#1580;&#1576; &#1593;&#1604;&#1609; &#1602;&#1575;&#1593;&#1583;&#1577; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; MySQL &#1605;&#1579;&#1604;&#1611;&#1575;&#1548; &#1578;&#1587;&#1580;&#1610;&#1604;&#1615; &#1593;&#1606;&#1608;&#1575;&#1606; IP &#1608;&#1605;&#1606;&#1601;&#1614;&#1584; Port &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1604;&#1604;&#1576;&#1585;&#1606;&#1575;&#1605;&#1580;&#1563; &#1610;&#1615;&#1605;&#1603;&#1606; &#1571;&#1606; &#1578;&#1615;&#1590;&#1610;&#1601; &#1571;&#1610;&#1590;&#1611;&#1575; &#1575;&#1587;&#1605;&#1614; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1582;&#1583;&#1616;&#1605; &#1608;&#1575;&#1593;&#1578;&#1605;&#1575;&#1583;&#1575;&#1578; Credentials &#1575;&#1604;&#1581;&#1587;&#1575;&#1576; &#1575;&#1604;&#1605;&#1591;&#1604;&#1608;&#1576;&#1577; &#1604;&#1578;&#1587;&#1580;&#1610;&#1604; &#1575;&#1604;&#1583;&#1617;&#1582;&#1608;&#1604;.</p><p dir="rtl">&#1571;&#1608;&#1604; &#1605;&#1575; &#1610;&#1602;&#1608;&#1605; &#1576;&#1607; &#1578;&#1591;&#1576;&#1610;&#1602; &#1610;&#1615;&#1585;&#1610;&#1583; &#1575;&#1604;&#1575;&#1587;&#1578;&#1601;&#1575;&#1583;&#1577; &#1605;&#1606; &#1582;&#1583;&#1605;&#1577;&#1613; &#1605;&#1617;&#1575; &#1593;&#1606;&#1583; &#1576;&#1583;&#1618;&#1569; &#1578;&#1588;&#1594;&#1610;&#1604;&#1607;&#1548; &#1607;&#1608;&#1617; &#1591;&#1604;&#1576; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1604;&#1573;&#1593;&#1591;&#1575;&#1574;&#1607; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1593;&#1606; &#1606;&#1602;&#1591;&#1577; &#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1605;&#1615;&#1593;&#1585;&#1617;&#1614;&#1601;&#1577; &#1605;&#1615;&#1587;&#1576;&#1614;&#1602;&#1611;&#1575; &#1604;&#1604;&#1575;&#1585;&#1578;&#1576;&#1575;&#1591; &#1576;&#1575;&#1604;&#1582;&#1583;&#1605;&#1577;. &#1610;&#1615;&#1605;&#1603;&#1606;&#1607; &#1576;&#1593;&#1583; &#1584;&#1604;&#1603; &#1575;&#1604;&#1578;&#1617;&#1601;&#1575;&#1593;&#1604; &#1605;&#1593; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1581;&#1578;&#1575;&#1580;&#1607;&#1575; &#1608;&#1601;&#1602;&#1611;&#1575; &#1604;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1593;&#1579;&#1615;&#1585; &#1593;&#1604;&#1610;&#1607;&#1575;. &#1605;&#1615;&#1608;&#1586;&#1617;&#1616;&#1593; &#1575;&#1604;&#1581;&#1616;&#1605;&#1604; Load balancer &#1605;&#1579;&#1575;&#1604;&#1612; &#1580;&#1610;&#1617;&#1583;&#1548; &#1581;&#1610;&#1579;&#1615; &#1576;&#1573;&#1605;&#1603;&#1575;&#1606;&#1607; - &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; - &#1575;&#1604;&#1593;&#1579;&#1608;&#1585; &#1593;&#1604;&#1609; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1593;&#1606; &#1603;&#1604; &#1575;&#1604;&#1582;&#1608;&#1575;&#1583;&#1610;&#1605; &#1575;&#1604;&#1582;&#1604;&#1601;&#1610;&#1617;&#1617;&#1577; Backend servers &#1581;&#1578;&#1617;&#1609; &#1610;&#1615;&#1608;&#1580;&#1617;&#1616;&#1607;&#1614; &#1573;&#1604;&#1610;&#1607;&#1575; &#1581;&#1585;&#1603;&#1577; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1581;&#1587;&#1576; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1616;&#1607;&#1575; &#1608;&#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1594;&#1584;&#1617;&#1610; &#1576;&#1607;&#1575; (&#1571;&#1610; &#1575;&#1604;&#1582;&#1608;&#1575;&#1583;&#1610;&#1605;) &#1571;&#1583;&#1575;&#1577;&#1614; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601;.</p><p dir="rtl">&#1610;&#1606;&#1578;&#1615;&#1580; &#1593;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1571;&#1583;&#1575;&#1577; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1608;&#1590;&#1593;&#1615; &#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1582;&#1575;&#1585;&#1580;&#1614; &#1573;&#1591;&#1575;&#1585; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577;. &#1610;&#1580;&#1593;&#1604; &#1607;&#1584;&#1575; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1571;&#1603;&#1579;&#1585; &#1605;&#1585;&#1608;&#1606;&#1577; &#1608;&#1571;&#1602;&#1604; &#1575;&#1585;&#1578;&#1607;&#1575;&#1606;&#1611;&#1575; &#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1605;&#1615;&#1593;&#1610;&#1617;&#1614;&#1606;&#1577;&#1563; &#1603;&#1605;&#1575; &#1571;&#1606;&#1617;&#1607; &#1610;&#1615;&#1587;&#1607;&#1617;&#1616;&#1604; &#1593;&#1604;&#1609; &#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1575;&#1604;&#1578;&#1601;&#1575;&#1593;&#1604;&#1614; &#1605;&#1593; &#1606;&#1592;&#1575;&#1574;&#1585; &#1580;&#1583;&#1610;&#1583;&#1577; &#1605;&#1606; &#1606;&#1601;&#1587; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1605;&#1578;&#1610;&#1581;&#1611;&#1575; &#1576;&#1584;&#1604;&#1603; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1617;&#1577; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1583;&#1617;&#1610;&#1606;&#1575;&#1605;&#1610;&#1603;&#1610;.</p><h2 dir="rtl">&#1603;&#1610;&#1601; &#1610;&#1615;&#1572;&#1579;&#1617;&#1616;&#1585; &#1578;&#1582;&#1586;&#1610;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1567;</h2><p dir="rtl">&#1578;&#1615;&#1593;&#1583;&#1617; &#1575;&#1604;&#1602;&#1615;&#1583;&#1585;&#1577; &#1593;&#1604;&#1609; &#1578;&#1582;&#1586;&#1610;&#1606; &#1571;&#1610; &#1606;&#1608;&#1593; &#1605;&#1606; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1548; &#1576;&#1605;&#1575; &#1601;&#1610;&#1607;&#1575; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578;&#1612; &#1578;&#1591;&#1604;&#1615;&#1576;&#1607;&#1575; &#1571;&#1580;&#1586;&#1575;&#1569; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1571;&#1579;&#1606;&#1575;&#1569; &#1578;&#1606;&#1601;&#1610;&#1584;&#1607;&#1575;&#1548; &#1573;&#1581;&#1583;&#1609; &#1575;&#1604;&#1605;&#1586;&#1575;&#1610;&#1575; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587;&#1610;&#1617;&#1577; &#1601;&#1610; &#1571;&#1610; &#1606;&#1592;&#1575;&#1605; &#1593;&#1605;&#1608;&#1605;&#1610; &#1605;&#1608;&#1586;&#1617;&#1614;&#1593; &#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577;. &#1610;&#1593;&#1606;&#1610; &#1607;&#1584;&#1575; &#1571;&#1606;&#1617;&#1607; &#1576;&#1575;&#1604;&#1573;&#1605;&#1603;&#1575;&#1606; &#1608;&#1590;&#1593; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1573;&#1593;&#1583;&#1575;&#1583;&#1613; &#1571;&#1603;&#1579;&#1585; &#1582;&#1575;&#1585;&#1580; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577;&#1548; &#1590;&#1605;&#1606; &#1576;&#1610;&#1574;&#1577; &#1578;&#1606;&#1601;&#1610;&#1584; &#1571;&#1608;&#1587;&#1593;.</p><p dir="rtl">&#1610;&#1580;&#1576; &#1571;&#1606; &#1578;&#1615;&#1589;&#1605;&#1617;&#1605; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; - &#1581;&#1578;&#1617;&#1609; &#1578;&#1593;&#1605;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1591;&#1617;&#1585;&#1610;&#1602;&#1577; &#1576;&#1588;&#1603;&#1604; &#1601;&#1593;&#1617;&#1575;&#1604; - &#1576;&#1593;&#1583;&#1583; &#1605;&#1593;&#1602;&#1608;&#1604; &#1605;&#1606; &#1575;&#1604;&#1582;&#1610;&#1617;&#1575;&#1585;&#1575;&#1578; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; Defaults &#1593;&#1604;&#1609; &#1571;&#1606; &#1610;&#1603;&#1608;&#1606; &#1605;&#1606; &#1575;&#1604;&#1605;&#1605;&#1603;&#1606; &#1573;&#1576;&#1583;&#1575;&#1604;&#1615;&#1607;&#1575; &#1576;&#1602;&#1610;&#1617;&#1605; &#1571;&#1582;&#1585;&#1609; &#1610;&#1615;&#1578;&#1614;&#1581;&#1589;&#1617;&#1614;&#1604; &#1593;&#1604;&#1610;&#1607;&#1575; &#1605;&#1606; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1571;&#1579;&#1606;&#1575;&#1569; &#1575;&#1604;&#1578;&#1617;&#1606;&#1601;&#1610;&#1584;. &#1578;&#1580;&#1593;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1591;&#1617;&#1585;&#1610;&#1602;&#1577; &#1605;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1605;&#1615;&#1605;&#1575;&#1579;&#1616;&#1604;&#1611;&#1575; &#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1582;&#1610;&#1617;&#1575;&#1585;&#1575;&#1578; &#1587;&#1591;&#1585; &#1575;&#1604;&#1571;&#1608;&#1575;&#1605;&#1585; Command line flags (&#1571;&#1608; Command line options) &#1605;&#1593; &#1601;&#1585;&#1602; &#1571;&#1606;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1605;&#1582;&#1586;&#1606; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1605;&#1578;&#1575;&#1581; &#1604;&#1604;&#1593;&#1605;&#1608;&#1605; &#1610;&#1587;&#1605;&#1581; &#1576;&#1573;&#1606;&#1588;&#1575;&#1569; &#1608;&#1578;&#1588;&#1594;&#1610;&#1604; &#1606;&#1592;&#1575;&#1574;&#1585; &#1571;&#1582;&#1585;&#1609; &#1605;&#1606; &#1606;&#1601;&#1587; &#1575;&#1604;&#1593;&#1615;&#1606;&#1589;&#1585; &#1583;&#1608;&#1606; &#1580;&#1607;&#1583;&#1613; &#1586;&#1575;&#1574;&#1583;.</p><h2 dir="rtl">&#1603;&#1610;&#1601; &#1610;&#1615;&#1587;&#1575;&#1593;&#1616;&#1583; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1601;&#1610; &#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1593;&#1615;&#1606;&#1602;&#1608;&#1583;&#1567;</h2><p dir="rtl">&#1604;&#1575; &#1610;&#1592;&#1607;&#1585; &#1604;&#1604;&#1608;&#1607;&#1604;&#1577; &#1575;&#1604;&#1571;&#1608;&#1604;&#1609;&#1548; &#1575;&#1604;&#1593;&#1608;&#1606;&#1615; &#1575;&#1604;&#1617;&#1584;&#1610; &#1610;&#1615;&#1602;&#1583;&#1617;&#1605;&#1607; &#1605;&#1582;&#1586;&#1606;&#1612; &#1605;&#1615;&#1608;&#1586;&#1617;&#1614;&#1593; &#1604;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1610;&#1587;&#1578;&#1582;&#1583;&#1605; &#1589;&#1610;&#1594;&#1577; &#1605;&#1601;&#1578;&#1575;&#1581;-&#1602;&#1610;&#1605;&#1577;&#1548; &#1601;&#1610; &#1581;&#1601;&#1592; &#1608;&#1573;&#1583;&#1575;&#1585;&#1577; &#1593;&#1615;&#1590;&#1608;&#1610;&#1617;&#1575;&#1578; Membership &#1575;&#1604;&#1593;&#1606;&#1602;&#1608;&#1583;. &#1605;&#1582;&#1575;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1607;&#1610; &#1601;&#1610; &#1575;&#1604;&#1608;&#1575;&#1602;&#1593; &#1575;&#1604;&#1576;&#1610;&#1574;&#1577; &#1575;&#1604;&#1605;&#1615;&#1579;&#1604;&#1609; &#1604;&#1581;&#1601;&#1592; &#1570;&#1579;&#1575;&#1585; &#1593;&#1590;&#1608;&#1610;&#1617;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; &#1608;&#1608;&#1590;&#1593;&#1607;&#1575; &#1578;&#1581;&#1578; &#1578;&#1589;&#1585;&#1617;&#1601; &#1571;&#1583;&#1608;&#1575;&#1578; &#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1593;&#1606;&#1602;&#1608;&#1583;.</p><p dir="rtl">&#1601;&#1610; &#1605;&#1575; &#1610;&#1604;&#1610; &#1576;&#1593;&#1590; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1605;&#1603;&#1606; &#1581;&#1601;&#1592;&#1607;&#1575; &#1593;&#1604;&#1609; &#1588;&#1603;&#1604; &#1605;&#1601;&#1578;&#1575;&#1581;-&#1602;&#1610;&#1605;&#1577; &#1601;&#1610; &#1605;&#1582;&#1575;&#1586;&#1606; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1605;&#1615;&#1608;&#1586;&#1617;&#1614;&#1593;&#1577;:</p><ul><li><p dir="rtl">&#1593;&#1606;&#1575;&#1608;&#1610;&#1606; IP &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578;.</p></li><li><p dir="rtl">&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1576;&#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1575;&#1578;.</p></li><li><p dir="rtl">&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1608;&#1589;&#1601;&#1610;&#1617;&#1577; Metadata &#1608;&#1605;&#1615;&#1604;&#1589;&#1602;&#1575;&#1578; Labels &#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1575;&#1604;&#1578;&#1617;&#1581;&#1603;&#1605; &#1576;&#1607;&#1575; &#1605;&#1606; &#1571;&#1580;&#1604; &#1575;&#1578;&#1617;&#1582;&#1575;&#1584; &#1602;&#1585;&#1575;&#1585;&#1578; &#1578;&#1578;&#1593;&#1604;&#1617;&#1602; &#1576;&#1575;&#1604;&#1580;&#1583;&#1608;&#1604;&#1577; Scheduling.</p></li><li><p dir="rtl">&#1575;&#1604;&#1583;&#1617;&#1608;&#1585; Role &#1583;&#1575;&#1582;&#1604; &#1575;&#1604;&#1593;&#1606;&#1602;&#1608;&#1583; (&#1601;&#1610; &#1581;&#1575;&#1604; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1606;&#1605;&#1608;&#1584;&#1580; &#1602;&#1575;&#1574;&#1583;/&#1578;&#1575;&#1576;&#1616;&#1593; Leader/follower model).</p></li></ul><p dir="rtl">&#1604;&#1606; &#1578;&#1590;&#1591;&#1617;&#1585; &#1601;&#1610; &#1575;&#1604;&#1592;&#1617;&#1585;&#1608;&#1601; &#1575;&#1604;&#1575;&#1593;&#1578;&#1610;&#1575;&#1583;&#1610;&#1617;&#1577; &#1573;&#1604;&#1609; &#1575;&#1604;&#1575;&#1607;&#1578;&#1605;&#1575;&#1605; &#1576;&#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1617;&#1601;&#1575;&#1589;&#1610;&#1604; &#1593;&#1606;&#1583; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1571;&#1583;&#1575;&#1577;&#1613; &#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577;&#1563; &#1608;&#1604;&#1603;&#1606;&#1617;&#1607;&#1575; &#1608;&#1587;&#1610;&#1604;&#1577; &#1578;&#1615;&#1608;&#1601;&#1617;&#1585; &#1604;&#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1593;&#1604;&#1575;&#1605; &#1571;&#1608; &#1575;&#1604;&#1578;&#1617;&#1593;&#1583;&#1610;&#1604; &#1593;&#1604;&#1609; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578;&#1613; &#1578;&#1578;&#1593;&#1604;&#1617;&#1602; &#1576;&#1575;&#1604;&#1593;&#1606;&#1602;&#1608;&#1583;.</p><h2 dir="rtl">&#1605;&#1575;&#1584;&#1575; &#1593;&#1606; &#1575;&#1604;&#1578;&#1617;&#1593;&#1585;&#1617;&#1601; &#1593;&#1604;&#1609; &#1575;&#1604;&#1573;&#1582;&#1601;&#1575;&#1602; Failure detection &#1571;&#1579;&#1606;&#1575;&#1569; &#1575;&#1604;&#1578;&#1617;&#1606;&#1601;&#1610;&#1584;&#1567;</h2><p dir="rtl">&#1610;&#1615;&#1605;&#1603;&#1606; &#1608;&#1590;&#1593; &#1570;&#1604;&#1610;&#1617;&#1577; &#1604;&#1604;&#1578;&#1617;&#1593;&#1585;&#1617;&#1601; &#1593;&#1604;&#1609; &#1573;&#1582;&#1601;&#1575;&#1602; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1593;&#1576;&#1585; &#1593;&#1583;&#1617;&#1577; &#1608;&#1587;&#1575;&#1574;&#1604;. &#1575;&#1604;&#1587;&#1617;&#1572;&#1575;&#1604; &#1575;&#1604;&#1617;&#1584;&#1610; &#1610;&#1580;&#1576; &#1591;&#1585;&#1581;&#1615;&#1607; &#1607;&#1606;&#1575; &#1607;&#1604; &#1587;&#1578;&#1615;&#1581;&#1583;&#1617;&#1614;&#1579; &#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1593;&#1606;&#1583; &#1578;&#1608;&#1602;&#1617;&#1601; &#1578;&#1591;&#1576;&#1610;&#1602; &#1593;&#1606; &#1575;&#1604;&#1593;&#1605;&#1604; &#1604;&#1578;&#1593;&#1603;&#1587; &#1581;&#1575;&#1604;&#1577; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1605;&#1606; &#1581;&#1610;&#1579;&#1615; &#1573;&#1606;&#1607; &#1604;&#1605; &#1610;&#1593;&#1615;&#1583; &#1610;&#1593;&#1605;&#1604;&#1567; &#1607;&#1584;&#1575; &#1575;&#1604;&#1606;&#1617;&#1608;&#1593; &#1605;&#1606; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1581;&#1610;&#1608;&#1610; &#1604;&#1604;&#1578;&#1617;&#1602;&#1604;&#1610;&#1604; &#1605;&#1606; &#1573;&#1582;&#1601;&#1575;&#1602; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577;.</p><p dir="rtl">&#1578;&#1615;&#1578;&#1610;&#1581; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583;&#1605;&#1606; &#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1578;&#1593;&#1610;&#1610;&#1606;&#1614; &#1602;&#1610;&#1617;&#1605; &#1605;&#1593; &#1605;&#1607;&#1604;&#1577; &#1586;&#1605;&#1606;&#1610;&#1617;&#1577; &#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1590;&#1576;&#1591;&#1615;&#1607;&#1575; Configurable Timeout. &#1601;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1581;&#1575;&#1604;&#1577; &#1610;&#1590;&#1576;&#1615;&#1591; &#1575;&#1604;&#1593;&#1606;&#1589;&#1615;&#1585; &#1602;&#1610;&#1605;&#1577;&#1611; &#1608;&#1610;&#1615;&#1585;&#1601;&#1602; &#1605;&#1593;&#1607;&#1575; &#1605;&#1607;&#1604;&#1577; &#1586;&#1605;&#1606;&#1610;&#1617;&#1577;&#1548; &#1579;&#1605; &#1610;&#1615;&#1593;&#1604;&#1616;&#1605; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1576;&#1575;&#1606;&#1578;&#1616;&#1592;&#1575;&#1605; &#1576;&#1608;&#1580;&#1608;&#1583;&#1607; &#1608;&#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1610;&#1615;&#1593;&#1610;&#1583; &#1578;&#1593;&#1610;&#1610;&#1606; &#1575;&#1604;&#1605;&#1615;&#1607;&#1604;&#1577;. &#1610;&#1615;&#1593;&#1578;&#1576;&#1585; &#1575;&#1604;&#1593;&#1615;&#1606;&#1589;&#1615;&#1585; &#1582;&#1575;&#1585;&#1580; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1608;&#1578;&#1615;&#1587;&#1581;&#1576; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578;&#1607; &#1605;&#1606; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1593;&#1606;&#1583; &#1576;&#1604;&#1608;&#1594; &#1575;&#1604;&#1605;&#1615;&#1607;&#1604;&#1577; &#1575;&#1604;&#1586;&#1617;&#1605;&#1606;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1615;&#1581;&#1583;&#1617;&#1614;&#1583;&#1614;&#1577; &#1583;&#1608;&#1606; &#1571;&#1606; &#1610;&#1578;&#1617;&#1589;&#1604; &#1576;&#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1604;&#1573;&#1593;&#1604;&#1575;&#1605;&#1607;&#1575; &#1576;&#1608;&#1580;&#1608;&#1583;&#1607; &#1608;&#1573;&#1593;&#1575;&#1583;&#1577; &#1578;&#1593;&#1610;&#1610;&#1606; &#1575;&#1604;&#1605;&#1615;&#1607;&#1604;&#1577;. &#1610;&#1578;&#1594;&#1610;&#1617;&#1614;&#1585; &#1591;&#1608;&#1604; &#1575;&#1604;&#1605;&#1615;&#1607;&#1604;&#1577; &#1581;&#1587;&#1576; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1608;&#1575;&#1604;&#1605;&#1615;&#1583;&#1617;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1581;&#1578;&#1575;&#1580;&#1607;&#1575; &#1604;&#1604;&#1578;&#1617;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1573;&#1582;&#1601;&#1575;&#1602; &#1571;&#1581;&#1583; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1575;&#1604;&#1605;&#1615;&#1603;&#1608;&#1617;&#1606;&#1577; &#1604;&#1607;.</p><p dir="rtl">&#1578;&#1608;&#1580;&#1583; &#1591;&#1585;&#1610;&#1602;&#1577; &#1571;&#1582;&#1585;&#1609; &#1578;&#1593;&#1578;&#1605;&#1583; &#1593;&#1604;&#1609; &#1573;&#1606;&#1588;&#1575;&#1569; &#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1605;&#1615;&#1587;&#1575;&#1593;&#1583;&#1577; &#1605;&#1593; &#1603;&#1604; &#1593;&#1606;&#1589;&#1615;&#1585;&#1548; &#1578;&#1602;&#1578;&#1589;&#1585; &#1605;&#1607;&#1605;&#1617;&#1577; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1615;&#1587;&#1575;&#1593;&#1616;&#1583;&#1577; &#1593;&#1604;&#1609; &#1575;&#1604;&#1578;&#1617;&#1581;&#1602;&#1602; &#1605;&#1606; &#1587;&#1604;&#1575;&#1605;&#1577; &#1575;&#1604;&#1593;&#1606;&#1589;&#1615;&#1585; &#1583;&#1608;&#1585;&#1616;&#1610;&#1617;&#1611;&#1575; &#1579;&#1605;&#1617; &#1578;&#1581;&#1583;&#1610;&#1579; &#1575;&#1604;&#1587;&#1617;&#1580;&#1604; &#1601;&#1610; &#1581;&#1575;&#1604; &#1578;&#1608;&#1602;&#1617;&#1601; &#1575;&#1604;&#1593;&#1606;&#1589;&#1615;&#1585; &#1593;&#1606; &#1575;&#1604;&#1593;&#1605;&#1604;. &#1606;&#1602;&#1591;&#1577; &#1590;&#1593;&#1601; &#1607;&#1584;&#1607; &#1575;&#1604;&#1591;&#1617;&#1585;&#1610;&#1602;&#1577; &#1607;&#1610; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1615;&#1587;&#1575;&#1593;&#1583;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1615;&#1605;&#1603;&#1606; &#1571;&#1606; &#1578;&#1578;&#1608;&#1602;&#1617;&#1601; &#1593;&#1606; &#1575;&#1604;&#1593;&#1605;&#1604; &#1608;&#1607;&#1608; &#1605;&#1575; &#1602;&#1583; &#1610;&#1606;&#1578;&#1615;&#1580; &#1593;&#1606;&#1607; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1582;&#1575;&#1591;&#1574;&#1577; &#1601;&#1610; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;. &#1578;&#1578;&#1594;&#1604;&#1617;&#1576; &#1576;&#1593;&#1590; &#1575;&#1604;&#1606;&#1617;&#1615;&#1592;&#1615;&#1605; &#1593;&#1604;&#1609; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1587;&#1571;&#1604;&#1577; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1617;&#1577; &#1575;&#1604;&#1578;&#1581;&#1602;&#1617;&#1602; &#1605;&#1606; &#1587;&#1604;&#1575;&#1605;&#1577; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1573;&#1604;&#1609; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601;. &#1610;&#1615;&#1605;&#1603;&#1606; &#1604;&#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1576;&#1607;&#1584;&#1607; &#1575;&#1604;&#1591;&#1617;&#1585;&#1610;&#1602;&#1577; &#1601;&#1581;&#1589;&#1615; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1575;&#1604;&#1605;&#1615;&#1587;&#1580;&#1617;&#1614;&#1604;&#1577; &#1604;&#1583;&#1610;&#1607;&#1575; &#1583;&#1608;&#1585;&#1610;&#1617;&#1611;&#1575; &#1604;&#1604;&#1578;&#1617;&#1571;&#1603;&#1583; &#1605;&#1606; &#1581;&#1575;&#1604;&#1578;&#1607;&#1575;.</p><h2 dir="rtl">&#1605;&#1575;&#1584;&#1575; &#1593;&#1606; &#1573;&#1593;&#1575;&#1583;&#1577; &#1590;&#1576;&#1591; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1593;&#1606;&#1583; &#1575;&#1604;&#1578;&#1617;&#1593;&#1583;&#1610;&#1604; &#1593;&#1604;&#1609; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1567;</h2><p dir="rtl">&#1578;&#1615;&#1605;&#1579;&#1617;&#1604; &#1573;&#1593;&#1575;&#1583;&#1577; &#1575;&#1604;&#1590;&#1617;&#1576;&#1591; &#1583;&#1610;&#1606;&#1575;&#1605;&#1610;&#1603;&#1610;&#1617;&#1611;&#1575; &#1573;&#1581;&#1583;&#1609; &#1575;&#1604;&#1578;&#1617;&#1581;&#1587;&#1610;&#1606;&#1575;&#1578; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587;&#1610;&#1617;&#1577; &#1593;&#1604;&#1609; &#1606;&#1605;&#1608;&#1584;&#1580; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1571;&#1589;&#1604;&#1610;. &#1578;&#1593;&#1606;&#1610; &#1573;&#1593;&#1575;&#1583;&#1577;&#1615; &#1575;&#1604;&#1590;&#1617;&#1576;&#1591; &#1583;&#1610;&#1606;&#1575;&#1605;&#1610;&#1603;&#1610;&#1617;&#1611;&#1575; &#1602;&#1583;&#1585;&#1577;&#1614; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1593;&#1604;&#1609; &#1575;&#1604;&#1578;&#1617;&#1601;&#1575;&#1593;&#1604; &#1605;&#1593; &#1575;&#1604;&#1578;&#1617;&#1594;&#1610;&#1610;&#1585;&#1575;&#1578; &#1601;&#1610; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1608;&#1590;&#1576;&#1591; &#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1581;&#1587;&#1576; &#1575;&#1604;&#1578;&#1617;&#1593;&#1583;&#1610;&#1604;&#1575;&#1578; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583;&#1577;&#1563; &#1593;&#1603;&#1587;&#1614; &#1575;&#1604;&#1606;&#1617;&#1605;&#1608;&#1584;&#1580; &#1575;&#1604;&#1571;&#1589;&#1604;&#1610; &#1575;&#1604;&#1584;&#1610; &#1610;&#1602;&#1578;&#1589;&#1616;&#1585; &#1578;&#1571;&#1579;&#1610;&#1585;&#1607; &#1593;&#1604;&#1609; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1575;&#1576;&#1578;&#1583;&#1575;&#1574;&#1610; &#1604;&#1604;&#1593;&#1615;&#1606;&#1589;&#1615;&#1585;(&#1593;&#1606;&#1583; &#1576;&#1583;&#1618;&#1569; &#1578;&#1588;&#1594;&#1610;&#1604;&#1607;). &#1593;&#1604;&#1609; &#1587;&#1576;&#1610;&#1604; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604;&#1548; &#1581;&#1610;&#1606;&#1614; &#1610;&#1601;&#1581;&#1589; &#1605;&#1615;&#1608;&#1586;&#1617;&#1616;&#1593; &#1581;&#1616;&#1605;&#1604; &#1575;&#1604;&#1582;&#1608;&#1575;&#1583;&#1610;&#1605;&#1614; &#1575;&#1604;&#1582;&#1604;&#1601;&#1610;&#1577; &#1608;&#1610;&#1580;&#1583; &#1571;&#1606;&#1617; &#1571;&#1581;&#1583;&#1607;&#1575; &#1578;&#1608;&#1602;&#1617;&#1601; &#1593;&#1606; &#1575;&#1604;&#1593;&#1605;&#1604;&#1563; &#1601;&#1573;&#1606;&#1617;&#1607; &#1587;&#1610;&#1581;&#1578;&#1575;&#1580; &#1604;&#1571;&#1582;&#1584; &#1584;&#1604;&#1603; &#1576;&#1575;&#1604;&#1581;&#1615;&#1587;&#1576;&#1575;&#1606; &#1605;&#1606; &#1571;&#1580;&#1604; &#1578;&#1593;&#1583;&#1610;&#1604; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1616;&#1607; &#1604;&#1578;&#1615;&#1606;&#1575;&#1587;&#1616;&#1576; &#1575;&#1604;&#1608;&#1590;&#1593;&#1610;&#1617;&#1577; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583;&#1577;.</p><p dir="rtl">&#1578;&#1608;&#1580;&#1583; &#1593;&#1583;&#1617;&#1577; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1578;&#1615;&#1585;&#1603;&#1617;&#1616;&#1586; &#1593;&#1604;&#1609; &#1605;&#1608;&#1586;&#1617;&#1593; &#1575;&#1604;&#1581;&#1616;&#1605;&#1604; &#1606;&#1592;&#1585;&#1611;&#1575; &#1604;&#1603;&#1608;&#1606;&#1607; &#1571;&#1581;&#1583; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1575;&#1604;&#1571;&#1603;&#1579;&#1585; &#1575;&#1581;&#1578;&#1610;&#1617;&#1575;&#1580;&#1611;&#1575; &#1604;&#1607;&#1584;&#1607; &#1575;&#1604;&#1582;&#1575;&#1589;&#1610;&#1617;&#1577;. &#1610;&#1578;&#1605;&#1610;&#1617;&#1586; HAProxy &#1576;&#1571;&#1606;&#1617;&#1607; &#1571;&#1581;&#1583; &#1571;&#1603;&#1579;&#1585; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1588;&#1615;&#1607;&#1585;&#1577;&#1611; &#1604;&#1605;&#1575; &#1610;&#1578;&#1605;&#1578;&#1617;&#1593; &#1576;&#1607; &#1605;&#1606; &#1588;&#1593;&#1576;&#1610;&#1617;&#1577; &#1576;&#1610;&#1606; &#1575;&#1604;&#1605;&#1615;&#1607;&#1578;&#1605;&#1617;&#1610;&#1606; &#1576;&#1570;&#1604;&#1610;&#1617;&#1575;&#1578; &#1578;&#1608;&#1586;&#1610;&#1593; &#1575;&#1604;&#1581;&#1616;&#1605;&#1604;&#1548; &#1601;&#1610; &#1581;&#1610;&#1606; &#1571;&#1606;&#1617; &#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1571;&#1582;&#1585;&#1609; &#1578;&#1578;&#1605;&#1578;&#1617;&#1593; &#1576;&#1605;&#1585;&#1608;&#1606;&#1577; &#1571;&#1603;&#1576;&#1585; &#1581;&#1610;&#1579;&#1615; &#1576;&#1575;&#1604;&#1573;&#1605;&#1603;&#1575;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1615;&#1607;&#1575; &#1604;&#1573;&#1581;&#1583;&#1575;&#1579; &#1578;&#1594;&#1610;&#1610;&#1585;&#1575;&#1578; &#1601;&#1610; &#1603;&#1604; &#1571;&#1606;&#1608;&#1575;&#1593; &#1575;&#1604;&#1576;&#1585;&#1575;&#1605;&#1580;. &#1578;&#1587;&#1578;&#1593;&#1604;&#1605; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1583;&#1608;&#1575;&#1578; &#1576;&#1575;&#1606;&#1578;&#1592;&#1575;&#1605; &#1582;&#1583;&#1605;&#1577;&#1614; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1576;&#1581;&#1579;&#1611;&#1575; &#1593;&#1606; &#1578;&#1594;&#1610;&#1610;&#1585;&#1575;&#1578;&#1548; &#1608;&#1601;&#1610; &#1581;&#1575;&#1604; &#1608;&#1580;&#1608;&#1583;&#1607;&#1575; &#1578;&#1587;&#1578;&#1582;&#1583;&#1605; &#1606;&#1592;&#1575;&#1605; &#1602;&#1608;&#1575;&#1604;&#1576; &#1604;&#1578;&#1608;&#1604;&#1610;&#1583; &#1605;&#1604;&#1601;&#1617;&#1575;&#1578;&#1616; &#1573;&#1593;&#1583;&#1575;&#1583; &#1580;&#1583;&#1610;&#1583;&#1577;&#1611; &#1578;&#1615;&#1583;&#1605;&#1616;&#1580; &#1575;&#1604;&#1602;&#1610;&#1617;&#1605; &#1575;&#1604;&#1617;&#1578;&#1610; &#1571;&#1585;&#1587;&#1604;&#1578;&#1607;&#1575; &#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601;. &#1601;&#1610; &#1575;&#1604;&#1571;&#1582;&#1610;&#1585; &#1610;&#1615;&#1593;&#1575;&#1583; &#1578;&#1588;&#1594;&#1610;&#1604; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1604;&#1571;&#1582;&#1584; &#1575;&#1604;&#1578;&#1617;&#1594;&#1610;&#1610;&#1585;&#1575;&#1578; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583;&#1577; &#1601;&#1610; &#1575;&#1604;&#1581;&#1587;&#1576;&#1575;&#1606;.</p><p dir="rtl">&#1610;&#1581;&#1578;&#1575;&#1580; &#1607;&#1584;&#1575; &#1575;&#1604;&#1606;&#1617;&#1608;&#1593; &#1605;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1583;&#1617;&#1610;&#1606;&#1575;&#1605;&#1610;&#1603;&#1610; &#1573;&#1604;&#1609; &#1578;&#1582;&#1591;&#1610;&#1591; &#1571;&#1603;&#1576;&#1585; &#1571;&#1579;&#1606;&#1575;&#1569; &#1593;&#1605;&#1604;&#1610;&#1617;&#1577; &#1576;&#1606;&#1575;&#1569; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602; &#1573;&#1584; &#1571;&#1606;&#1617; &#1603;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1570;&#1604;&#1610;&#1617;&#1575;&#1578; &#1610;&#1580;&#1576; &#1571;&#1606; &#1578;&#1578;&#1608;&#1575;&#1580;&#1583; &#1601;&#1610; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1605;&#1579;&#1617;&#1604; &#1575;&#1604;&#1593;&#1615;&#1606;&#1589;&#1585;&#1548; &#1608;&#1607;&#1608; &#1605;&#1575; &#1610;&#1580;&#1593;&#1604; &#1605;&#1606; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1577; &#1605;&#1587;&#1572;&#1608;&#1604;&#1577;&#1611; &#1593;&#1606; &#1578;&#1593;&#1583;&#1610;&#1604; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1616;&#1607;&#1575;. &#1610;&#1615;&#1605;&#1579;&#1617;&#1616;&#1604; &#1575;&#1587;&#1578;&#1582;&#1585;&#1575;&#1580; &#1575;&#1604;&#1602;&#1610;&#1617;&#1605; &#1575;&#1604;&#1605;&#1591;&#1604;&#1608;&#1576;&#1616; &#1603;&#1578;&#1575;&#1576;&#1578;&#1615;&#1607;&#1575; &#1601;&#1610; &#1587;&#1580;&#1604;&#1617; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577;&#1548; &#1608;&#1578;&#1589;&#1605;&#1610;&#1605; &#1576;&#1606;&#1610;&#1577; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; Data structure &#1578;&#1587;&#1607;&#1615;&#1604; &#1575;&#1604;&#1575;&#1587;&#1578;&#1601;&#1575;&#1583;&#1577; &#1605;&#1606;&#1607;&#1575; &#1578;&#1581;&#1583;&#1617;&#1616;&#1610;&#1611;&#1575; &#1570;&#1582;&#1585; &#1601;&#1610; &#1576;&#1606;&#1575;&#1569; &#1606;&#1592;&#1575;&#1605; &#1573;&#1593;&#1583;&#1575;&#1583; &#1583;&#1610;&#1606;&#1575;&#1605;&#1610;&#1603;&#1610;. &#1605;&#1593; &#1584;&#1604;&#1603; &#1610;&#1615;&#1605;&#1603;&#1606; &#1604;&#1607;&#1584;&#1575; &#1575;&#1604;&#1606;&#1617;&#1592;&#1575;&#1605; &#1571;&#1606; &#1610;&#1615;&#1602;&#1583;&#1617;&#1605; &#1605;&#1585;&#1608;&#1606;&#1577;&#1611; &#1603;&#1576;&#1610;&#1585;&#1577;&#1611; &#1601;&#1610; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;.</p><h2 dir="rtl">&#1605;&#1575;&#1584;&#1575; &#1593;&#1606; &#1575;&#1604;&#1571;&#1605;&#1575;&#1606;&#1567;</h2><p dir="rtl">&#1610;&#1591;&#1585;&#1581; &#1603;&#1579;&#1610;&#1585;&#1612; &#1605;&#1606; &#1575;&#1604;&#1605;&#1576;&#1578;&#1583;&#1574;&#1610;&#1606; &#1605;&#1587;&#1571;&#1604;&#1577; &#1575;&#1604;&#1571;&#1605;&#1575;&#1606; &#1593;&#1606;&#1583; &#1575;&#1604;&#1581;&#1583;&#1610;&#1579; &#1593;&#1606; &#1605;&#1582;&#1575;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1575;&#1604;&#1605;&#1578;&#1575;&#1581;&#1577; &#1604;&#1604;&#1593;&#1605;&#1608;&#1605;. &#1607;&#1604; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1606;&#1575;&#1587;&#1616;&#1576; &#1581;&#1602;&#1617;&#1611;&#1575; &#1581;&#1601;&#1592;&#1615; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604; &#1601;&#1610; &#1571;&#1605;&#1575;&#1603;&#1606; &#1610;&#1615;&#1578;&#1575;&#1581; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1610;&#1607;&#1575; &#1604;&#1604;&#1593;&#1605;&#1608;&#1605;&#1567;</p><p dir="rtl">&#1578;&#1582;&#1578;&#1604;&#1601; &#1575;&#1604;&#1573;&#1580;&#1575;&#1576;&#1577; &#1593;&#1604;&#1609; &#1607;&#1584;&#1575; &#1575;&#1604;&#1587;&#1572;&#1575;&#1604; &#1603;&#1579;&#1610;&#1585;&#1611;&#1575; &#1581;&#1587;&#1576; &#1605;&#1575; &#1578;&#1615;&#1585;&#1610;&#1583; &#1581;&#1601;&#1592;&#1614;&#1607; &#1601;&#1610; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1608;&#1581;&#1587;&#1576; &#1593;&#1583;&#1583; &#1591;&#1576;&#1602;&#1575;&#1578; &#1575;&#1604;&#1571;&#1605;&#1575;&#1606; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1585;&#1609; &#1571;&#1606;&#1617;&#1607;&#1575; &#1605;&#1606;&#1575;&#1587;&#1616;&#1576;&#1577; &#1604;&#1578;&#1571;&#1605;&#1610;&#1606; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578;&#1603;. &#1578;&#1587;&#1605;&#1581; &#1571;&#1594;&#1604;&#1576; &#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1576;&#1578;&#1593;&#1605;&#1610;&#1617;&#1577; Encryption &#1575;&#1604;&#1575;&#1578;&#1617;&#1589;&#1575;&#1604;&#1575;&#1578; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; SSL/TLS. &#1610;&#1603;&#1601;&#1610; &#1608;&#1590;&#1593;&#1615; &#1576;&#1593;&#1590; &#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1617;&#1578;&#1610; &#1604;&#1575; &#1578;&#1607;&#1578;&#1605; &#1603;&#1579;&#1610;&#1585;&#1611;&#1575; &#1576;&#1575;&#1604;&#1582;&#1589;&#1608;&#1589;&#1610;&#1617;&#1577; Privacy &#1601;&#1610; &#1588;&#1576;&#1603;&#1577; &#1582;&#1575;&#1589;&#1617;&#1577;&#1548; &#1604;&#1603;&#1606; &#1608;&#1580;&#1608;&#1583; &#1578;&#1571;&#1605;&#1610;&#1606; &#1573;&#1590;&#1575;&#1601;&#1610; &#1587;&#1610;&#1615;&#1601;&#1610;&#1583; &#1593;&#1604;&#1609; &#1575;&#1604;&#1571;&#1585;&#1580;&#1581; &#1575;&#1604;&#1603;&#1579;&#1610;&#1585; &#1605;&#1606; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578;.</p><p dir="rtl">&#1610;&#1603;&#1605;&#1615;&#1606; &#1571;&#1581;&#1583; &#1575;&#1604;&#1581;&#1604;&#1608;&#1604; &#1575;&#1604;&#1571;&#1605;&#1606;&#1610;&#1617;&#1577; &#1601;&#1610; &#1573;&#1578;&#1575;&#1581;&#1577; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1575;&#1604;&#1593;&#1605;&#1608;&#1605;&#1610;&#1617; &#1573;&#1604;&#1609; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1608;&#1604;&#1603;&#1606; &#1578;&#1615;&#1593;&#1605;&#1617;&#1614;&#1609; (&#1578;&#1615;&#1588;&#1614;&#1601;&#1617;&#1614;&#1585;) &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1575;&#1604;&#1605;&#1603;&#1578;&#1608;&#1576;&#1577; &#1590;&#1605;&#1606; &#1587;&#1580;&#1604; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; &#1576;&#1581;&#1610;&#1579;&#1615; &#1610;&#1578;&#1608;&#1580;&#1617;&#1614;&#1576; &#1593;&#1604;&#1609; &#1571;&#1610; &#1578;&#1591;&#1576;&#1610;&#1602; &#1610;&#1615;&#1585;&#1610;&#1583; &#1575;&#1604;&#1575;&#1587;&#1578;&#1601;&#1575;&#1583;&#1577; &#1605;&#1606; &#1605;&#1593;&#1604;&#1608;&#1605;&#1577; &#1605;&#1578;&#1575;&#1581;&#1577; &#1601;&#1610; &#1575;&#1604;&#1587;&#1617;&#1580;&#1604;&#1617; &#1575;&#1605;&#1578;&#1604;&#1575;&#1603;&#1615; &#1575;&#1604;&#1605;&#1601;&#1578;&#1575;&#1581; &#1575;&#1604;&#1587;&#1617;&#1585;&#1610; &#1575;&#1604;&#1582;&#1575;&#1589; &#1576;&#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1577; &#1581;&#1578;&#1617;&#1609; &#1610;&#1587;&#1578;&#1591;&#1610;&#1593;&#1614; &#1601;&#1603;&#1617; &#1578;&#1593;&#1605;&#1610;&#1617;&#1577; Decrypty &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578;.</p><p dir="rtl">&#1578;&#1604;&#1580;&#1571; &#1571;&#1583;&#1608;&#1575;&#1578; &#1571;&#1582;&#1585;&#1609; &#1573;&#1604;&#1609; &#1605;&#1615;&#1602;&#1575;&#1585;&#1576;&#1577; &#1605;&#1582;&#1578;&#1601;&#1604;&#1577; &#1571;&#1587;&#1575;&#1587;&#1615;&#1607;&#1575; &#1573;&#1583;&#1582;&#1575;&#1604; &#1602;&#1608;&#1575;&#1574;&#1605; &#1578;&#1581;&#1603;&#1617;&#1605; &#1601;&#1610; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; Access control lists (&#1571;&#1608; ACL &#1575;&#1582;&#1578;&#1589;&#1575;&#1585;&#1611;&#1575;) &#1604;&#1578;&#1602;&#1587;&#1610;&#1605; &#1601;&#1590;&#1575;&#1569; &#1575;&#1604;&#1605;&#1601;&#1575;&#1578;&#1610;&#1581; &#1573;&#1604;&#1609; &#1593;&#1583;&#1617;&#1577; &#1605;&#1606;&#1575;&#1591;&#1616;&#1602;&#1548; &#1578;&#1615;&#1593;&#1585;&#1617;&#1601; &#1603;&#1604; &#1608;&#1575;&#1581;&#1583;&#1577; &#1605;&#1606;&#1607;&#1575; &#1605;&#1615;&#1578;&#1591;&#1604;&#1617;&#1576;&#1575;&#1578; &#1605;&#1615;&#1581;&#1583;&#1617;&#1614;&#1583;&#1577; &#1608;&#1610;&#1615;&#1593;&#1578;&#1614;&#1605;&#1614;&#1583; &#1593;&#1604;&#1610;&#1607;&#1575; &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1605;&#1615;&#1604;&#1603;&#1610;&#1617;&#1577; &#1608;&#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1617;&#1577; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578;. &#1578;&#1615;&#1572;&#1587;&#1617;&#1587; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1615;&#1602;&#1575;&#1585;&#1576;&#1577; &#1604;&#1591;&#1585;&#1610;&#1602;&#1577; &#1576;&#1587;&#1610;&#1591;&#1577; &#1578;&#1615;&#1608;&#1601;&#1617;&#1585; &#1604;&#1576;&#1593;&#1590; &#1575;&#1604;&#1571;&#1591;&#1585;&#1575;&#1601; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1617;&#1577; &#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1576;&#1610;&#1606;&#1605;&#1575; &#1578;&#1615;&#1576;&#1602;&#1610;&#1607;&#1575; &#1582;&#1575;&#1585;&#1580; &#1605;&#1615;&#1578;&#1606;&#1575;&#1608;&#1614;&#1604; &#1571;&#1591;&#1585;&#1575;&#1601; &#1571;&#1582;&#1585;&#1609;. &#1610;&#1615;&#1605;&#1603;&#1606; &#1590;&#1576;&#1591; &#1603;&#1604; &#1593;&#1606;&#1589;&#1615;&#1585; &#1604;&#1610;&#1615;&#1578;&#1575;&#1581; &#1604;&#1607; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1610;&#1581;&#1578;&#1575;&#1580;&#1607;&#1575; &#1601;&#1602;&#1591;.</p><h2 dir="rtl">&#1605;&#1575; &#1607;&#1610;&#1617; &#1571;&#1583;&#1608;&#1575;&#1578; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1571;&#1603;&#1579;&#1585; &#1575;&#1606;&#1578;&#1616;&#1588;&#1575;&#1585;&#1611;&#1575;&#1567;</h2><p dir="rtl">&#1606;&#1593;&#1585;&#1616;&#1590; &#1601;&#1610; &#1575;&#1604;&#1601;&#1602;&#1585;&#1575;&#1578; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1617;&#1577; &#1604;&#1576;&#1593;&#1590; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1593;&#1605;&#1604; &#1593;&#1604;&#1609; &#1578;&#1606;&#1601;&#1610;&#1584; &#1575;&#1604;&#1605;&#1576;&#1575;&#1583;&#1574; &#1575;&#1604;&#1593;&#1575;&#1605;&#1617;&#1577; &#1575;&#1604;&#1605;&#1584;&#1603;&#1608;&#1585;&#1577; &#1601;&#1610; &#1575;&#1604;&#1601;&#1602;&#1585;&#1575;&#1578; &#1575;&#1604;&#1587;&#1617;&#1575;&#1576;&#1602;&#1577;. &#1605;&#1606; &#1571;&#1603;&#1579;&#1585; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1585;&#1608;&#1575;&#1580;&#1611;&#1575;:</p><ul><li><p dir="rtl">etcd: &#1571;&#1606;&#1588;&#1571;&#1607;&#1575; &#1605;&#1591;&#1608;&#1617;&#1585;&#1608; &#1578;&#1608;&#1586;&#1610;&#1593;&#1577; CoreOS &#1604;&#1578;&#1608;&#1601;&#1610;&#1585; &#1571;&#1583;&#1575;&#1577; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1582;&#1583;&#1605;&#1577; &#1608;&#1573;&#1593;&#1583;&#1575;&#1583; &#1593;&#1605;&#1608;&#1605;&#1610;&#1617; &#1605;&#1615;&#1608;&#1586;&#1617;&#1614;&#1593; &#1604;&#1603;&#1604; &#1605;&#1606; &#1575;&#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; &#1608;&#1575;&#1604;&#1571;&#1606;&#1592;&#1605;&#1577; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;&#1577;. &#1578;&#1605;&#1578;&#1604;&#1603; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; &#1608;&#1575;&#1580;&#1607;&#1577;&#1614; &#1578;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1576;&#1585;&#1605;&#1580;&#1610;&#1617;&#1577; <abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface"><abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface"><abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface"><abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface"><abbr title="&#1608;&#1575;&#1580;&#1607;&#1577; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; | Application Programming Interface">API</abbr></abbr></abbr></abbr></abbr> &#1610;&#1615;&#1578;&#1608;&#1614;&#1589;&#1617;&#1614;&#1604; &#1573;&#1604;&#1610;&#1607;&#1575; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; Http &#1573;&#1590;&#1575;&#1601;&#1577;&#1611; &#1573;&#1604;&#1609; &#1587;&#1591;&#1585; &#1571;&#1608;&#1575;&#1605;&#1585; &#1593;&#1604;&#1609; &#1603;&#1604; &#1605;&#1615;&#1587;&#1578;&#1590;&#1610;&#1601;.</p></li><li><p dir="rtl">consul: &#1578;&#1578;&#1605;&#1610;&#1617;&#1586; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; &#1576;&#1575;&#1604;&#1582;&#1589;&#1575;&#1574;&#1589; &#1575;&#1604;&#1605;&#1578;&#1602;&#1583;&#1617;&#1605;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1608;&#1601;&#1617;&#1585;&#1607;&#1575;&#1548; &#1605;&#1579;&#1604; &#1575;&#1604;&#1578;&#1581;&#1602;&#1617;&#1602; &#1605;&#1606; &#1589;&#1604;&#1575;&#1581;&#1610;&#1617;&#1577; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1548; &#1602;&#1608;&#1575;&#1574;&#1605; &#1575;&#1604;&#1578;&#1617;&#1581;&#1603;&#1617;&#1605; &#1601;&#1610; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; ACL&#1548; &#1573;&#1593;&#1583;&#1575;&#1583; HAProxy&#1548; ...&#1573;&#1604;&#1582;</p></li><li><p dir="rtl">zookeeper: &#1608;&#1607;&#1610;&#1617; &#1571;&#1583;&#1575;&#1577; &#1571;&#1602;&#1583;&#1605; &#1605;&#1606; &#1575;&#1604;&#1587;&#1617;&#1575;&#1576;&#1602;&#1578;&#1610;&#1618;&#1606;. &#1578;&#1578;&#1605;&#1610;&#1617;&#1586; &#1576;&#1605;&#1606;&#1589;&#1617;&#1577; &#1571;&#1603;&#1579;&#1585; &#1579;&#1576;&#1575;&#1578;&#1611;&#1575;&#1548; &#1608;&#1584;&#1604;&#1603; &#1593;&#1604;&#1609; &#1581;&#1587;&#1575;&#1576; &#1606;&#1602;&#1589; &#1576;&#1593;&#1590; &#1575;&#1604;&#1608;&#1592;&#1575;&#1574;&#1601; &#1575;&#1604;&#1581;&#1583;&#1610;&#1579;&#1577;.</p></li></ul><p dir="rtl">&#1575;&#1604;&#1605;&#1588;&#1575;&#1585;&#1610;&#1593; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1617;&#1577; &#1578;&#1593;&#1605;&#1604; &#1593;&#1604;&#1609; &#1578;&#1605;&#1583;&#1610;&#1583; &#1608;&#1592;&#1610;&#1601;&#1577; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1602;&#1575;&#1593;&#1583;&#1610;&#1617;&#1577; &#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577;:</p><ul><li><p dir="rtl">Crypt: &#1610;&#1615;&#1593;&#1591;&#1610; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1617;&#1577; &#1578;&#1593;&#1605;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1578;&#1617;&#1610; &#1578;&#1581;&#1578;&#1601;&#1616;&#1592; &#1576;&#1607;&#1575; &#1601;&#1610; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1605;&#1601;&#1578;&#1575;&#1581; &#1578;&#1593;&#1605;&#1610;&#1617;&#1577; &#1593;&#1605;&#1608;&#1605;&#1610; Public key. &#1610;&#1615;&#1605;&#1603;&#1616;&#1606; &#1604;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1604;&#1583;&#1610;&#1607;&#1575; &#1605;&#1601;&#1578;&#1575;&#1581; &#1601;&#1603; &#1575;&#1604;&#1578;&#1617;&#1593;&#1605;&#1610;&#1617;&#1577; Decryption key &#1601;&#1602;&#1591; &#1602;&#1585;&#1575;&#1569;&#1577;&#1615; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578;.</p></li><li><p dir="rtl">Confd: &#1608;&#1610;&#1607;&#1583;&#1616;&#1601; &#1573;&#1604;&#1609; &#1573;&#1590;&#1575;&#1601;&#1577; &#1602;&#1575;&#1576;&#1604;&#1610;&#1617;&#1577; &#1573;&#1593;&#1575;&#1583;&#1577; &#1575;&#1604;&#1590;&#1617;&#1576;&#1591; &#1583;&#1610;&#1606;&#1575;&#1605;&#1610;&#1603;&#1610;&#1617;&#1611;&#1575; &#1608;&#1575;&#1604;&#1578;&#1617;&#1581;&#1603;&#1617;&#1605; &#1601;&#1610; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1581;&#1587;&#1576; &#1575;&#1604;&#1578;&#1617;&#1594;&#1610;&#1610;&#1585;&#1575;&#1578; &#1601;&#1610; &#1582;&#1583;&#1605;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601;. &#1610;&#1578;&#1590;&#1605;&#1617;&#1606; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1588;&#1585;&#1608;&#1593; &#1593;&#1583;&#1617;&#1577; &#1608;&#1592;&#1575;&#1574;&#1601; &#1571;&#1607;&#1605;&#1617;&#1607;&#1575; &#1605;&#1585;&#1575;&#1602;&#1576;&#1614;&#1577; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1576;&#1581;&#1579;&#1611;&#1575; &#1593;&#1606; &#1578;&#1593;&#1583;&#1610;&#1604;&#1575;&#1578;&#1548; &#1608;&#1606;&#1592;&#1575;&#1605;&#1611;&#1575; &#1604;&#1604;&#1602;&#1608;&#1575;&#1604;&#1576; &#1610;&#1615;&#1587;&#1578;&#1582;&#1583;&#1605; &#1604;&#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1604;&#1601;&#1617;&#1575;&#1578; &#1573;&#1593;&#1583;&#1575;&#1583; &#1580;&#1583;&#1610;&#1583;&#1577; &#1575;&#1593;&#1578;&#1605;&#1575;&#1583;&#1611;&#1575; &#1593;&#1604;&#1609; &#1575;&#1604;&#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1605;&#1580;&#1605;&#1617;&#1614;&#1593;&#1577; &#1608;&#1602;&#1575;&#1576;&#1604;&#1610;&#1617;&#1577; &#1573;&#1593;&#1575;&#1583;&#1577; &#1578;&#1581;&#1605;&#1610;&#1604; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1593;&#1606;&#1583; &#1578;&#1594;&#1610;&#1610;&#1585; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1616;&#1607;&#1575;.</p></li><li><p dir="rtl">vulcand: &#1610;&#1593;&#1605;&#1604; Vulcand &#1603;&#1605;&#1608;&#1586;&#1617;&#1616;&#1593; &#1581;&#1616;&#1605;&#1604; &#1576;&#1610;&#1606; &#1605;&#1580;&#1605;&#1608;&#1593;&#1575;&#1578; &#1605;&#1606; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1616;&#1585;. &#1610;&#1578;&#1593;&#1585;&#1617;&#1601; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1588;&#1585;&#1608;&#1593; &#1593;&#1604;&#1609; &#1571;&#1583;&#1575;&#1577; etcd &#1608;&#1610;&#1615;&#1605;&#1603;&#1606;&#1607; &#1575;&#1604;&#1593;&#1605;&#1604; &#1608;&#1601;&#1602;&#1611;&#1575; &#1604;&#1604;&#1578;&#1617;&#1594;&#1610;&#1585;&#1575;&#1578; &#1601;&#1610; &#1605;&#1582;&#1586;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;.</p></li><li><p dir="rtl">marathon: &#1608;&#1607;&#1608; &#1601;&#1610; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587; &#1605;&#1615;&#1580;&#1583;&#1608;&#1616;&#1604; Scheduler (&#1575;&#1604;&#1605;&#1602;&#1575;&#1604; &#1575;&#1604;&#1571;&#1582;&#1610;&#1585; &#1605;&#1606; &#1607;&#1584;&#1607; &#1575;&#1604;&#1587;&#1617;&#1604;&#1587;&#1604;&#1577; &#1610;&#1578;&#1606;&#1575;&#1608;&#1604; &#1575;&#1604;&#1605;&#1615;&#1580;&#1583;&#1608;&#1616;&#1604;&#1575;&#1578;)&#1548; &#1608;&#1604;&#1603;&#1606;&#1617;&#1607; &#1610;&#1615;&#1590;&#1605;&#1617;&#1606; &#1570;&#1604;&#1610;&#1617;&#1577; &#1576;&#1587;&#1610;&#1591;&#1577; &#1604;&#1573;&#1593;&#1575;&#1583;&#1577; &#1578;&#1581;&#1605;&#1610;&#1604; HAProxy &#1593;&#1606;&#1583; &#1575;&#1604;&#1578;&#1617;&#1594;&#1610;&#1610;&#1585; &#1593;&#1604;&#1609; &#1582;&#1583;&#1605;&#1575;&#1578; &#1610;&#1580;&#1576; &#1578;&#1608;&#1586;&#1610;&#1593; &#1575;&#1604;&#1581;&#1616;&#1605;&#1604; &#1576;&#1610;&#1606;&#1607;&#1575;.</p></li><li><p dir="rtl">frontrunner: &#1610;&#1615;&#1604;&#1581;&#1602; &#1576;marathon &#1604;&#1578;&#1602;&#1583;&#1610;&#1605; &#1570;&#1604;&#1610;&#1617;&#1577; &#1605;&#1578;&#1602;&#1583;&#1617;&#1605;&#1577; &#1604;&#1578;&#1581;&#1583;&#1610;&#1579; HAProxy.</p></li><li><p dir="rtl">synapse: &#1610;&#1615;&#1590;&#1605;&#1617;&#1616;&#1606; HAProxy &#1604;&#1578;&#1608;&#1580;&#1610;&#1607; &#1578;&#1583;&#1601;&#1617;&#1602; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1576;&#1610;&#1606; &#1605;&#1582;&#1578;&#1604;&#1601; &#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1575;&#1604;&#1578;&#1617;&#1591;&#1576;&#1610;&#1602;.</p></li><li><p dir="rtl">nerve: &#1610;&#1615;&#1587;&#1578;&#1582;&#1583;&#1614;&#1605; &#1576;&#1575;&#1604;&#1578;&#1617;&#1608;&#1575;&#1586;&#1610; &#1605;&#1593; synapse &#1604;&#1604;&#1578;&#1581;&#1602;&#1617;&#1602; &#1605;&#1606; &#1589;&#1604;&#1575;&#1581;&#1610;&#1617;&#1577; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1604;&#1603;&#1604; &#1608;&#1575;&#1581;&#1583; &#1605;&#1606; &#1606;&#1592;&#1575;&#1574;&#1585; &#1575;&#1604;&#1593;&#1615;&#1606;&#1589;&#1615;&#1585;. &#1593;&#1606;&#1583; &#1578;&#1608;&#1602;&#1617;&#1601; &#1571;&#1581;&#1583; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1593;&#1606; &#1575;&#1604;&#1593;&#1605;&#1604; &#1610;&#1615;&#1593;&#1604;&#1616;&#1605; nerve &#1571;&#1583;&#1575;&#1577; synapse &#1604;&#1571;&#1582;&#1584; &#1584;&#1604;&#1603; &#1576;&#1575;&#1604;&#1581;&#1587;&#1576;&#1575;&#1606;.</p></li></ul><h2 dir="rtl">&#1582;&#1575;&#1578;&#1605;&#1577;</h2><p dir="rtl">&#1610;&#1587;&#1605;&#1581; &#1575;&#1587;&#1578;&#1603;&#1588;&#1575;&#1601; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1608;&#1575;&#1604;&#1605;&#1582;&#1575;&#1586;&#1606; &#1575;&#1604;&#1593;&#1605;&#1608;&#1605;&#1610;&#1617;&#1577; &#1604;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1604;&#1581;&#1575;&#1608;&#1610;&#1617;&#1575;&#1578; Docker &#1576;&#1575;&#1604;&#1578;&#1603;&#1610;&#1617;&#1601; &#1605;&#1593; &#1575;&#1604;&#1576;&#1610;&#1574;&#1577; &#1575;&#1604;&#1605;&#1615;&#1581;&#1610;&#1591;&#1614;&#1577; &#1608;&#1578;&#1594;&#1610;&#1610;&#1585; &#1587;&#1604;&#1608;&#1603; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1616;&#1585; &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1601;&#1610;&#1607;&#1575;&#1548; &#1608;&#1607;&#1610; &#1605;&#1615;&#1578;&#1591;&#1604;&#1617;&#1614;&#1576;&#1575;&#1578; &#1571;&#1587;&#1575;&#1587;&#1610;&#1617;&#1577; &#1604;&#1578;&#1608;&#1601;&#1610;&#1585; &#1602;&#1575;&#1576;&#1604;&#1610;&#1617;&#1577; &#1575;&#1604;&#1578;&#1608;&#1587;&#1617;&#1593; &#1608;&#1575;&#1604;&#1575;&#1606;&#1578;&#1588;&#1575;&#1585; &#1576;&#1587;&#1607;&#1608;&#1604;&#1577; &#1608;&#1583;&#1608;&#1606; &#1578;&#1583;&#1582;&#1617;&#1604; &#1610;&#1583;&#1610;&#1608;&#1610;.</p><p dir="rtl">&nbsp;</p><p dir="rtl">&#1578;&#1585;&#1580;&#1605;&#1577; -&#1608;&#1576;&#1578;&#1589;&#1585;&#1617;&#1601;- &#1604;&#1604;&#1605;&#1602;&#1575;&#1604;&nbsp;<a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-service-discovery-and-distributed-configuration-stores">The Docker Ecosystem: Service Discovery and Distributed Configuration Stores</a></p>
]]></description><guid isPermaLink="false">26</guid><pubDate>Wed, 08 Apr 2015 11:42:00 +0000</pubDate></item><item><title>&#x646;&#x638;&#x631;&#x629; &#x639;&#x627;&#x645;&#x651;&#x629; &#x639;&#x644;&#x649; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x627;&#x644;&#x62D;&#x627;&#x648;&#x64A;&#x651;&#x627;&#x62A; containerization &#x639;&#x644;&#x649; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D8%A7%D9%85%D9%91%D8%A9-%D8%B9%D9%84%D9%89-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%AD%D8%A7%D9%88%D9%8A%D9%91%D8%A7%D8%AA-containerization-%D8%B9%D9%84%D9%89-docker-r23/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/containers_480x300.png.69e4d77acb0ddb1a1dc2c30c6561d20f.png" /></p>

<h2 dir="rtl">مقدِّمة</h2><p dir="rtl">توجد دائمًا العديدُ من العوائق التي تقِف في طريقك أثناء الانتقال بين مختلف مراحل دورة التّطوير حتى الوصول إلى مرحلة الإنتاج. فإضافة إلى التّأكّد من سلامة عمل التّطبيق في بيئات مختلفة، فقد تُواجهك مشاكلَ مع تتبّع الاعتماديّات Dependencies، التوسّع Scaling، وتحديث كل واحد من العناصر المكوِّنة للتّطبيق دون أن يُؤثِّر ذلك على التطبيق ككلّ.</p><p dir="rtl">يُحاول Docker التغلّب على العديد من هذه المشاكل عن طريق الحاويّات Containers وأسلوب التّصميم خَدَميّ التّوجّه Service-oriented الّذي يعتمده. تُقسَّم التّطبيقات إلى عناصِر وظيفيّة، تُحَزَّم منفردةً مع كامل اعتماديّاتها، يُمكن إدارتُها ونشرُها بسهولة على مِعماريّات Architectures مُتباينة. تمنح هذه الطّريقة أيضًا سهولةً أكبر أثناء التّوسّع أو التّحديث.</p><p dir="rtl">نستعرِض في هذا المقال فوائدَ استخدام الحاويّات، وكيفَ يُساعد Docker في حلّ بعض المشاكل المذكورة أعلاه. Docker هو العنصر المركزي في النّشر المُوزَّع للحاويّات، حيثُ يوفِّر سهولةً في الإدارة وقابليةً للتّوسّع.</p><h2 dir="rtl">تاريخ مُختصَر لإعداد الحاويّات على Linux</h2><p dir="rtl">تدعمُ بعض أنظمة التّشغيل الشّبيهة بيونيكس Unix-like OS تقنيّات إعداد الحاويّات منذُ أكثر من عقد من الزّمن، فمفهومَا الحاويّة Container والعزل Isolation ليسَا جديديْن في عالم الحواسيب. على سبيل المثال، أُضيفَت بيئة LXC، التّي شكّلت قاعدةً لتقنيات تاليّة في إعداد الحاويّات، إلى النّواة Kernel في العام 2008. مَزَجت LXC بين استخدام مجموعات التّحكم Control groups (تسمح بعزل وتتبّع استخدام موارد الجهاز، يُشار إليها بـ cgroups اختصارًا) الموجودة في النّواة وفضاءات الأسماء Namespaces (عزل المجموعات بحيثُ لا تشعُر كل مجموعة بوجود أخرى) لإجراء عمليّة عزل بسيطة.</p><p dir="rtl">قُدِّم Docker في ما بعد بوصفه طريقةً لتبسيط الأدوات المطلوبة لإنشاء وإدارة الحاويّات، فاستخدَم أوّلًا LXC كتعريف Driver للتّنفيذ، قبل أن ينتقل إلى استخدام مكتبة Library تُدعَى libcontainer أُعدَّت خصّيصًا لهذا الغرض. لم يُضِف Docker العديد من الأفكار غير الموجودة أصلًا، إلّا أنّه جعل إنجازَ هذه الأفكار متاحًا لشريحة أكبر من المُطوِّرين ومديري الأنظمة عن طريق تبسيط العمليّة وتوحيدها عبر نفس الواجهة وهوّ ما أدّى إلى تحفيز الاهتمام بإعداد الحاويّات على Linux بين المطوِّرين.</p><p dir="rtl">تجدُر الإشارة إلى أنّه رغم تركيزنا هنا على حاويّات Docker التّي أوصلتْها شعبيّتُها المتناميّة إلى مرتبة المعيار Standard، إلّا أنّ بعضَ ما سنذكُره ينطبِق على الحاويّات بشكل عامّ.</p><h2 dir="rtl">ما الّذي تُضيفه الحاويّات؟</h2><p dir="rtl">تأتي الحاويّات بالعديد من الفوائد الّتي تجذِب إليها كلًّا من المطوِّرين، مديري الأنظِمة، وفِرق العمليّات. في ما يلي بعضٌ من هذه الفوائد.</p><h3 dir="rtl">1- عزل نظام التّشغيل المُستضيف عن التّطبيق الموجود في الحاويّة</h3><p dir="rtl">تهدِف الحاويّات إلى أن تكون معياريّةً بالكامل؛ يعني هذا أنّ الحاويّة تتّصل بالمستضيف وبكل ما يوجد خارج الحاويّة عن طريق واجهات مُعرَّفة. يجب ألّا ينشغل تطبيقٌ يعمل عبر حاويّة بمعرفة تفاصيل موارد المُستضيف أو معماريّته. يُسهِّل هذا الأمر من افتراضات المطوِّر عن بيئة عمل التّطبيق. بالمثل، يتعامل المُستضيف مع كلّ حاويّة على أنّها صندوق أسود؛ فلا يهتمّ بتفاصيل التّطبيق الموجود بداخلها.</p><h3 dir="rtl">2- سهولة التّوسّع</h3><p dir="rtl">وهوّ أحد فوائد عزل المُستضيف عن التّطبيق. يُصبِح التوسّع سهلًا للغاية عند استخدام أسلوب تصميم جيّد أثناء تطوير التّطبيق. يُشكّل التّصميم خدميّ-التّوجّه (سنناقشه لاحقًا) عند دمجه بإعداد الحاويّات؛ اللّبنة الأساسيّة لسهولة التّوسّع . يُمكن -مثلًا - لنظام مُكوَّن من عدّة حاويّات أنشأه مطوّر على حاسوبه الشّخصي أن يتوسَّع أفقيًّا ضمن منطقة الإدراج Staging أو الاختبار Testing، وعند نقل الحاويّات إلى بيئة الإنتاج يستمرّ في التّوسّع مجدّدًا.</p><p dir="rtl"><strong>ملحوظة</strong>: المقصود بالتّوسّع الأفقي Horizontal scaling هو استعمال عدّة خواديم وتشغليها بحيث تظهر وكأنّها خادوم واحد، أما التّوسّع العمودي Vertical scaling فيُقصَد به إضافة موارد جديدة لنفس الجهاز (زيادة حجم ذاكرة الوصول العشوائي RAM على سبيل المثال). لا يحتاج التّوسّع الأفقي في الغالب لإعادة تشغيل الجهاز أو الخادوم.</p><h3 dir="rtl">3- إدارة سهلة لاعتماديّات وإصدارات التّطبيق</h3><p dir="rtl">تُمكِّن الحاويّات المُبرمجين من تجميع تطبيق - أو عنصُر منه - مع كامل اعتماديّاته والتّعامل معه كوحدة مستقلّة. لا يهتمّ النّظام المُستضيف بالاعتماديّات الخاصّة بتطبيق معيَّن، فكل المطلوب منه هوّ أن تكون لديه القدرة على تشغيل حاويّات Docker. تجعل هذه الطّريقة من إدارة الاعتماديّات أمرًا سهلًا؛ كما أنّها تُسهّل من إدارة إصدارات البرنامج Versions، فالأنظمة المُستضيفة وفرق العمليّات ليست مسؤولة عن إدارة الاعتماديّات المطلوبة من طرف التّطبيق، فكل ما يحتاجه التّطبيق - إذا استثنينا علاقته بالحاويّات الأخرى - موجود داخل الحاويّة.</p><h3 dir="rtl">4- بيئات تنفيذ Execution معزولة وخفيفة جدَّا</h3><p dir="rtl">على الرّغم من أن الحاويّات لا توفّر نفس المستوى من العزل الّذي توفّره الحوسبة التّخيّلية Virtualization إلّا أنّها تفضُلُها من ناحية خفّة بيئة التّنفيذ. تُعزَل الحاويّات على مستوى العمليّات Process Level وتشترك في نواة المُستضيف. يعني هذا أنّ الحاويّة لا تتضّمّن نظامَ تشغيل كاملًا وهو ما يؤدّي إلى بدْء تشغيل يكاد يكون لحظيًا.</p><p dir="rtl">يُمكن للمطوّرين تشغيل مئات الحاويّات على حواسيبهم الشّخصيّة دون أيّة مشاكل.</p><h3 dir="rtl">5- طبقات مُشتركة Shared layering</h3><p dir="rtl">جانب آخر تتجلّى فيه خفة الحاويّات هو تقاسمُها لنفس الطّبقات الأساسيّة. يعني اشتراكُ عدّة حاويّات في نفس الطّبقة، الحدَّ من الاستنساخ/التّضاعف Duplication؛ أي استخدامًا أقلّ لمساحة القرص الصّلب والموارِد بشكل عامّ عند إنشاء حاويّات جديدة.</p><h3 dir="rtl">6- قابليّة التّجميع والتّنبّؤ Composability and Predictability</h3><p dir="rtl">تُعرِّف ملفّات Docker بالضّبط الإجراءاتِ المطلوبةَ لإنشاء صورة جديدة من حاويّة، وهو ما يُمكِّن من كتابة بيئة التّنفيذ كما لو كنتَ تكتب أسطُرًا برمجية وحفظها عن طريق نظام لإدارة الإصدارات Version Control System (أو VSC اختصارًا) إذا رغبتَ في ذلك. يُنتِج نفس ملف Docker عند إنشائه في نفس البيئة، يُنتِج دائمًا صورةً لنفس الحاويّة.</p><h3 dir="rtl">استخدام ملفّات Dockerfiles لعمليّات البناء المُتكرّرة المُتماثِلة</h3><p dir="rtl">يُمكن بناء صوّر Images من حاويّات Docker بطريقة تفاعليّة ولكن من الأفضل غالبًا وضع خطوات الإعداد بعد الانتهاء من تحديدها في ملف Dockerfiles. ملفّات Dockerfiles هيّ ملفّات بناء بسيطة تُعرِّف آليةَ بناء حاويّة انطلاقًا من نقطة بدْء معروفة. استخدام هذه الملفّات بسيطٌ جدًّا ولديها العديد من الفوائد، نذكر منها:</p><ul><li><p dir="rtl">سهولة إدارة الإصدارات: يُمكِن حفظ ملفّات Dockerfiles ضمن برنامج لإدارة الإصدارات لتتبّع التّغييرات والتّراجع عن أي أخطاء عند اكتشافها.</p></li><li><p dir="rtl">قابليّة التّنبّؤ: بناء الحاويّات انطلاقًا من ملفات Dockerfiles يُساعِد في التّقليل من الأخطاء البشريّة أثناء عمليّة إنشاء الحاويّات.</p></li><li><p dir="rtl">قابليّة المُحاسبة Accountability: من الجيّد عند التّخطيط لمشاركة صوّر الحاويّات، توفيرُ ملف Dockerfile المُستخدَم لإنشاء الحاويّة لاستخدامه كوسيلة للتّدقيق في عمليّة البناء، حيثُ يُمكن النّظر إليه باعتباره سجِلًّا للأوامر التي نُفِّذَت لإنشاء الحاويّة.</p></li><li><p dir="rtl">المرونة Flexibility: يسمح إنشاءُ حاويّات انطلاقًا من ملفّات Dockerfiles بتجاوز الخيّارات الافتراضيّة المُعطاة في عمليّات البناء التّفاعليّة. يعني هذا أنّك عند استخدام Dockerfiles لن تحتاج لتغيير كل الإعدادت الافتراضيّة الّتي لا تُناسِب احتيّاجاتِك.</p></li></ul><p dir="rtl">من هذا المُنطَلَق فإن ملفّات Dockerfiles أداة رائعة لأتمتة Automate إنشاء الحاويّات والتّأسيس للعمليّات المتكرّرة.</p><h2 dir="rtl">بُنية التّطبيقات الّتي تعمل عبر الحاويّات</h2><p dir="rtl">بُنية التّطبيق هيّ أحد أهم المشاغِل الّتي يجب أخذها بالاعتبار عند تصميم تطبيقات مُعدّة للنّشر عبر حاويّات.عمومًا، تعمل الّطبيقات المنشورة عبر حاويّات بشكل أفضل عند تنفيذ تصميم خَدَمي التّوجّه.</p><p dir="rtl">تُقسِّم التّطبيقات الّتي تتبع تصميمًا خَدَمي التّوجّه وظيفتَها بين عدّة عناصر متمايِزة تتواصَل في ما بينها عبر واجهات مُعرَّفة جيّدًا. تُشجّع تقنيّة الحاويّات بذاتها هذا النّوع من التّصميم إذ أنّه يسمح لكلّ عنصُر بالتّوسّع والتّرقية بشكل منفصل عن بقيّة العناصِر.</p><p dir="rtl">يجب أن تتوفّر الخصائص التّاليّة في التّطبيقات الّتي تتبع طريقة التّصميم خَدَمي التّوجّه:</p><ul><li><p dir="rtl">لا تعتمد على أي وظيفة خاصّة بنظام تشغيل مُستضيف مُحدّد.</p></li><li><p dir="rtl">يُوفّر كل عنصُر واجهة تطبيقات برمجيّة <abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface">API</abbr></abbr> مُتجانِسة يُمكن للزّبائن عبرها الاتّصال بالخدمة.</p></li><li><p dir="rtl">يجب أن تأخذ الخدمةُ متغيّراتِ البيئة Environmental variables الّتي تعمل بها أثناء الإعداد الابتدائي.</p></li><li><p dir="rtl">يجب أن تُحفَظ بيانات التّطبيق خارج الحاويّة في تجزئات مُرَكَّبة Mounted volumes على النّظام أو في حاويّات خاصّة بالبيانات.</p></li></ul><p dir="rtl">تُمكِّن هذه الإستراتيجيّات من استبدال أي عنصُر أو تحديثه بشكلٍ مستقل شرطَ الحفاظ على واجهته البرمجيّة، كما أنّها تُساعد في التّركيز على التّوسّع الأفقي حيثُ يُوَّسَّع العنصُر الذي يُعرقل أداء التّطبيق (نقطة ضعف).يُمكن لكل عنصر تعريفُ قيّم افتراضيّة يُمكن الإقلاع باستخدامها في فترة معقولة، بدلًا من برمجة قيّم خاصّة مباشرَةً في التّطبيق. يُمكن للعنصُر استخدامُ هذه القيّم في الحالات الطّارئة مع تفضيل قيّم يُمكن الحصول عليها عن طريق بيئة العمل. يُتَحصَّل على قيّم من بيئة العمل عادةً عن طريق أدوات مُساعدة على استكشاف الخدمة، يستطيع العُنصر إرسال استعلامات إليها أثناء بدْء التّشغيل.</p><p dir="rtl">يُسهِّل إخراج بيانات الإعداد من الحاويّة ووضعُها في بيئة العمل من إجراء تعديلات على سلوك التّطبيق دون الحاجة لإعادة بناء الحاويّة، إضافةً إلى إمكانيّة التّأثير على نماذج عدّة من نفس العُنصُر عن طريق إعداد واحد.</p><p dir="rtl">على العموم فإنّ أسلوب التّصميم خَدَمي التّوجّه يندمج جيّدًا مع إستراتيجيّات الإعداد عن طريق بيئة العمل، فكلّ منهما يسمح بعمليّات نشر مرنة وتوسّع أكثر مباشرة.</p><h2 dir="rtl">استخدام سجلّ Docker Registry لإدارة الحاويّات</h2><p dir="rtl">تحدّثنا عن الخطوة الأولى المُتمثِّلة في تقسيم التّطبيق إلى عناصر وظيفية مُعدَّة للتّواصل بشكل صحيح مع بقيّة الحاويات وقيّم الإعداد الموجودة في بيئة العمل. نأتي الآن للخطوة الثّانية وهي جعل صوّر الحاويّات مُتاحة عبر سجل. رفع صوّر الحاويّات إلى سجل يُعطي مستضيفات Docker إمكانيّة تنزيل هذه الصوّر بمجرَّد معرفة أسمائها ثم إنشاء حاويّات مُماثلة لها بعد ذلك (نظائر Instances).</p><p dir="rtl">توجد العديد من سجلّات Docker متوفّرة لهذا الغرض؛ بعضُها عمومي يُمكن للجميع عرض واستخدام الصّوّر الموجودة فيها، والآخر خاص. يُمكن أيضًا إضافة وسوم Tags لتسهيل الوصول إلى وتحديث الحاويّات.</p><h2 dir="rtl">خاتمة</h2><p dir="rtl">يضع Docker القواعدَ الأساسيّة اللّازمة للنّشر الموزَّع للحاويّات. يجعل عزل عناصر التّطبيق في حاويّات خاصّة بها من التّوسّع الأفقي عمليّةً سهلة تقتصِر على إطلاق نظائر جديدة لنفس العُنصُر أو إيقاف أخرى. يُوفِّر Docker الأدوات المطلوبة ليس فقط لبناء حاويّات بل أيضًا لإدارتها وتشاركها مع مستخدمين أو مُستضيفين جُدُد.</p><p dir="rtl">في المقال التّالي من <a href="https://academy.hsoub.com/search/?tags=docker+ecosystem">هذه السّلسلة</a> سنتطرّق للكيفيّة الّتي تُساهِم بها استكشاف الخدمة ومخازن الإعداد المُوزَّعة عمومًا في نشر الحاويّات عبر عنقود من المُستضيفات.</p><p dir="rtl"> </p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-an-overview-of-containerization">The Docker Ecosystem: An Overview of Containerization</a></p>
]]></description><guid isPermaLink="false">23</guid><pubDate>Wed, 01 Apr 2015 12:46:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x651;&#x645;&#x629; &#x639;&#x646; &#x627;&#x644;&#x645;&#x64F;&#x643;&#x648;&#x651;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x64F;&#x634;&#x62A;&#x631;&#x64E;&#x643;&#x629; &#x641;&#x64A; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%B9%D9%86-%D8%A7%D9%84%D9%85%D9%8F%D9%83%D9%88%D9%91%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%8F%D8%B4%D8%AA%D8%B1%D9%8E%D9%83%D8%A9-%D9%81%D9%8A-docker-r21/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/docker_480x300.png.9b59ec0f0666d0605564fb2073c72ca9.png" /></p>

<p dir="rtl">وفّر Docker للعديد من المُطوّرين ومُدراء الأنظمة منصّة سهلة تسمح لهم ببناء ونشر تطبيقات قابلة للتّوسّع. سنستعرض في هذه السلسلة (<a href="http://academy.hsoub.com/search/?tags=docker+ecosystem">Docker Ecosystem</a>)  كيف يوفّر Docker والمُكوّنات التّي صُمّمت للتكامل معه الأدوات اللازمة لتوفير تطبيقات مُوزّعة عالية التّوفر</p><h2 dir="rtl">1- مقدّمة</h2><p dir="rtl">يُطلَق مصطلح إعداد الحاويات Containerization على نشر وتوزيع التّطبيقات بشكل محمول ويُمكن التنبؤ به predictable. نلجأ - للحصول على هيئة النّشر والتّوزيع المذكورة آنِفًا - إلى تحزيم العناصِر واعتماديّاتِها في بيئة عمليّات قيّاسيّة، معزولة وخفيفة تُسمَّى حاويّة Container.</p><p dir="rtl">تهتمّ الكثير من المنظَّمات الآن بتصميم تطبيقات وخدمات يسهُل توزيعها ونشرُها عبر نُظُم موّزَّعَة ممّا يُمكِّن من التّوسّع Scale بسهولة والتّغلّب على إخفاق التّطبيقات والأجهزة أثناء العمل. حفَّز Docker -الّذي هو منصّة لإعداد الحاويّات أُعِدَّ لتبسيط وتوحيد معايير النّشر في بيئات مختلفة- تبنّي هذا الأسلوب في تصميم وإدارة الخدمات؛ إذ أنّ الكثير من البرامج أُنشِئت لتتّخد من هذا الأسلوب في الإدارة المُوَزَّعة للحاويّات، قاعدةً تُبنى عليها.</p><h2 dir="rtl">2- إعداد حاويّات Docker</h2><p dir="rtl">على الرّغم من وجود أنظمة أخرى لإعداد الحاويّات إلا أنّ Docker هو الأكثر استخداما هذه الأيّام نظرًا للبساطة الّتي يوفّرها في إنشاء وإدارة الحاويّات إضافةً إلى سهولة إدماجه في عدد من المشاريع مفتوحة المصدر.</p><p dir="rtl" style="text-align:center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/01_%D8%A7%D9%84%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA_%D9%86%D8%B8%D8%B1%D8%A9_%D8%B9%D8%A7%D9%85%D8%A9.png.40ef6fd56d94115fe614cc067f6311f1.png"><img data-fileid="866" class="ipsImage ipsImage_thumbnailed" alt="01_الحاويات_نظرة_عامة.th" src="https://academy.hsoub.com/uploads/monthly_2015_03/01_%D8%A7%D9%84%D8%AD%D8%A7%D9%88%D9%8A%D8%A7%D8%AA_%D9%86%D8%B8%D8%B1%D8%A9_%D8%B9%D8%A7%D9%85%D8%A9.thumb.png.632d3b74cb473a42494f3fcd0ab0d29c.png"></a></p><p dir="rtl">يُمكن، في الصّورة السّابقة، رؤية كيف ترتبط الحاويّات مع نظام التّشغيل المُستضيف (عَرض مُبسَّط). تعزِل الحاويّات كلّ تطبيق على حِدة مع استغلال موارد نظام التّشغيل الّتي يعمل Docker على تقديمها بطريقة مُجرّدة Abstracted (لا تظهر التّعقيداتُ المُصاحِبة لهذه الموارد للتّطبيقات، حيثُ يتولّى Docker التعاملَ معها). نرى في الجانب الأيمن أنّه يُمكن بناء الحاويّات اعتمادًا على طبقات Layers؛ بحيثُ تشترك عدّة حاويّات في الطّبقات الموجودة في الأساس وبالتّالي التّقليل من استخدام الموارد.</p><p dir="rtl">المزايا الأساسيّة لـ Docker هيّ:</p><ul><li><p dir="rtl">التّخفيف من استخدام الموارد: تعمل الحاويّات على مستوى الـ Process وتستخدم نواة Kernel نظام التّشغيل المُستضيف ، بدلًا من الحوسبة التّخيّليّة Virtualization لكل نظام التّشغيل.</p></li><li><p dir="rtl">قابليّة النّقل Portability: تُضَمَّن كلّ اعتماديّات التّطبيق داخل الحاويّة ممّا يسمح بتشغيل التّطبيق على أي مستضيف يعمل عليه Docker.</p></li><li><p dir="rtl">إمكانية التّنبؤ Predictability: لا يهتمّ النّظام المُستضيف بما يجري داخل الحاويّة، كما أنّ الحاويّة لا تهتمّ بماهيّة نظام التّشغيل الذّي تعمل عليه، فالواجهات Interfaces معياريّة ويُمكن التّنبّؤ بالتّفاعلات بين العناصِر.</p></li></ul><p dir="rtl">من الأفضل، عند تصميم تطبيق يستخدم Docker، تقسيمُ وظائفه بين عدّة حاويّات. تُسمّى هذه الطّريقة ببُنية خَدَميّة التّوجّه Service-oriented architecture. يمنح هذا التّصميم سهولةً عند التّوسّع أو أثناء تحديث العناصِر المكوّنة للتّطبيق في المستقبل، كلٌّ على حِدَة. يُنظَر لهذه المرونة على أنّها أحد أهم أسباب اللّجوء إلى Docker للتّطوير والنّشر.</p><h2 dir="rtl">3- استكشاف الخدمة Service discovery ومخازن الإعداد العامّة Global Configuration Stores</h2><p dir="rtl">استكشاف الخدمة هو أحد عناصرِ إستراتيجيّةٍ شاملة تهدِف إلى جعل نشر الحاويّات مرِنًا وقابِلًا للتّوسّع. يُمكِن للحاويّات عبر استكشاف الخدمة العثورُ على معلومات عن بيئةٍ مّا، دون الحاجة للتّدخّل البشري. يُمكِن للحاويّات مثلًا العثورُ على معلومات الاتّصال بالعناصر الّتي يجب عليها الاتّصال بها، كما يُمكنها تسجيل أنفسها لتعرف بقيّةُ الأدوات أنها مُتاحة. تعمل هذه الأدوات عادةً على شكل مخازن إعدادات عامّة موزَّعة، يُمكِن عبرها ضبطُ خيارات إعدادٍ للخدمات العامِلة ضمن البنية التّحتيّة التّي تشغِّلها.</p><p dir="rtl" style="text-align:center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/02_%D8%B9%D9%85%D9%84_%D8%AE%D8%AF%D9%85%D8%A9_%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81.png.d7b4142cc2806ba948e0844c33a6f2f2.png"><img data-fileid="867" class="ipsImage ipsImage_thumbnailed" alt="02_عمل_خدمة_الاستكشاف.th" src="https://academy.hsoub.com/uploads/monthly_2015_03/02_%D8%B9%D9%85%D9%84_%D8%AE%D8%AF%D9%85%D8%A9_%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81.thumb.png.09aa4b5bb8a63d9d4db04ad938d21018.png"></a></p><p dir="rtl">يوجد في الصّورة أعلاه مثال لتطبيق يُسجِّل معلومات الاتّصال به عن طريق نظام استكشاف الخدمة، ممّا يُتيح لبقيّة التّطبيقات إمكانيةَ إرسال استعلامات إلى خدمة الاستكشاف للعثور على طريقة الاتّصال بالتّطبيق المذكور.</p><p dir="rtl">تُنجَز هذه الأدوات عادةً على شكل مخازن ذات صيغة مفتاح-قيمة Key-value (جدول من عموديْن، في الأوّل يوجد مفتاح وفي الثّاني قيمة لهذا المفتاح) موّزعة بين عدّة مستضيفات ضمن بيئة عنقوديّة Clustered. تُوفِّر المخازن المذكورة واجهةَ تطبيقات برمجيّة Application programming interface, <abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface">API</abbr></abbr></abbr> يُتوَصَّل إليها عبر ابروتوكول HTTP لقراءة وضبط القِيّم. تُضيف بعض المخازن إجراءاتٍ أمنيةً مثل تعميّة (تشفير) Encryption المُدخَلات وآليّات التّحكّم في الوصول Access control. المخازن المُوَزَّعة أساسيّة لإدارة عنقود من مستضيفات Docker زيادةً على وظيفتها الأولى التّي هيّ توفير تفاصيل الإعداد الذّاتي للحاويّات الجديدة.</p><p dir="rtl">في ما يلي بعض مسؤوليّات مخازن استكشاف الخدمة:</p><ul><li><p dir="rtl">السّماح للتّطبيقات بالحصول على البيانات المطلوبة للاتّصال بالخدمات التّي تعتمد عليها.</p></li><li><p dir="rtl">السّماح للتّطبيقات بتسجيل بيانات الاتّصال بها، وهو ما يُمكّن من القيام بالمسؤوليّة السّابقة.</p></li><li><p dir="rtl">توفير مساحةٍ يُمكن للجميع الوصولُ إليها لتخزين بيانات ضبط الإعدادات.</p></li><li><p dir="rtl">تخزين معلومات الأعضاء في العنقود حسب حاجة برنامج إدارة العنقود.</p></li></ul><p dir="rtl">في ما يلي أدوات شهيرة لاستكشاف الخدمة مع بعض المشروعات المتعلِّقة بها:</p><ul><li><p dir="rtl">etcd: استكشاف الخدمة. مخزن مُوزَّع يستخدم صيغة مفتاح-قيمة.</p></li><li><p dir="rtl">consul: استكشاف الخدمة. مخزن مُوزَّع يستخدم صيغة مفتاح-قيمة.</p></li><li><p dir="rtl">zookeeper: استكشاف الخدمة. مخزن مُوزَّع يستخدم صيغة مفتاح-قيمة.</p></li><li><p dir="rtl">crypt: مشروع لتعميّة المُدخلات في أداة etcd.</p></li><li><p dir="rtl">confd: تُراقِب مخازن تستخدم صيغة مفتاح-قيمة بحثًا عن تغييرات ثم تعمَد إلى إعداد الخدمات بالقيّم الجديدة.</p></li></ul><h2 dir="rtl">4- أدوات التّشبيك Networking</h2><p dir="rtl">تستجيب التّطبيقات التّي تعمل ضمن حاويّات إلى تصميم خَدَميّ التوجّه يُشجّع على تقسيم الوظائف بين عدّة عناصِر أقلَّ تعقيدًا. يُتيح هذا الأسلوب في التّصميم سهولةً في الإدارة والتّوسّع، ولكنّه يتطلّب تأمينًا وثباتًا أكثر في تشبيك مختلف العناصر مع بعضها. يُوفِّر Docker في هذا الإطار البُنية الأساسيّة لتأمين التّواصل بين الحاويّات Container-to-container وبين الحاويّات والمُستضيف Container-to-host.</p><p dir="rtl">يُتيح Docker افتراضيًا آليّتيْن لربط الحاويّات معًا. الأولى هي عرض منافذ Ports الحاويّة، عبر النظام المُستضيف للتوجيه Routing إلى الخارج، وذلك بشكل اختياري. يُمكِن تعيين منفذ من الحاويّة إلى منفذ في النّظام المُستضيف أو السّماح لDocker باختيّار منفذ عالٍ (منفذ ذو رقم أعلى) غير مُستخدَم. هذه طريقة عامّة تعمل في أغلب الحالات لتوفير الولوج إلى الحاويّة.</p><p dir="rtl">الطّريقة الثّانيّة هيّ السّماح للحاويّات بالتّواصل عن طريق "روابط" Docker. تحصُل الحاويّات في هذه الحالة على معلومات عن الحاويّة الموجودة على الطّرف الآخر من الرابط؛ ممّا يسمح لها بالاتصال مباشرة إذا كانت مضبوطة للإنصات لمعلومات الطّرف الآخر. تُتاح عبر هذه الطّريقة إمكانيّةُ الاتّصال بين حاويّات موجودة على نفس المُستضيف دون الحاجة لمعرفة منفَذ أو عنوان الخدمة سَلفًا.</p><p dir="rtl">تُناسِب البُنيةُ الأساسيّة للتّشبيك التي يوفّرها Docker المستضيفات المنفردة أو البيئات المُدارَة بشكل مُباشر. غير أنّ النِّظام البيئي لـDocker أنتجَ مشاريع عديدة تُرَكِّز على زيادة وظائف التّشبيك لصالح المُتعاملين والمُطوِّرين. يُمكن الحصول عبر الأدوات الإضافيّة، من بين أمور أخرى، على:</p><ul><li><p dir="rtl">تعديل آلية التّشبيك لإنشاء فضاء عناوين سهل ومُوحَّد بين عدّة مستضيفات.</p></li><li><p dir="rtl">شبكات افتراضيّة خاصّة Virtual private networks لتأمين الاتّصالات بين مختلف المُكوِّنات.</p></li><li><p dir="rtl">تعيين شبكات فرعيّة Sub networks حسب المُستضيف أو حسب التّطبيق.</p></li><li><p dir="rtl">التّأسيس لواجهات اتّصال عبر شبكات محليّة افتراضيّة من النّوع الثّاني (VLAN 2/Macvlan).</p></li><li><p dir="rtl">إعداد وتخصيص عناوين MAC وبوّابات Gateways، ..إلخ للحاويّات.</p></li></ul><p dir="rtl">المشاريع التّالية تعمَل على التّحسين من إدارة الشّبكات في Docker:</p><ul><li><p dir="rtl">flannel: إضافة طبقة فوقَ آليّة التّشبيك للحصول على شبكات فرعيّة مستقلَّة لكل مُستضيف.</p></li><li><p dir="rtl">weave: جعل كل الحاويّات ضمن نفس الشّبكة عبر إعادة تمثيل بنية التّشبيك.</p></li><li><p dir="rtl">pipework: مجموعة أدوات للإعداد المتقدِّم للشّبكات.</p></li></ul><h2 dir="rtl">5- الجدولة Scheduling، إدارة العنقود والتّنسيق Orchestration</h2><p dir="rtl">المُجدوِل Scheduler هوالآخر عنصر مطلوب لبناء بيئة عنقوديّة للحاويّات. تتولّى المُجدوِلات بدْء تشغيل الحاويّات على المُستضيفات المُتاحة.</p><p dir="rtl" style="text-align:center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/03_%D9%85%D8%AB%D8%A7%D9%84_%D9%84%D8%AC%D8%AF%D9%88%D9%84%D8%A9_%D8%AA%D8%B7%D8%A8%D9%8A%D9%82.png.bf43dc72f93053f9e8db8a0e06c863db.png"><img data-fileid="868" class="ipsImage ipsImage_thumbnailed" alt="03_مثال_لجدولة_تطبيق.thum" src="https://academy.hsoub.com/uploads/monthly_2015_03/03_%D9%85%D8%AB%D8%A7%D9%84_%D9%84%D8%AC%D8%AF%D9%88%D9%84%D8%A9_%D8%AA%D8%B7%D8%A8%D9%8A%D9%82.thumb.png.54bae117ef12573b58c3325de91bf4e3.png"></a></p><p dir="rtl">تُوضِّح الصورة أعلاه نموذجًا مبسَّطًا لاتخاذ قرار الجدولة. يأتي الطّلب للمُجدوِل عبر واجهة تطبيقات برمجية <abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface"><abbr title="واجهة برمجية | Application Programming Interface">API</abbr></abbr></abbr> أو عن طريق أداة إدارة؛ يُقدِّر المُجدوِل بعدها شروط الطّلب وحالة المُستضيفات المُتاحة. يسحب المُجدوِل في المثال معلومات عن كثافة وتمركز الحاويات من مخزن مُوزَّع للبيانات واستكشاف الخدمة (كما تطرَّقنا له سابقًا)، ممّا يُمكّنه من اختيار المُستضيف الأقل انشغالًا للتّطبيق الجديد.</p><p dir="rtl">تقع عمليّة اختيار المُستضيف في قلب مهام المُجدوِل، وتوجد لديه عادةً دوّال Functions لأتمَمة Automate هذه العمليّة مع ترك خيّار يُمكّن المُدير من تحديد بعض القيود. من الأمثلة على هذه القيود:</p><ul><li><p dir="rtl">جدولة الحاويّة للعمل على نفس المُستضيف الذي تعمل عليه حاويّة أخرى مُعطاة.</p></li><li><p dir="rtl">التّأكّد من عدم وضع حاويّة على مُستضيف تعمل عليه حاويّة أخرى مُعطاة.</p></li><li><p dir="rtl">وضع حاويّة على مُستضيف يتطابق مع بيانات وصفيّة Metadata أو علامة مُعطاة.</p></li><li><p dir="rtl">وضع الحاويّة على المُستضيف الأقل نشاطًا.</p></li><li><p dir="rtl">تشغيل الحاويّة على جميع المُستضيفات المُكوِّنة للعنقود.</p></li></ul><p dir="rtl">يهتم المُجدوِل بتحميل الحاويّات إلى المستضيفات المناسِبة إضافةً إلى بدْء تشغيلها، إيقافها وإدارة دورة حياة العمليّة ككلّ. تُضمَّن عادةً وظائفُ إدارة العنقود إلى المُجدوِل نظرًا لضرورة تفاعله مع كل مستضيف من المجموعة المكوِّنة للعنقود، وهو ما يُعطي للمُجدوِل القدرةَ على الحصول على معلومات عن مكوّنات العنقود والقدرة على إجراء مهام إداريّة. يُشير التّنسيق في هذا الإطار إلى المُزاوجة بين جدولة الحاويّات وإدارة المُستضيفات.</p><p dir="rtl">المشاريع التالية من الأشهر في تقديم أدواتٍ للجدولة والإدارة:</p><ul><li><p dir="rtl">fleet: أداة للجدولة وإدارة العناقيد.</p></li><li><p dir="rtl">marathon: مُجدوِل ومُدير خدمات.</p></li><li><p dir="rtl">Swarm: مُجدوِل ومُدير خدمات.</p></li><li><p dir="rtl">mesos: خدمة لإسناد وتوطيد موارد المُستضيف لاستغلالها من طرف المُجدوِل.</p></li><li><p dir="rtl">kubernetes: مُجدوِل متقدِّم يستطيع إدارة الحاويّات على شكل مجموعات.</p></li><li><p dir="rtl">compose: أداة تنسيق لإنشاء مجموعات حاويّات.</p></li></ul><h2 dir="rtl">خاتمة</h2><p dir="rtl">يُقدّم Docker عبر المشاريع الدّاعمة له أدواتٍ لإدارة البرامج، التصميم، وإستراتيجيةً للنشر تُعطي المرونة في التوسّع الشّامل. بعد النّظرة العامة التي قدّمتْها الفقرات السّابقة يُمكن الانتقال إلى دراسة وفهم القدرات التي توفرها الأدوات الدّاخلة في النِّظام البيئي المُحيط بDocker ثم تنفيذ ونشر تطبيقات مُعقَّدة ومرنة كفاية لتعمَل على نُظُم تشغيل مختلفة.<br> </p><p dir="rtl">ترجمة -وبتصرّف- للمقال:<a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-an-introduction-to-common-components">The Docker Ecosystem: An Introduction to Common Components</a></p>
]]></description><guid isPermaLink="false">21</guid><pubDate>Sun, 29 Mar 2015 08:50:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; Docker</title><link>https://academy.hsoub.com/devops/cloud-computing/docker/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-docker-r3/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_02/docker.png.846cffe32b9b900a5b190100f855f591.png" /></p>

<p>قليلة هي تلك المشاريع والابتكارات التي تُحدِث نقلة نوعية في عالم البرمجيات والتقنية بشكل عام، وإن كنا سنشهد في هذه العشرية إحدى هذه المشاريع، فهو <strong>Docker</strong> بامتياز. فما هو <strong>Docker</strong> هذا؟</p><p>هذا المقال يهدف بشكل خاص إلى التعريف بمشروع <strong>Docker</strong> والفكرة التي جاء بها، وليس لكيفية البدء به (والتي ستكون في مقال منفصل إن شاء الله)، حيث لا يمكن البدء به إذا لم نفهم فكرته وأهميته في عالم البرمجيات.</p><h3>لمن هذا المقال؟</h3><ul><li>لمدراء الخواديم (SysAdmins) بالدرجة الأولى</li><li>للمبرمجين ومطوري الويب بالدرجة الثانية</li></ul><p> </p><p style="text-align:center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_02/docker.jpg.068ca1a0511a74ad45f4591df0299f62.jpg"><img class="ipsImage ipsImage_thumbnailed" data-fileid="4" alt="docker.thumb.jpg.a878a38aecf64e1a937efee" src="https://academy.hsoub.com/uploads/monthly_2015_02/docker.thumb.jpg.a878a38aecf64e1a937efee08216104d.jpg"></a></p><p>قبل أن نتحدث عن ماهية <a rel="external nofollow" href="http://www.docker.com/"><strong>Docker</strong></a> أحب أولا ذكر أهم 03 مشاكل نواجهها حاليا كمطورين ومدراء خواديم والتي يحاول <strong>Docker</strong> معالجتها...</p><h2>1. جحيم الاعتماديات (<a rel="external nofollow" href="http://en.wikipedia.org/wiki/Dependency_hell">the dependecy hell</a>)</h2><p>الأغلبية الساحقة  من مشاريع الويب "الجدية" والكبيرة لا تكون قائمة بذاتها، بل هي عبارة عن مكتبات تتواصل فيما بينها أو تعتمد على مكتبات أخرى من أجل أن تعمل، مطوروا Ruby، Python وحتى node.js و php يفهمون ذلك جيدا، وكل من هذه اللغات حاول حل المشكلة على نطاقه الخاص عبر إنشاء أدوات مساعدة تعرف بـ"مدراء الاعتماديات" أو "مدراء حزم" (dependency/package managers) أمثلة ذلك:</p><ul><li>pip بالنسبة لبايثون</li><li>gem بالنسبة لروبي</li><li>npm بالنسبة لـ node.js</li><li>وأخيرا محاولة متواضعة من php عبر <a rel="external nofollow" href="http://www.webtuts.me/php-composer/">composer</a>..</li></ul><p>وقد تذهب اللغة إلى أبعد من ذلك مثل ما فعلت بايثون بإنشاء بيئات وهمية تعزل فيها المكتبات والاعتماديات مثل مشروع <a rel="external nofollow" href="http://virtualenv.readthedocs.org/en/latest/virtualenv.html">virtualenv</a>.</p><p>كل من هذه اللغات تستعمل مدراء الاعتماديات/الحزم لجلب وإدارة المكتبات الخارجية التي يعتمد عليها المشروع (third party librairies)، لكن السؤال هنا، إذا كانت هذه اللغات وفرت هذه الأدوات، فأين المشكل؟</p><p>في الحيقيقة بالرغم من توفر هذه الأدوات، تبقى هناك مشاكل عالقة دائما خاصة على مستوى تنصيب المشروع على الخواديم (deployment) من ذلك:</p><ul><li><strong>كثرة الاعتماديات</strong>، مما يأخذ وقتا في التنزيل، وأحيانا لا توجد تلك الاعتمادية على منصة الخادوم البعيد وقد تحتاج إلى عمل تجميع يدوي لها، وهذا يجعل الأمر مُتعبا.</li><li><strong>اعتمادية تعتمد في حد ذاتها على اعتمادية أخرى</strong>، قد تكون مثلا تشترط منصة Java بأكملها، وقد تكون أيضا هذه الأخيرة تعتمد على اعتماديات أخرى وهكذا...</li><li><strong>تعارض الاعتماديات</strong>، وجود إحداها يتطلب غياب الأخرى واستحالة عملهما معا في نفس الوقت</li><li><strong>نسخة الاعتمادية التي تم تنزيلها مغايرة للتي تم تطوير المشروع بها</strong>. والنسخة الجديدة تأتي بتغيرات غير متوافقة رجعيا (<abbr title="واجهة برمجية | Application Programming Interface">API</abbr> backward compatibility)</li></ul><p>كل هذه المشاكل وغيرها، تجعل من <strong>ناقلية</strong> المشروع من مكان إلى آخر أو من خادوم إلى آخر، عملية شاقّة.</p><h2>2. صعوبة نشر، تنصيب، نقل مشاريع الويب</h2><p>مشاريع الويب الكبيرة تحتاج إلى عدد من الاحتياطات:</p><ul><li>متغيرات بيئة (environment variables) يجب تعيينها مسبقا</li><li>إعداد لنظام الـ cache</li><li>إعداد للخادوم nginx أو غيره</li><li>إعدادات أمنية</li><li>تحديث النظام وبرمجياته قد يسبب عطلا ما للمشروع،...</li></ul><p>ماذا عن نقل المشروع من خادوم إلى آخر؟ أو في حالة وجود أكثر من خادوم... وكل منه له نظامه الخاص (من CentOs إلى Ubuntu مثلا أو حتى BSD)....</p><h2>3. التطوير، التسليم والزرع المتواصل للمشاريع ( continuous <a rel="external nofollow" href="http://en.wikipedia.org/wiki/Continuous_delivery">delivery</a>/<a rel="external nofollow" href="http://en.wikipedia.org/wiki/Continuous_integration">integration</a>)</h2><p>مشاريع الويب الجدية تتبع دورة تطوير معينة، تحسين دائم، إدخال لميزات جديدة بشكل دوري، قفل للثغرات ... إلخ،  بعد هذا يجب إجراء سلسلة من الفحوصات (unit tests مثلا) للتأكد من سلامة المشروع وأنه أهل للمرحلة الإنتاجية منه (production ready)، كل هذا سهل محليا،... لكن عملية إبقاء جميع الخواديم مسايرة لوتيرة التطوير هذه أمر شاق ومتعب، خاصة حينما نحتاج إلى تحديث الاعتماديات أو وجود إعتماديات جديدة وبالتالي احتياطات جديدة...</p><p>هذه المشاكل ليس حصرا، فهناك غيرها من المشاكلة الأمنية (مثال ثغرة في مشروع الويب تمكن المخترق من الوصول إلى النظام)، مشاكل عزل (قاعدة البيانات في نفس بيئة التطبيق نفسه مما قد يسمح للوصول السهل لها من قبل المخترق)، مشاكل نسخ اختياطي (backups)،.. الخ</p><h2>إذا ما هو Docker؟</h2><p><strong>Docker</strong> عبارة عن أداة جديدة تستغل ميزات الإصدارات الأخيرة من نواة <strong>Linux</strong> الخاصة بعزل المهام والعمليات (processes)، عمليات الإدخال والإخراج (i/o)، حجز الذاكرة وتحديدها، صلاحيات القراءة والكتابة للقرص الصلب... وغير ذلك، في إنشاء <strong>حاويات (containers) </strong>ركز على هذه الكلمة جيدا، حيث أن هذه الحاويات تلعب دور<strong> غلاف حاوي</strong> لتطبيق ما (مشروع ويب مثلا)، بحيث يصبح<strong> قائما بذاته، مكتفٍ ذاتيا.</strong></p><p>أي أن مشروع الويب وكامل الاعتماديات التي يحتاجها ليعمل + التوزيعة المناسبة له (Fedora, Ubuntu.. الخ) بجميع التهيئات ومتغيرات البيئة التي يحتاجها، <strong>كل هذا في</strong> <strong>حاوية</strong> (قد تكون حاوية واحدة أو عدة حاويات تتخاطب في ما بينها عملا بمبدأ "عزل الاهتمامات" <a rel="external nofollow" href="http://en.wikipedia.org/wiki/Separation_of_concerns">SoC</a>).</p><p>لتقريب الصورة، تخيل أنه باستعمال Docker يمكنك عمل التالي:</p><ul><li>طورت تطبيقك على Ubuntu أو تعلم أنه يعمل بشكل جيد على توزيعة Ubuntu وبالتحديد الإصدارة 14.04 منها، وبالتالي تقول لـ Docker استعمل نسخة Ubuntu 14.04 (يتكفل هو بتزيل <strong>الصورة</strong> الخام من Ubuntu 14.04 - حوالي 60 إلى 300 Mb تقريبا- واستعمالها<strong> كتوزيعة للحاوية</strong>)</li><li>مشروع الويب خاصتي يستعمل Python وبالتحديد النسخة 2.7 منها، ويعمل بشكل جيد على هذه النسخة، لم أجرب على Python 3، تقول لـ Docker نصب Python2.7 في الحاوية التي بها نظام Ubuntu 14.04 الذي سبق تنزيل صورته الخام</li><li>مشروع الويب خاصتي يستعمل مكتبة Flask أو Django و مكتبة Numpy الخاصة ببايثون، يتم تثبيتهم عبر pip وبالتالي تقول لـ Docker نصب لي على الحاوية التي بها Ubuntu 14.04 و Python 2.7 السابقة تطبيق Pip عبر مدير حزم Ubuntu (أي apt-get install python-pip) ثم باستعمال pip نصب لي مكتاب بايثون السابق ذكرها</li><li>مشروع الويب الخاص بي يحتاج قاعدة بيانات MySQL، نصبها يا Docker عبر مدير حزم Ubuntu</li><li>أيضا نحتاج nginx أو apache، كذلك تطلب من Docker أن ينصبه عبر مدير حزم Ubuntu</li></ul><p>اجمع لي كل هذا في صورة واحدة (image) يمكن تشغيلها على أي خادوم أو حاسوب به Docker عبر الأمر:</p><pre class="php ipsCode prettyprint">docker run my_image</pre><p>جميع هذه الخطوات يمكن أتمتتها وسردها في ملف واحد اسمه <a rel="external nofollow" href="http://docs.docker.com/reference/builder/">DockerFile</a>، كل سطر من هذا الملف عبارة عن أمر لـ Docker يقوم به (تماما كما قمنا به أعلاه)، مجموع الأوامر يكون الخطوات التي يمر بها Docker لبناء الحاوية التي نريدها، في ما يلي مثال عن ملف DockerFile:</p><pre class="php ipsCode prettyprint"> FROM ubuntu 14.04

# Install Python 
RUN apt-get install -y python-dev

# Install pip
RUN apt-get install -y python-pip

# Install requirements.txt
ADD requirements.txt /src/requirements.txt
RUN cd /src; pip install -r requirements.txt

# Add the Flask App
ADD . /src

# EXPOSE PORT
EXPOSE 80

# Run the Flask APP
CMD python src/app.py</pre><p>يمكن حفظ هذه الأوامر في ملف باسم Dockerfile، يمكنك أيضا تشغيل هذا الملف لبناء صورة (image) لحاوية container من خلال Docker عبر الأمر التالي:</p><pre class="php ipsCode prettyprint">docker build -t &lt;your username&gt;/my-flask-app .</pre><p>لاحظ النقطة في آخر الأمر، والتي تعني "استعمل ملف DockerFile الموجود في المجلد الحالي"، أما تعليمة t- بعد أمر build هي لاعطاء وسم (tag) للحاوية التي نريد بناءها. عادة من المتعارف عليه هو اعطاء اسم مستخدمك يليه "/" يليه اسم تطبيقك.</p><h3> مفهوم الحاويات (Containers)</h3><p>الحاوية في <strong>Linux</strong> عبارة عن غلاف يطبّق مجموعات من القيود لعزل عملية أو مجموعة عمليات (processes) عن باقي مهام وعمليات النظام  من ناحية السياق (context)، الذاكرة RAM، القراءة والكتابة، الشابكة (Network)... الخ، بحيث تكون في معزل تام عن باقي الـ processes في النظام. أي نفس فكرة الـ <a rel="external nofollow" href="http://en.wikipedia.org/wiki/Sandbox_%28computer_security%29">sandboxing</a>.</p><p>مفهوم الحاويات ليس جديدا، فقد بدأ بالظهور منذ أواخر عام 2007، حين عرض مهندسون لدى Google مشروع <a rel="external nofollow" href="http://en.wikipedia.org/wiki/Cgroups">cgroups</a> (اختصارا لـ <strong>C</strong>ontrol <strong>G</strong>roups) ليتم دمجه في نواة Linux، منذ ذلك الوقت cgroups كان اللبنة الأساسية لعزل الموارد وكبحها في نظام Linux على مستوى النواة.</p><p>بعدها جاء مشروع <a rel="external nofollow" href="http://en.wikipedia.org/wiki/LXC"><strong>LXC</strong></a> (<a rel="external nofollow" href="https://linuxcontainers.org/">اختصارا</a> لـ <strong>L</strong>inu<strong>X</strong> <strong>C</strong>ontainers) والذي جمع بين cgroups وميزة عزل نطاقات الأسماء (<a rel="external nofollow" href="http://en.wikipedia.org/wiki/Namespace_isolation#NAMESPACE-ISOLATION">namespace isolation</a>) في نواة Linux، لتوفير إمكانية إنشاء مجموعات منفصلة عن بعضها من العمليات (process groups)، كل مجموعة مكتفية ذاتيا و/أو محدودة المواد، بحيث لا تدري كل مجموعة عن الأخرى بالرغم من أنهم يشاركون نفس النواة (نواة Linux). هذه المجموعات عُرفت باسم <strong>الحاويات Containers</strong>.</p><p>على الرغم من أن LXC الأقرب لفكرة Docker، إلا أنه بقي على مستوى منخفض ولم يوفر واجهة برمجية سهلة للمطورين مثل ما قدمه Docker.</p><h3>إضافات Docker</h3><p>في أيامه الأولى، اعتمد مشروع Docker على LXC وبنى عليه، أي استعمله كـ backend أو driver، (لكن الآن يمكن استعمال بدائل لـ LXC) لكنه أضاف عدة أمور عصرية، بعضها مستوحى من أنظمة إدارة النسخ (Version Control Systems) من ذلك:</p><ul><li>مفهوم Docker image لبناء لقطات من الحاويات (نفس فكرة ملفات .iso) يمكن تصديرها واسترادها، وبالتالي يمكن بناء صورة للمشروع بأكمله ثم يكفي استراد تلك الصورة على الخاودم، يتوجب فقط أن يكون Docker مُنصّبا.</li><li>إمكانية عمل "إيداع" (Commit) للتغيرات التي قمت بها على صورة المشروع الخاص بك، وبالتالي إمكانية الرجوع للوراء في حال الخطأ، هذه الميزة تسمح أيضا لـ Docker أن يكون وسيلة حفظ احتياطي "backup".</li><li>كل صورة بنيتها يمكنك مشاركتها مع المجتمع في فهرس docker، والذي كان اسمه Docker index ثم تحول مؤخرا إلى docker hub. ستجد فيه مثلا صور لـتطبيق WordPress منصبة على Ubuntu جاهزة للاستهلاك المباشر، أليس هذا رائعا؟</li><li>مفهوم الـ Dockerfile الذي سبق عرض ماهيته، وهو وسيلة لأتمتة وسرد خطوات بناء مشروعك أو حاويتك. الأتمتة التي تتيحها ملفات Dockerfiles تسمح بانتهاج نسق Continuous integration الذي تكلمنا عنه، تخيل أنك تريد تجربة مشروعك على Python 3 مثلا، كل ما عليك هو تغيير نسخة Python في ملف Dockerfile وبناء حاوية جديدة لتجرب عليها الناتج، فإن كان جيدا تدفعه للخادوم، وإن لم يكن كذلك تحذفه. نفس الشيء مع إصدارات المكتبات التي يعتمد عليها مشروعك.</li></ul><p>هذه بعض مما أضافه Docker لما هو موجود، وهي وحدها كفيلة بإحداث قفزة وتحول نوعي في طريقتنا لبناء ونشر البرامج.</p><p>لكن السؤال الذي قد يطرحه البعض: <strong>أليس ما يعمله Docker هو نفسه ما تعمله الآلات الافتراضية Virtual Machines ومحاكاة الأنظمة؟</strong></p><p>باختصار، نعم ولا <img title=":D" alt=":D" src="https://academy.hsoub.com/uploads/monthly_2015_02/biggrin.png.82269b321c088255ebc58d637fe0f5bf.png"> وسنلخص الأمر في النقاط التالية:</p><ul><li>Docker أخف بكثير من الآلات الافتراضية، يمكنك تشغيل العشرات من الحاويات في حاسوب عادي واحد، في حين لا يمكنك تشغيل 3-4 آلات افتراضية في حاسوب عادي واحد ولو كان قويا نسبيا (يثقل النظام). أي أن Docker يستهلك موارد أقل بكثير.</li><li>الآلات الافتراضية تقوم بمحاكاة <strong>كـــامــل النظام</strong> وكل ما فيه ووضعه <strong>فوق</strong> النظام المضيف، في حين Docker<strong> يتشارك النواة (Linux kernel) مع النظام المضيف</strong>.</li><li>ما يقوم به Docker هو تنزيل <strong>التوزيعات</strong> فقط، أي الـ<strong> bins/libs</strong> لكل توزيعة وفقط، في حين يتشارك النواة مع النظام المضيف ولا يُنزّل نواة جديدة مع تلك التوزيعة. تلك الـ bins/libs كفيلة ل<strong>محاكاة بيئة التوزيعة المرجوة</strong>، أما النواة فهي متشابهة بين جميع التوزيعات وبالتالي يتقاسمها مع النظام المضيف (لهذا Docker لا يعمل إلا على Linux).</li><li>Docker يعزل<strong> التطبيق واعتمادياته فقط</strong>، في حين الآلات الافتراضية <strong>تعزل كامل النظام وما فيه من تطبيقات</strong>.</li></ul><p>الصورتان التاليتان توضحان الفرق بين Docker والآلات الافتراضية:</p><p style="text-align:center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_09/docker-vm.png.755cd23a0790bb76c7fb9e68bd44e3eb.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5266" src="https://academy.hsoub.com/uploads/monthly_2015_09/docker-vm.thumb.png.40ac4c92743de4464b965dd47d442e35.png" class="ipsImage ipsImage_thumbnailed" alt="docker-vm.thumb.png.40ac4c92743de4464b96"></a></p><p style="text-align:center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_09/docker-docker.png.3b3fee5d36dbc13da09722abd7caa2c2.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5267" src="https://academy.hsoub.com/uploads/monthly_2015_09/docker-docker.thumb.png.e2de25313249249061db73f06029ebe7.png" class="ipsImage ipsImage_thumbnailed" alt="docker-docker.thumb.png.e2de253132492490"></a></p><p>من خلال الصورتين يمكن ملاحظة أن وزن Docker على الخادوم بشكل عام أخف بكثير من الثقل الذي تحدثه الآلات الافتراضية.</p><p>الجدير بالذكر أيضا أن القائمين على مشروع Docker قاموا بتوفير ما يسمى بـ <a rel="external nofollow" href="https://registry.hub.docker.com/">Docker Hub</a>، يمكن فيه مشاركة صور (images) لمشروعك (إن كان مفتوح المصدر)، تجد فيه صورا للحلول مفتوحة المصدر المعروفة، كصور Wordpress, joomla, mysql, nginx .. الخ، بحيث يمكنك استهلاكها مباشرة أو استيرادها والبناء عليها <img title=":)" alt=":)" src="https://academy.hsoub.com/uploads/monthly_2015_02/smile.png.cf72ab87c1aaefd42371e0a7de39cfae.png"> أدعوك ﻷن تلقي عليه نظرة.</p><p>يمكن أيضا أن تكون مستودعا خاصا لك، لمشاريعك التجارية غير مفتوحة المصدر / مجانية، تجلب منه وتسترد صورك الخاصة التي قمت ببنائها.</p><p>إلى هنا نصل إلى خاتمة هذه المقدمة التعريفية. سنقوم في مقال لاحق إن شاء الله بشرح أساسيات Docker بشكل عملي.</p><p>إذا كانت لغتك الانجليزية جيدة، فأنصحك بمشاهدة الفيديو التالية لفهم أعمق للمقال:</p><div class="ipsEmbeddedVideo"><iframe width="560" height="315" src="https://www.youtube.com/embed/Q5POuMHxW-0" frameborder="0" allowfullscreen=""></iframe></div>
]]></description><guid isPermaLink="false">3</guid><pubDate>Sat, 28 Feb 2015 18:40:00 +0000</pubDate></item></channel></rss>
