بعض الميزات غير المعروفة لرسو السفن

تصف العديد من الإرشادات الواردة من الإنترنت حدًا أدنى معينًا من الإجراءات ، ونتيجة لذلك ، هناك حد أدنى من الأوامر والفرص.


قررت أن أجعل مجموعة مختارة من الميزات والميزات مضاءة قليلاً. لا يتظاهر المقال بأنه فريد من نوعه ، وسيساعدني ذلك في تذكير ، وربما يساعد بعض البداويين في بدء رحلتهم بتأليف عامل ميناء.


باستخدام ملفات docker-compose.yml متعددة


هناك تكوينات معقدة ، حيث توجد طبقة أساسية معينة من الحاويات ، والتي ، على سبيل المثال ، مطلوبة دائمًا. وعادة ما يحدث أن نأخذ من الفريق المجاور \ مشروع آخر \ الإنترنت وننهي احتياجاتك. ولكن إذا كان هناك العديد من الأوامر ، فيمكن نقل الجزء الأساسي إلى مستودع داخلي مشترك. وحصلنا على جزء أساسي متطابق لمعظم المشاريع ، والذي تم إصداره أيضًا.


دعنا نصف مثالا على عامل إنشاء قاعدة أساسية.


افترض أن هذه صورة مخصصة لـ nginx مع شهادات وضبط وضبط المقاييس. ومصدر لبروميثيوس:


version: '2' services: nginx: image: nginx nginx-exporter: image: nginx/nginx-prometheus-exporter 

نصف الآن مثالًا على تطبيق docker-compose-app.yml:


 version: '2' services: backend: image: internal.local/super-app:0.1.2 

للبدء ، نحتاج إلى الفريق المعتاد بفارق واحد. سنشير إلى ملفين لرسو السفن:


 docker-compose up -d -f docker-compose-base.yml -f docker-compose-app.yml 

وفويلا ، نحصل على مجموعة من الخدمات ، كما لو كانت موصوفة في ملف واحد لرسو السفن!


يوجد أيضًا خيار ثاني لاستخدام ملفات متعددة ، من خلال استخدام التوجيه الممتد.


عامل ميناء-يؤلف-base.yml:


 version: '2' services: nginx: image: nginx nginx-exporter: image: nginx/nginx-prometheus-exporter 

عامل ميناء-يؤلف-app.yml:


 version: '2' services: backend: image: internal.local/super-app:0.1.2 ###      web: extends: #     (   ) file: docker-compose-base.yml #       service: nginx web-exporter: extends: file: docker-compose-base.yml service: nginx-exporter 

إضافة من iSlava :
يمكنك وصف جميع ملفات الإنشاء في متغيرات البيئة ، واستخدام عامل التهيئة - up دون تحديد الملفات يدويًا:


 COMPOSE_PATH_SEPARATOR=: COMPOSE_FILE=docker-compose-base.yml:docker-compose-app.yml 

أي خيار للاختيار - اخترت. كل على حدة ، أردت فقط إظهار الخيارات =)


الميراث في عامل الميناء


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


 version: '2.4' services: backend: image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro 

كانت هناك حاجة لرفع عدة حاويات ، ولكن مع بعض الاختلافات ، يمكننا بالطبع "الحفظ" والتغيير ، لكن يمكننا القيام بذلك:


 version: '2.4' services: backend: &base-app #          image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro backend-2: <<: *base-app # ports: #    - 8081:8080 

وبالتالي ، سنحصل على فرصة للتغيير في مكان واحد ، بدلاً من التعديل في وصف كل حاوية.
هناك خيار آخر للانتقال إلى منطقة الجذر ، على سبيل المثال:


 version: '2.4' services: x-backend: #   "x-"  ,    . &base-app image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro backend: <<: *base-app # backend-2: <<: *base-app # ports: #    - 8081:8080 

حدود الموارد


