Docker untuk Symfony 4 - dari LAN hingga produksi

Prasejarah


Suatu hari saya perlu menggunakan lingkungan pengembangan untuk proyek saya. Vagrant sudah muak dengan itu dan ingin memiliki lingkungan pengembangan tunggal untuk semua peserta proyek yang akan identik dengan server produksi. Karena itu, setelah mendengarkan informasi tentang buruh pelabuhan hipster, saya memutuskan untuk mulai menanganinya. Selanjutnya, saya akan mencoba menjelaskan sedetail mungkin semua langkah mulai dari memasang buruh pelabuhan di LAN hingga menggunakan produk ke KVM.

Tumpukan teknologi asli:

- buruh pelabuhan
- symfony 4
- nginx
- php-fpm
- postgresql
- Pencarian elastics
- rabbitmq
- Jenkins

Besi:

- laptop di bawah OS Ubuntu 16.04
- server produksi pada hosting KVM

Mengapa, selain tumpukan teknologi, saya juga mendaftarkan tumpukan besi?

Jika Anda belum pernah bekerja dengan buruh pelabuhan, maka Anda mungkin mengalami sejumlah masalah yang terkait dengan perangkat keras, sistem operasi laptop Anda, atau jenis virtualisasi hosting.

Aspek pertama dan mungkin yang paling penting ketika mulai bekerja dengan buruh pelabuhan adalah sistem operasi laptop Anda. Cara termudah untuk bekerja dengan buruh pelabuhan adalah pada sistem linux. Jika Anda bekerja pada Windows atau Mac, maka Anda akan memiliki 100% kesulitan, tetapi kesulitan ini tidak akan menjadi kritis dan jika Anda ingin "google" bagaimana ini diperbaiki, tidak akan ada masalah.

Pertanyaan kedua adalah hosting. Mengapa Hosting diperlukan dengan tipe virtualisasi KVM? Alasannya adalah bahwa virtualisasi VPS sangat berbeda dari KVM dan Anda tidak akan dapat menginstal buruh pelabuhan di VPS, karena VPS mengalokasikan sumber daya server secara dinamis.

Subtotal: untuk permulaan tercepat pada buruh pelabuhan, paling masuk akal untuk memilih Ubuntu sebagai OS lokal dan hosting KVM (atau server Anda sendiri). Selanjutnya, ceritanya akan bergantung pada dua komponen ini.

Docker-compose untuk LAN


Instalasi


Pertama, Anda perlu menginstal buruh pelabuhan itu sendiri secara lokal. Anda dapat melihat instruksi instalasi pada tautan situs web resmi ke dokumentasi resmi untuk ubuntu (Anda perlu menginstal buruh pelabuhan dan pekerja menulis), atau dengan menjalankan perintah di konsol:

curl -sSl https://get.docker.com/ | sh 

Perintah ini akan menginstal docker dan docker-compose. Setelah itu, periksa versi buruh pelabuhan dengan perintah:

 docker --version 

Saya memulai semua ini pada versi buruh pelabuhan 18.06.0-ce.

Instalasi selesai!

Kesadaran


Untuk bekerja dengan sesuatu yang kurang berhasil - Anda perlu memiliki ide tentang cara kerjanya. Jika sebelumnya Anda hanya bekerja dengan Vagrant atau sesuatu yang serupa, maka itu akan sangat tidak biasa dan tidak bisa dipahami pada awalnya, tetapi ini hanya pada awalnya.

Saya akan mencoba menggambar analogi untuk Vagrant. Sekarang banyak yang bisa mengatakan bahwa membandingkan Vagrant dan Docker pada dasarnya salah. Ya, saya setuju dengan ini, tetapi saya tidak akan membandingkan mereka, saya hanya akan mencoba menyampaikan kepada para pendatang baru yang hanya bekerja dengan Vagrant, sistem kerja Docker, menarik bagi apa yang diketahui oleh para pendatang baru.

Visi saya tentang wadah "dengan jari" adalah sebagai berikut: setiap wadah adalah dunia kecil yang terisolasi. Setiap wadah dapat dibayangkan seolah-olah itu adalah Vagrant kecil di mana hanya 1 alat diinstal, misalnya nginx atau php. Awalnya, wadah umumnya terisolasi dari segala sesuatu di sekitarnya, tetapi dengan manipulasi rumit, Anda dapat mengonfigurasi semuanya sehingga mereka berkomunikasi satu sama lain dan bekerja bersama. Ini tidak berarti bahwa masing-masing wadah adalah mesin virtual yang terpisah, bukan sama sekali. Tapi itu lebih mudah untuk pemahaman awal, seperti yang menurut saya.

