Beberapa fitur komposisi buruh pelabuhan yang kurang dikenal

Banyak instruksi dari Internet menggambarkan tindakan minimum tertentu, dan sebagai hasilnya, minimum perintah dan peluang.


Saya memutuskan untuk membuat pilihan fitur yang sedikit menyala, fitur. Artikel ini tidak berpura-pura menjadi unik, itu akan membantu saya sebagai pengingat, dan mungkin itu akan membantu beberapa Padawans memulai perjalanan mereka dengan menyusun dok.


Menggunakan beberapa file docker-compose.yml


Ada konfigurasi kompleks, di mana ada lapisan dasar wadah tertentu, yang, katakanlah, selalu dibutuhkan. Dan biasanya itu terjadi bahwa kami mengambil dari tim tetangga \ proyek lain \ Internet dan menyelesaikannya untuk kebutuhan Anda. Tetapi jika ada beberapa perintah, maka bagian dasar dapat dipindahkan ke repositori internal yang umum. Dan kami mendapatkan bagian dasar yang identik untuk sebagian besar proyek, yang juga versi.


Mari kita gambarkan contoh dari docker-compose-base.yml dasar.


Misalkan ini adalah gambar nginx yang disesuaikan dengan sertifikat, penyetelan, dan katakan metrik. Dan pengekspor untuk prometheus:


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

Sekarang kami menggambarkan contoh aplikasi docker-compose-app.yml kami:


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

Untuk memulai, kita membutuhkan tim yang biasa dengan satu perbedaan. Kami akan menunjukkan 2 file docker-compose:


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

Dan voila, kami mendapatkan satu set layanan, seolah-olah mereka dijelaskan dalam satu file penyusun buruh pelabuhan!


Ada juga opsi kedua untuk menggunakan banyak file, melalui penggunaan direktif extends.


docker-compose-base.yml:


 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 ###      web: extends: #     (   ) file: docker-compose-base.yml #       service: nginx web-exporter: extends: file: docker-compose-base.yml service: nginx-exporter 

Add-on dari iSlava :
Anda dapat mendeskripsikan semua file penulisan dalam variabel lingkungan, dan menggunakan docker-compose up -d tanpa menentukan file secara manual:


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

Opsi mana yang harus dipilih - Anda pilih. Secara individual, saya hanya ingin menunjukkan opsi =)


Warisan dalam komposisi buruh pelabuhan


Contoh berikut membutuhkan versi buruh pelabuhan-menulis > = 2.4
Juga fitur yang cukup menarik, dan memang sedikit yang disebutkan.
Fungsionalitas ini memungkinkan kami untuk mendeskripsikan beberapa layanan dengan tipe yang sama dalam file pembuatan docker, tanpa menduplikasi deskripsi mereka, yaitu mewarisi.
Misalnya, kami memiliki file seperti ini:


 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 

Dan ada kebutuhan untuk menaikkan beberapa kontainer, tetapi dengan beberapa perbedaan, tentu saja kita bisa "menabung" dan berubah, tetapi kita bisa melakukan ini:


 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 

Dengan demikian, kami mendapat kesempatan untuk berubah di satu tempat, daripada mengedit dalam deskripsi setiap wadah.
Ada opsi lain untuk pindah ke area root, misalnya:


 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 

Batas sumber daya


Mulai dari versi 2.2, Anda dapat menggunakan batas sumber daya untuk kontainer, pada kenyataannya, dari versi 2.1, tetapi masih belum semuanya dikirimkan =)
Ada nuansa! Di versi 3, fitur-fitur ini dihapus! Sudah ada penekanan pada gerombolan buruh pelabuhan.


Contoh paling sederhana pembatasan sumber daya CPU, 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 

Mengemas gambar dalam arsip


Sayangnya, tidak selalu mungkin untuk mendorong gambar di registri Anda sendiri atau cloud docker. Terkadang ada kebutuhan untuk mengumpulkan gambar dari file yang dibuat buruh pelabuhan dan mengirim, katakanlah, arsip file. Tangan melakukannya kadang-kadang lama, jadi saya membuat sketsa skrip sederhana, tiba-tiba seseorang berguna:


 #!/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 

Simpan ke file say docker-compose-images-save.sh
Kami memberikan hak untuk mengeksekusi:
chmod +x docker-compose-images-save.sh
Kami memulainya dan meneruskan path ke file docker-compose sebagai argumen:
./docker-compose-images-save.sh /home/some_user/docker-compose-app.yml
Pada output, kita masuk ke folder dari mana skrip arsip dengan gambar dipanggil - docker-images.gz
Cara apa pun kami dapat mengirim ke server jauh.
Sekarang di server jauh sudah cukup untuk menjalankan:
gzip -cd docker-images.gz | docker load
Semua gambar akan diunggah ke registri lokal, setelah itu Anda dapat berjalan dengan aman di sini
docker-compose up -d , karena semua gambar ada di registry lokal di Internet, buruh pelabuhan tidak akan masuk ke dalamnya.


Penerusan IPv6


Dalam tugas-tugas tertentu, ipv6 bisa sangat berguna, mengambil setidaknya nuansa bahwa Roskomnadzor melewati semua lalu lintas melalui ipv6 tanpa masalah, dan bot telegram yang sama berfungsi tanpa masalah.
Saya akan mempertimbangkan situasi di mana ipv6 tidak ada di komputer Anda, baik itu mesin virtual, atau server di Internet.
Pastikan ipv6 tingkat sistem diaktifkan:


  sysctl net.ipv6.conf.all.disable_ipv6 

Nilai harus 0, jika tidak, ubah:


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

Instal miredo (Ini adalah layanan dengan built-in VPN ke server yang akan memberi kita ipv6 publik)


  apt-get install miredo -y 

Periksa apakah layanan sedang berjalan:


  systemctl status miredo 

Kami memverifikasi bahwa kami menerima alamat ipv6:


  ifconfig teredo 

Kami menulis di /etc/docker/daemon.json


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

Mulai ulang buruh pelabuhan:


  systemctl restart docker 

Yah, tetap memungkinkan NAT untuk ipv6 sehingga alamat internal wadah kami dapat menjangkau dunia luar melalui antarmuka teredo kami:


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

Kami meningkatkan wadah buruh pelabuhan yang kami butuhkan, dan itu dapat dipublikasikan melalui alamat ipv6.


Contoh di atas dengan sysctl dan iptables akan bekerja sampai reboot, jika Anda perlu melakukannya secara berkelanjutan, Anda harus melihat petunjuk untuk distribusi Anda, ada perbedaan.

Saya harap seseorang memberikan informasi di sini akan bermanfaat.

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


All Articles