Docker Compose: daripada pembangunan kepada pengeluaran

Terjemahan transkripsi podcast yang disediakan untuk menjangkakan permulaan kursus "Pentadbir Linux"

Docker Compose: daripada pembangunan kepada pengeluaran

Docker Compose ialah alat yang menakjubkan untuk mencipta kerja
persekitaran untuk timbunan yang digunakan dalam aplikasi anda. Ia membolehkan anda untuk menentukan
setiap komponen aplikasi anda, mengikut sintaks yang jelas dan mudah masuk YAML-
fail
.

Dengan kedatangan karang docker v3 fail YAML ini boleh digunakan secara langsung dalam persekitaran pengeluaran apabila bekerja dengannya
kelompok Kumpulan Docker.

Tetapi adakah ini bermakna anda boleh menggunakan fail karang docker yang sama
proses pembangunan dan dalam persekitaran pengeluaran? Atau gunakan fail yang sama untuk
pementasan? Nah, secara umum, ya, tetapi untuk fungsi ini kita memerlukan yang berikut:

  • Interpolasi pembolehubah: menggunakan pembolehubah persekitaran untuk beberapa
    nilai yang berubah dalam setiap persekitaran.
  • Penggantian konfigurasi: keupayaan untuk menentukan detik (atau mana-mana
    satu lagi fail docker-compose berikutnya yang akan mengubah sesuatu mengenai
    pertama, dan docker compose akan menguruskan penggabungan kedua-dua fail.

Perbezaan antara fail pembangunan dan pengeluaran

Semasa pembangunan, anda berkemungkinan besar ingin menyemak perubahan kod
masa sebenar. Untuk melakukan ini, biasanya volum dengan kod sumber dipasang
bekas yang mengandungi masa jalan untuk aplikasi anda. Tetapi untuk persekitaran pengeluaran
Kaedah ini tidak sesuai.

Dalam pengeluaran, anda mempunyai gugusan dengan banyak nod, dan volumnya adalah setempat
berbanding nod di mana bekas (atau perkhidmatan) anda sedang berjalan, jadi anda tidak
anda boleh memasang kod sumber tanpa operasi kompleks yang termasuk
penyegerakan kod, isyarat, dsb.

Sebaliknya, kami biasanya ingin mencipta imej dengan versi khusus kod anda.
Adalah lazim untuk menandakannya dengan tag yang sesuai (anda boleh menggunakan semantic
versi atau sistem lain mengikut budi bicara anda).

Penggantian Konfigurasi

Memandangkan perbezaan dan kebergantungan anda mungkin berbeza dalam senario
pembangunan dan pengeluaran, adalah jelas bahawa kita memerlukan fail konfigurasi yang berbeza.

Karang Docker menyokong penggabungan fail karang yang berbeza ke
mendapatkan konfigurasi akhir. Cara ini berfungsi boleh dilihat dalam contoh:

$ cat docker-compose.yml
version: "3.2"

services:
  whale:
    image: docker/whalesay
    command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ________
whale_1  | < hello! >
whale_1  |  --------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Seperti yang dikatakan, docker compose menyokong menggabungkan berbilang gubahan -
fail, ini membolehkan anda mengatasi pelbagai parameter dalam fail kedua. Sebagai contoh:

$ cat docker-compose.second.yml
version: "3.2"
services:
  whale:
    command: ["cowsay", "bye!"]

$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Sintaks ini tidak begitu mudah semasa pembangunan, apabila arahan
perlu dilakukan berkali-kali.

Nasib baik, docker compose secara automatik mencari fail khas yang dipanggil
docker-compose.override.yml untuk mengatasi nilai docker-compose.yml. Jika
menamakan semula fail kedua, anda mendapat hasil yang sama, hanya menggunakan arahan asal:

$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Okay, itu lebih mudah untuk diingati.

Interpolasi Pembolehubah

Sokongan fail konfigurasi interpolasi
pembolehubah
dan nilai lalai. Iaitu, anda boleh melakukan perkara berikut:

services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...

Dan jika anda lakukan binaan (atau tolak) docker-compose tanpa pembolehubah persekitaran
$MY_SERVICE_VERSION, nilai akan digunakan Terkinitetapi jika anda menetapkan
nilai pembolehubah persekitaran sebelum binaan, ia akan digunakan semasa membina atau menolak
kepada daftar private.registry.mine.

prinsip saya

Pendekatan yang sesuai untuk saya mungkin berkesan untuk anda juga. Saya mengikuti ini
peraturan mudah:

  • Semua timbunan saya untuk pengeluaran, pembangunan (atau persekitaran lain) ditakrifkan melalui
    fail karang docker
  • Fail konfigurasi diperlukan untuk merangkumi semua persekitaran saya sebanyak mungkin
    elakkan pertindihan.
  • Saya memerlukan satu arahan mudah untuk berfungsi dalam setiap persekitaran.
  • Konfigurasi utama ditakrifkan dalam fail docker-compose.yml.
  • Pembolehubah persekitaran digunakan untuk menentukan teg imej atau lain-lain
    pembolehubah yang mungkin berbeza dari persekitaran ke persekitaran (pementasan, integrasi,
    pengeluaran).
  • Nilai pembolehubah pengeluaran digunakan sebagai nilai untuk
    secara lalai, ini meminimumkan risiko jika tindanan dilancarkan dalam pengeluaran tanpa
    tetapkan pembolehubah persekitaran.
  • Untuk memulakan perkhidmatan dalam persekitaran pengeluaran, gunakan arahan penggunaan tindanan docker - compose-file docker-compose.yml -with-registry-auth my-stack-name.
  • Persekitaran kerja dimulakan menggunakan arahan docker-compose up -d.

Mari kita lihat contoh mudah.

# docker-compose.yml
...
services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
    environment:
      API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...

И

# docker-compose.override.yml
...
services:
  my-service:
    ports: # This is needed for development!
      - 80:80
    environment:
      API_ENDPOINT: https://devel.my-api.com
    volumes:
      - ./:/project/src
...

saya boleh guna docker-compose (docker-compose up)untuk menjalankan timbunan masuk
mod pembangunan dengan kod sumber dipasang /projek/src.

Saya boleh menggunakan fail yang sama ini dalam pengeluaran! Dan saya pasti boleh menggunakannya
fail yang sama docker-compose.yml untuk pementasan. Untuk mengembangkan ini kepada
pengeluaran, saya hanya perlu membina dan menghantar imej dengan tag yang telah ditetapkan
di peringkat CI:

export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push

Dalam pengeluaran, ini boleh dijalankan menggunakan arahan berikut:

export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

Dan jika anda ingin melakukan perkara yang sama di atas pentas, anda hanya perlu menentukan
pembolehubah persekitaran yang diperlukan untuk bekerja dalam persekitaran pementasan:

export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

Akibatnya, kami menggunakan dua fail karang docker yang berbeza, yang tanpa
Konfigurasi pendua boleh digunakan untuk mana-mana persekitaran yang anda miliki!

Ketahui lebih lanjut tentang kursus "Pentadbir Linux"

Sumber: www.habr.com

Tambah komen