Vagrant hanya menggigit bagian dari sumber daya komputer Anda, menciptakan mesin virtual, menginstal sistem operasi di atasnya, menginstal perpustakaan, menginstal semua yang Anda tulis dalam skrip setelah naik ke atas. Pada akhirnya, akan terlihat seperti ini:

Lihat skema

Docker, pada gilirannya, bekerja sangat berbeda. Itu tidak membuat mesin virtual. Docker membuat wadah (untuk saat ini, Anda dapat menganggapnya sebagai mesin mikro-virtual) dengan sistem operasi Alpine dan 1-3 pustaka yang diperlukan agar aplikasi dapat berfungsi, misalnya php atau nginx. Pada saat yang sama, Docker tidak memblokir sumber daya sistem Anda untuk dirinya sendiri, tetapi hanya menggunakannya sesuai kebutuhan. Pada akhirnya, untuk menggambarkannya, akan terlihat seperti ini:

Lihat skema

Setiap wadah memiliki gambar dari mana itu dibuat. Sebagian besar gambar adalah perpanjangan dari gambar lain, misalnya, Ubuntu xenial atau Alpine atau Debian, di mana driver tambahan dan komponen lainnya digulirkan di atas.

Gambar pertama saya adalah untuk php-fpm. Gambar saya memperluas gambar php resmi: 7.2-fpm-alpine3.6. Artinya, pada dasarnya, ini mengambil gambar resmi dan memberikan komponen yang saya butuhkan, misalnya, pdo_pgsql, imagick, zip, dan sebagainya. Dengan demikian, Anda dapat membuat gambar yang Anda butuhkan. Jika mau, Anda bisa menggunakannya di sini .

Dengan penciptaan gambar, semuanya cukup sederhana menurut saya jika mereka dibuat berdasarkan xenial misalnya, tetapi mereka memberikan sedikit wasir jika mereka dibuat berdasarkan Alpine. Sebelum mulai bekerja dengan buruh pelabuhan, saya pada dasarnya tidak mendengar tentang Alpine, karena Vagrant selalu bekerja untuk saya di bawah Ubuntu xenial. Alpine adalah sistem operasi Linux kosong, di mana pada dasarnya tidak ada sama sekali (minimum ekstrim). Oleh karena itu, pada awalnya sangat tidak nyaman untuk bekerja dengannya, karena misalnya tidak ada instalasi apt-get yang sama (yang biasa Anda gunakan), tetapi hanya ada penambahan apk dan paket paket yang tidak cukup waras. Nilai tambah besar Alpine adalah bobotnya, misalnya, jika Xenial menimbang (secara abstrak) 500 kantong, maka Alpine (secara abstrak) adalah sekitar 78 kantong. Apa yang bahkan mempengaruhi ini? Dan ini mempengaruhi kecepatan build dan bobot akhir semua gambar yang akan disimpan di server Anda pada akhirnya. Katakanlah Anda memiliki 5 wadah berbeda dan semuanya berdasarkan xenial, berat totalnya akan lebih dari 2,5 gigs, dan alpine - sekitar 500 kantong saja. Karena itu, idealnya, kita harus berusaha untuk memastikan bahwa wadah setipis mungkin. (Tautan yang berguna untuk menginstal paket dalam paket Alpine - Alpine ).