بدءاً من الإصدار 2.2 ، يمكنك استخدام حدود الموارد للحاويات ، في الواقع ، من الإصدار 2.1 ، ولكن لا يزال هناك كل تسليم =)
هناك فارق بسيط! في الإصدار 3 ، تتم إزالة هذه الميزات! هناك بالفعل التركيز على سرب عامل ميناء.


أبسط مثال على قيود موارد وحدة المعالجة المركزية ، MEM:


 version: '2.2' services: backend: cpus: 1.5 #   . cpuset: '0,3' #     . mem_limit: 1gb #  1  memswap_limit: 2gb # SWAP   . oom_kill_disable: true #   ,    OOM Killer        ,       . image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro 

حزم الصور في الأرشيف


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


 #!/bin/bash dc=${1} if [ ! -z ${dc} ] && [ -f ${dc} ]; then echo "Saving docker images from file ${dc}..." images=`grep image: ${dc} | awk '{print $2}'` docker save ${images} | gzip > docker-images.gz echo "Success!" else echo "ERROR! You must set path to docker-compose.yml as argument!" fi 

حفظ إلى ملف يقول عامل ميناء - أغراض - صور - save.sh
نعطي الحق في التنفيذ:
chmod +x docker-compose-images-save.sh
نبدأ تشغيله ونمر الطريق إلى ملف إنشاء عامل النقل كوسيطة:
./docker-compose-images-save.sh /home/some_user/docker-compose-app.yml
في المخرجات ، نحصل على المجلد الذي تم من خلاله استدعاء أرشيف البرنامج النصي بالصور - docker-images.gz
بأي طريقة يمكننا أن نرسل إلى خادم بعيد.
الآن على الخادم البعيد يكفي تنفيذ:
gzip -cd docker-images.gz | docker load
سيتم تحميل جميع الصور إلى السجل المحلي ، وبعد ذلك يمكنك تشغيلها بأمان هنا
docker-compose up -d ، بما أن جميع الصور موجودة في السجل المحلي على الإنترنت ، فإن عامل الميناء لن يدخل فيها.


إلى الأمام IPv6


في بعض المهام ، يمكن أن يكون ipv6 مفيدًا للغاية ، خذ على الأقل فارق بسيط في أن Roskomnadzor يمرر كل حركة المرور عبر ipv6 دون مشاكل ، ونفس telegram يعمل دون مشاكل.
سوف أفكر في موقف يكون فيه ipv6 غير موجود على جهازك ، سواء كان جهازًا افتراضيًا أو خادمًا على الإنترنت.
تأكد من تمكين ipv6 على مستوى النظام:


  sysctl net.ipv6.conf.all.disable_ipv6 

يجب أن تكون القيمة 0 ، إذا لم يكن الأمر كذلك ، فقم بتغيير:


  sysctl -w net.ipv6.conf.all.disable_ipv6=0 

قم بتثبيت miredo (هذه خدمة ذات VPN مدمج على الخادم الذي سيعطينا ipv6 العام)


  apt-get install miredo -y 

تحقق من تشغيل الخدمة:


  systemctl status miredo 

نتحقق من أننا تلقينا عنوان ipv6:


  ifconfig teredo 

نكتب في /etc/docker/daemon.json


  { "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" } 

أعد تشغيل عامل الإرساء:


  systemctl restart docker 

حسنًا ، يبقى تمكين NAT لـ ipv6 حتى تتمكن العناوين الداخلية للحاوية الخاصة بنا من الوصول إلى العالم الخارجي من خلال واجهة teredo الخاصة بنا:


  ip6tables -t nat -A POSTROUTING -o teredo -j MASQUERADE 

نرفع حاوية الإرساء التي نحتاجها ، ويمكن نشرها عبر عنوان ipv6.


المثال أعلاه مع sysctl و iptables سيعمل حتى تتم إعادة التشغيل ، إذا كنت بحاجة إلى القيام بذلك بشكل مستمر ، فيجب أن تنظر إلى التعليمات الخاصة بالتوزيع ، فهناك اختلافات.

آمل أن يكون شخص ما قدم المعلومات هنا مفيدة.

Source: https://habr.com/ru/post/ar459618/


All Articles