Di mana-mana di hub buruh pelabuhan mereka menulis cara meluncurkan wadah menggunakan perintah docker run , dan untuk beberapa alasan mereka tidak menulis bagaimana itu dapat diluncurkan melalui komposisi buruh pelabuhan, dan melalui komposisi buruh pelabuhan itu akan memulai sebagian besar waktu, karena sangat sedikit perburuan secara manual mulai semua wadah, jaring, port terbuka dan banyak lagi. Susunan Docker atas nama pengguna hanya terlihat seperti file yaml dengan pengaturan. Ini termasuk deskripsi dari masing-masing layanan yang harus dimulai. Bangunan saya untuk lingkungan lokal adalah sebagai berikut:

 version: '3.1' services: php-fpm: image: otezvikentiy/php7.2-fpm:0.0.11 ports: - '9000:9000' volumes: - ../:/app working_dir: /app container_name: 'php-fpm' nginx: image: nginx:1.15.0 container_name: 'nginx' working_dir: /app ports: - '7777:80' volumes: - ../:/app - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf postgres: image: postgres:9.6 ports: - '5432:5432' container_name: 'postgresql' working_dir: /app restart: always environment: POSTGRES_DB: 'db_name' POSTGRES_USER: 'db_user' POSTGRES_PASSWORD: 'db_pass' volumes: - ./data/dump:/app/dump - ./data/postgresql:/var/lib/postgresql/data rabbitmq: image: rabbitmq:3.7.5-management working_dir: /app hostname: rabbit-mq container_name: 'rabbit-mq' ports: - '15672:15672' - '5672:5672' environment: RABBITMQ_DEFAULT_USER: user RABBITMQ_DEFAULT_PASS: password RABBITMQ_DEFAULT_VHOST: my_vhost elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.3.0 container_name: 'elastic-search' environment: - discovery.type=single-node - "discovery.zen.ping.unicast.hosts=elasticsearch" - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - 9200:9200 - 9300:9300 working_dir: /app volumes: - ../:/app - ./data/elasticsearch:/usr/share/elasticsearch/data volumes: elasticsearch: postgresql: 

docker-compose.yaml untuk SF4 adalah serangkaian layanan tertentu: nginx, php-fpm, postgresql, rabbitmq (jika Anda memerlukannya), elasticsearch (jika Anda membutuhkannya). Untuk lingkungan setempat, ini sudah cukup. Agar semuanya berfungsi - ada satu set minimal pengaturan, yang tanpanya tidak ada yang berfungsi. Paling sering ini adalah gambar, volume, port, lingkungan, working_dir dan container_name. Segala sesuatu untuk meluncurkan gambar ini atau itu dijelaskan dalam dokumentasinya di hub.docker.com . Tidak selalu ada deskripsi untuk komposisi buruh pelabuhan, tetapi ini tidak berarti bahwa itu tidak bekerja dengannya. Anda hanya perlu mentransfer semua data yang masuk dari docker run command ke docker-compose dan semuanya akan berfungsi.

Misalnya, ada gambar untuk RabbitMQ di sini . Ketika Anda melihat INI untuk pertama kalinya, ini menimbulkan perasaan dan emosi yang campur aduk, tetapi tidak semuanya menakutkan. Tag ditunjukkan dalam gambar ini. Biasanya tag - mewakili gambar yang berbeda, versi aplikasi yang berbeda dengan gambar yang dapat diperluas yang berbeda. Misalnya, tag 3.7.7-alpine berarti bahwa gambar ini lebih tipis daripada, misalnya, 3.7.7, karena didasarkan pada Alpine. Baik dan juga di tag paling sering versi aplikasi ditunjukkan. Saya biasanya memilih versi terbaru dan versi stabil dari aplikasi itu sendiri dan gambar alpine.

Setelah Anda mempelajari dan memilih tag - maka sering Anda melihat sesuatu seperti ini:

 docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management 

Dan pikiran pertama adalah WTF? Bagaimana cara mentransfer ini ke komposisi buruh pelabuhan?

Semuanya sangat mudah. Bahkan, baris ini menunjukkan semua parameter yang sama seperti pada file yaml, hanya disingkat. Sebagai contoh, -e adalah lingkungan di mana berbagai parameter dilewatkan, mungkin juga ada entri seperti -p - ini adalah port yang disebut port di yaml. Oleh karena itu, untuk menggunakan gambar yang tidak dikenal dengan cara yang berkualitas, Anda hanya perlu "google" buruh pelabuhan menjalankan singkatan dan menerapkan nama lengkap dalam file yaml.

Sekarang kembali ke docker-compose.yml, yang saya kutip sebagai contoh di atas.

Contoh ini menggunakan gambar php7.2 saya yang dibuat sebagai ekstensi untuk gambar php7.2-fpm-alpine resmi, tetapi jika Anda tidak membutuhkan begitu banyak pustaka tambahan, maka Anda dapat membangun ekstensi Anda untuk gambar resmi dan menggunakannya. Sisa gambar untuk LAN sepenuhnya asli dan resmi.

gambar - menunjukkan gambar yang akan diunduh. Misalnya (rabbitmq: 3.7.7-management-alpine).

ports - tentukan port yang akan digunakan wadah (lihat dokumentasi gambar). Contoh port nginx adalah 80 secara default. Karenanya, jika Anda ingin menggunakan port 80, Anda harus menentukan 80:80 di sini dan situs Anda akan tersedia di localhost. Atau Anda dapat menentukan 7777: 80, dan kemudian situs Anda akan berada di url localhost: 7777. Ini diperlukan agar beberapa proyek dapat digunakan pada host yang sama.

volume - direktori bersama ditunjukkan di sini. Sebagai contoh, proyek Anda terletak pada direktori ~ / projects / my-sf4-app, dan wadah php dikonfigurasikan untuk bekerja dengan direktori / app (sama dengan di / var / www / my-sf4-app). Dengan demikian, akan lebih mudah bagi wadah untuk memiliki akses ke proyek. Dengan demikian, dalam volume kita menulis ~/projects/my-sf4-app:/app (lihat contoh ini di docker-compose.yml di atas (saya telah mengindikasikannya dengan cara yang relatif ../:/app)).

Dengan demikian, folder tersebut akan dibagikan untuk wadah dan akan dapat melakukan berbagai tindakan di dalamnya seperti php bin/console doctrine:migrations:migrate . Juga nyaman menggunakan direktori ini untuk menyimpan data aplikasi. Sebagai contoh, postgresql, Anda dapat menentukan direktori untuk menyimpan data database, dan kemudian ketika Anda membuat ulang wadah, Anda tidak perlu menggulung dump atau fixture.

working_dir - menunjukkan direktori kerja wadah. Dalam hal ini, / app (atau dengan analogi dengan gelandangan / var / www / my-sf4-app).

lingkungan - semua variabel untuk wadah dilewatkan di sini. Sebagai contoh, untuk rabbitmq, nama pengguna dan kata sandi dikirimkan, untuk postgresql, nama dasar, nama pengguna, kata sandi dilewatkan.

container_name adalah bidang opsional, tapi saya lebih suka menentukan, untuk kenyamanan menghubungkan ke wadah. Jika tidak ditentukan, nama default dengan hash akan ditetapkan.

Ini adalah parameter utama yang harus ditentukan. Sisanya bisa opsional untuk pengaturan tambahan, atau sesuai dengan dokumentasi untuk wadah.

Sekarang, untuk memulai semua ini, Anda perlu menjalankan perintah docker-compose up -d di direktori di mana file docker-compose berada.

Bagaimana dan di mana menyimpan semua ini untuk LAN?


Untuk LAN saya menggunakan folder buruh pelabuhan di root proyek.


Ini berisi folder data di mana saya menyimpan semua postgresql informasi dan elasticsearch, sehingga ketika Anda membuat ulang proyek, Anda tidak perlu menggulung perlengkapan dari awal. Ada juga ayah nginx di mana saya menyimpan konfigurasi untuk wadah nginx lokal. Saya menyinkronkan folder ini di docker-compose.yml dengan file dan folder yang sesuai dalam wadah. Juga menurut saya sangat nyaman untuk menulis skrip bash untuk bekerja dengan buruh pelabuhan. Misalnya, skrip start.sh meluncurkan wadah, lalu komposer memasang, membersihkan cache, dan bermigrasi. Juga nyaman bagi rekan proyek, mereka tidak perlu melakukan apa pun, mereka hanya menjalankan skrip dan semuanya berfungsi.

Contoh skrip Start.sh

 #!/usr/bin/env bash green=$(tput setf 2) toend=$(tput hpa $(tput cols))$(tput cub 6) echo -n '   ?: ' read name echo "  $name!       tutmesto.ru" echo -n "$name,      ? (y/n): " read use_dump echo '    !' docker-compose up -d || exit echo -en '\n' echo -n "  ! ${green}${toend}[OK]" echo -en '\n' echo '    .' ./composer-install.sh echo -en '\n' echo -n "   ${green}${toend}[OK]" echo -en '\n' echo '     40 ,    postgres-' sleep 5 echo '  35 ...' sleep 5 echo '  30 ...' sleep 5 echo '  25 ...' sleep 5 echo '  20 ...' sleep 5 echo '  15 ...' sleep 5 echo '  10 ...' sleep 5 echo '  5 ...' sleep 5 echo ' .   postgres-        !' case "$use_dump" in y|Y) ./dump.sh echo -en '\n' echo -n "  ! ${green}${toend}[OK]" echo -en '\n' ;; *) echo "$name, ,   ! =)" ;; esac echo '    !' ./migrations-migrate.sh echo -en '\n' echo -n "  ! ${green}${toend}[OK]" echo -en '\n' echo '  !' ./php-fpm-command.sh rm -rf var/cache/* ./php-fpm-command.sh chmod 777 var/ -R ./cache-clear.sh echo -en '\n' echo -n "  ! ${green}${toend}[OK]" echo -en '\n' echo '    !' ./env.sh echo -en '\n' echo -n "   ! ${green}${toend}[OK]" echo -en '\n' echo ", $name,    !    localhost:7777  !" echo -en '\n' echo "------------------------------------------------------------------------------" echo -en '\n' echo "    :" echo "./cache-clear.sh |  symfony 4" echo "./composer.sh [command(ex. install)] |  " echo "./composer-install.sh | composer install" echo "./connect-to-php-fpm.sh |   php" echo "./console.sh [command(ex. cache:clear)] |  php bin/console" echo "./destroy.sh |  .    ." echo "./dump.sh | ,     (dump.sql)" echo "./env.sh |   " echo "./migrations-migrate.sh | " echo "./php-fpm-command.sh [command(ex. php -m)] |   php-fpm " echo "./start.sh |  ( )" echo "./stop.sh |Gracefull shutdown " echo -en '\n' echo "        :" echo "client@c.cc | QWEasd123" echo "admin@a.aa | QWEasd123" echo "moderator@m.mm | QWEasd123" echo -en '\n' echo "------------------------------------------------------------------------------" echo -en '\n' echo -en '\n' echo 'OtezVikentiy brain corporation!' echo -en '\n' echo -en '\n' 

Contoh skrip Php-fpm-command.sh

 #!/usr/bin/env bash cd "`dirname \"$0\"`" && \ docker-compose exec -T "php-fpm" sh -c "cd /app && $*" 

Contoh skrip Connect-to-php-fpm.sh

 #!/usr/bin/env bash docker exec -i -t --privileged php-fpm bash 

Lingkungan pengembangan lokal berakhir di sini. Selamat, Anda bisa membagikan hasil yang sudah selesai dengan kolega Anda! )

Produktif


Persiapan


Misalkan Anda sudah menulis sesuatu di LAN dan ingin meletakkannya di server produksi atau di server pengujian. Anda memiliki hosting di virtualisasi KVM atau server Anda di kamar sebelah dengan AC.

Untuk menggunakan produk atau beta - server harus memiliki sistem operasi (idealnya linux) dan buruh pelabuhan yang diinstal. Docker dapat diinstal dengan cara yang sama seperti pada LAN, tidak ada perbedaan.

Docker dalam produktivitas sedikit berbeda dari LAN. Pertama, Anda tidak bisa hanya mengambil dan menentukan kata sandi dan informasi lainnya serta membuat dok. Kedua, Anda tidak dapat menggunakan komposisi buruh pelabuhan secara langsung.

Docker menggunakan docker swarm dan docker stack untuk produktivitas. Jika tepat di jari, maka sistem ini hanya berbeda di perintah lain dan di dermaga buruh pelabuhan itu adalah penyeimbang beban untuk cluster (sekali lagi sedikit abstrak, tetapi akan lebih mudah untuk dipahami).

PS: Saya menyarankan Anda untuk berlatih menyiapkan galangan buruh pelabuhan di Vagrant (tidak peduli seberapa paradoks ini terdengar). Resep sederhana untuk pelatihan - mengambil Vagrant kosong dengan sistem operasi yang sama seperti pada produk dan mengkonfigurasinya untuk memulai.

Untuk mengkonfigurasi docker swarm, Anda hanya perlu menjalankan beberapa perintah:

 docker swarm init --advertise-addr 192.168.***.** (ip-  ) mkdir /app (          app) chown docker /app (     ) docker stack deploy -c docker-compose.yml my-first-sf4-docker-app 

Mari kita bahas semua ini dengan sedikit lebih detail.

docker swarm init --advertise-addr - meluncurkan docker swarm sendiri secara langsung dan mencari-cari tautan sehingga Anda bisa menghubungkan beberapa server lain ke "swarm" ini sehingga mereka bekerja di cluster.
mkdir / app && chown .. - Anda harus membuat semua direktori yang diperlukan agar buruh pelabuhan dapat bekerja terlebih dahulu sehingga selama pembuatannya tidak akan mengeluh tentang kurangnya direktori.
docker stack deploy -c docker-compose.yml my-first-sf4-docker-app - perintah ini memulai perakitan aplikasi Anda sendiri, sebuah analog dari docker-menyusun -d hanya untuk gerombolan buruh pelabuhan.

Untuk memulai perakitan apa pun, Anda memerlukan docker-compose.yaml yang sama, tetapi sudah sedikit dimodifikasi khusus untuk produktif / beta.

 version: '3.1' services: php-fpm: image: otezvikentiy/php7.2-fpm:0.0.11 ports: - '9000:9000' networks: - my-test-network depends_on: - postgres - rabbitmq volumes: - /app:/app working_dir: /app deploy: replicas: 1 restart_policy: condition: on-failure placement: constraints: [node.role == manager] nginx: image: nginx:1.15.0 networks: - my-test-network working_dir: /app ports: - '80:80' depends_on: - php-fpm volumes: - /app:/app - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf deploy: replicas: 1 restart_policy: condition: on-failure placement: constraints: [node.role == manager] postgres: image: postgres:9.6 ports: - '5432:5432' working_dir: /app networks: - my-test-network secrets: - postgres_db - postgres_user - postgres_pass environment: POSTGRES_DB_FILE: /run/secrets/postgres_db POSTGRES_USER_FILE: /run/secrets/postgres_user POSTGRES_PASSWORD_FILE: /run/secrets/postgres_pass volumes: - ./data/dump:/app/dump - ./data/postgresql:/var/lib/postgresql/data deploy: replicas: 1 restart_policy: condition: on-failure placement: constraints: [node.role == manager] rabbitmq: image: rabbitmq:3.7.5-management networks: - my-test-network working_dir: /app hostname: my-test-sf4-app-rabbit-mq volumes: - /app:/app ports: - '5672:5672' - '15672:15672' secrets: - rabbitmq_default_user - rabbitmq_default_pass - rabbitmq_default_vhost environment: RABBITMQ_DEFAULT_USER_FILE: /run/secrets/rabbitmq_default_user RABBITMQ_DEFAULT_PASS_FILE: /run/secrets/rabbitmq_default_pass RABBITMQ_DEFAULT_VHOST_FILE: /run/secrets/rabbitmq_default_vhost deploy: replicas: 1 restart_policy: condition: on-failure placement: constraints: [node.role == manager] elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.3.0 networks: - my-test-network depends_on: - postgres environment: - discovery.type=single-node - discovery.zen.ping.unicast.hosts=elasticsearch - bootstrap.memory_lock=true - ES_JAVA_OPTS=-Xms512m -Xmx512m ports: - 9200:9200 - 9300:9300 working_dir: /app volumes: - /app:/app - ./data/elasticsearch:/usr/share/elasticsearch/data deploy: replicas: 1 restart_policy: condition: on-failure placement: constraints: [node.role == manager] jenkins: image: otezvikentiy/jenkins:0.0.2 networks: - my-test-network ports: - '8080:8080' - '50000:50000' volumes: - /app:/app - ./data/jenkins:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker deploy: replicas: 1 restart_policy: condition: on-failure placement: constraints: [node.role == manager] volumes: elasticsearch: postgresql: jenkins: networks: my-test-network: secrets: rabbitmq_default_user: file: ./secrets/rabbitmq_default_user rabbitmq_default_pass: file: ./secrets/rabbitmq_default_pass rabbitmq_default_vhost: file: ./secrets/rabbitmq_default_vhost postgres_db: file: ./secrets/postgres_db postgres_user: file: ./secrets/postgres_user postgres_pass: file: ./secrets/postgres_pass 

Seperti yang Anda lihat, file pengaturan untuk produk sedikit berbeda dari file untuk LAN. Itu menambahkan rahasia, penyebaran dan jaringan.

rahasia - file untuk menyimpan kunci. Kunci dibuat cukup sederhana. Anda membuat file dengan nama kunci - tulis nilai di dalamnya. Setelah itu, di docker-compose.yml Anda menentukan bagian rahasia dan mentransfer seluruh daftar file dengan kunci untuk itu. Lebih detail .
jaringan - ini menciptakan jaringan internal tertentu di mana wadah saling berkomunikasi. Pada LAN - ini dilakukan secara otomatis, tetapi pada produktif - ini perlu dilakukan sedikit secara manual. Plus, Anda dapat menentukan pengaturan tambahan kecuali yang standar. Lebih detail .
menyebarkan adalah perbedaan utama antara LAN dan Produk / Beta.

  deploy: replicas: 1 restart_policy: condition: on-failure placement: constraints: [node.role == manager] 

Perangkat tempur minimum:

replika - menunjukkan jumlah replika yang perlu Anda jalankan (pada kenyataannya, ini digunakan jika Anda memiliki cluster dan Anda menggunakan penyeimbang beban dari buruh pelabuhan). Misalnya, Anda memiliki dua server dan Anda menghubungkannya melalui docker swarm. Menentukan angka 2 di sini, misalnya, 1 instance akan dibuat pada 1 server, dan yang kedua pada server kedua. Dengan demikian, beban di server akan dibagi dua.
restart_policy - kebijakan "menaikkan kembali" kontainer secara otomatis jika jatuh karena suatu alasan.
penempatan - lokasi instance wadah. Misalnya, ada saat-saat Anda ingin semua instance wadah berputar di hanya 1 dari 5 server, dan tidak didistribusikan di antara mereka.

Saya ingin membaca dokumentasinya!

Jadi, kami mendapat sedikit lebih baik tentang apa yang membedakan docker-compose.yaml untuk LAN dari produk / versi beta. Sekarang mari kita coba menjalankan bisnis ini.

Misalkan Anda sedang berlatih tentang Vagrant dan di root server Anda sudah memiliki file yang dikonfigurasi untuk produk docker-compose.yml

 sudo apt-get update sudo apt-get -y upgrade sudo apt-get install -y language-pack-en-base export LC_ALL=en_US.UTF-8 export LANGUAGE=en_US.UTF-8 export LANG=en_US.UTF-8 curl -sSl https://get.docker.com/ | sh sudo usermod -aG docker ubuntu sudo apt-get install git sudo docker swarm init --advertise-addr 192.168.128.77 sudo mkdir /app sudo chmod 777 /app -R docker stack deploy -c /docker-compose.yml my-app git clone git@bitbucket.org:JohnDoe/my-app.git /app docker stack ps my-app docker stack ls docker stack services my-app 

PS: jangan menendang untuk sudo dan 777, tentu saja tidak layak melakukannya pada yang produktif. Ini hanya untuk kecepatan belajar.

Jadi, kami paling tertarik pada garis yang terkait dengan buruh pelabuhan.
Pertama kita menginisialisasi "swarm" (buruh pelabuhan).
Lalu kami membuat direktori yang diperlukan untuk bekerja.
Unduh lobak dengan kode SF4 kami di direktori / app.
Setelah itu ada tiga perintah: ps, ls dan layanan.

Masing-masing berguna dengan caranya sendiri. Saya paling sering menggunakan ps, karena menampilkan status wadah dan bagian dari kesalahan, jika ada.

Katakanlah kontainer telah meningkat, tetapi beberapa dari mereka terus-menerus crash dengan kesalahan dan di docker ps aplikasi saya Anda melihat banyak restart. Untuk melihat alasan musim gugur, Anda perlu menjalankan docker container ps -a - dan di sana akan muncul wadah yang terus jatuh. Akan ada banyak contoh dari wadah yang sama, misalnya my-app_php-fpm.1. * Beberapa hash *.

Dengan demikian, sekarang, mengetahui nama wadah, jalankan log buruh pelabuhan my-app_php-fpm.1. * Beberapa hash * sengit dan melihat melalui log. Perbaiki kesalahan dan mulai kembali SEMUANYA. Untuk menggedor semua wadah, Anda dapat melakukan ini:

 docker stack rm my-app 

Setelah itu, Anda akan memiliki gerombolan yang bersih tanpa wadah. Perbaiki kesalahan - dan sekali lagi docker stack deploy -c docker-compose.yml my-app.

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


All Articles