Belum lama ini, ketua tim berkata: kawan-kawan saya ingin semua orang memiliki lingkungan pengembangan yang sama untuk proyek tempur kami + kita harus dapat men-debug semuanya - baik aplikasi web, dan permintaan api, dan skrip konsol untuk menghemat waktu dan saraf kita. Dan bantu kami dengan buruh pelabuhan ini.
Tidak lebih cepat dikatakan daripada dilakukan. Detail di bawah potongan.
Ada banyak manual peti kemas pada jaringan, tetapi bagaimana menerapkannya pada pengembangan pertempuran nyata? Untuk setiap proyek, tulislah docker-compose.yml Anda sendiri? Tetapi semua proyek kami berkomunikasi satu sama lain melalui api, mereka semua menggunakan tumpukan teknologi standar: nginx + php-fpm + mysql.
Karena itu, mari kita perjelas kondisi masalah:
- Kami bekerja di sebuah perusahaan, dalam sebuah tim, menemani beberapa proyek pertempuran. Kita semua bekerja di bawah Ubuntu + PhpStorm
- Untuk pengembangan lokal, kami ingin menggunakan buruh pelabuhan agar memiliki lingkungan pengembangan yang sama untuk setiap anggota tim, dan juga agar ketika pengembang baru tiba, ia dapat dengan cepat menyebarkan lingkungan kerja
- Kami ingin berkembang dengan nyaman, kami ingin memulai segalanya: baik aplikasi web, dan skrip konsol, dan permintaan api.
Sekali lagi: kami ingin membawa
beberapa proyek kerja ke buruh pelabuhan.
Pada server tempur, bundel nginx + php-fpm + mysql standar digunakan. Dan apa masalahnya?
Kami menggunakan lingkungan yang sama persis + Xdebug pada mesin lokal, mengonfigurasi proyek kami di PhpStorm, dan bekerja. Untuk debug, nyalakan "tabung" di PhpStorm, semuanya bekerja di luar kotak, semuanya baik-baik saja.

Semua ini benar - semuanya berfungsi di luar kotak. Tapi, mari kita coba lihat di bawah kap lingkungan kerja kita.
Nginx + php-fpm berkomunikasi melalui soket, xdebug mendengarkan pada port 9000, PhpStorm juga, secara default, mendengarkan pada port 9000 untuk debugging dan semuanya tampak baik-baik saja. Dan jika kita memiliki beberapa aplikasi terbuka di PhpStorm, dan penyadapan ("tabung)" diaktifkan untuk beberapa aplikasi? Apa yang akan dilakukan PhpStorm? Dia akan mulai bersumpah bahwa koneksi baru untuk Xdebug telah terdeteksi, apakah Anda ingin mengabaikannya atau tidak?
Yaitu, dengan pengaturan default di PhpStorm, pada titik waktu tertentu, saya hanya dapat debut satu aplikasi. Untuk semua aplikasi terbuka lainnya, debug harus dimatikan. Sial, tapi tidak nyaman. Saya ingin mendengarkan semua aplikasi untuk debug, dan jika ada breakpoint di salah satu dari mereka, maka saya ingin PhpStorm berhenti di aplikasi ini, pada baris di mana saya membutuhkannya.
Dan apa yang dibutuhkan untuk ini? Tetapi Anda membutuhkan setiap aplikasi untuk memulai dengan pengaturannya sendiri untuk Xdebug. Sehingga setiap aplikasi mendengarkan port-nya, mencari servernya, dan tidak seperti kita memiliki semua kesamaan, semuanya dalam satu tumpukan.
Dan untuk ini ada buruh pelabuhan yang luar biasa! Kita dapat meluncurkan masing-masing aplikasi tempur kita dalam wadah terpisah, berdasarkan pada satu gambar umum, misalnya, php: 7.1-fpm. Berkat teknologi buruh pelabuhan, kami dapat mengisolasi aplikasi kami dengan overhead yang minimal.
Ok, mari kita mulai proyek tempur kita di bawah buruh pelabuhan, jalankan setiap proyek dalam wadah yang terpisah, konfigurasikan setiap proyek di PhpStorm untuk debug secara individual, semuanya harus baik-baik saja.
Dan, oops, masalah pertama: kontainer di buruh pelabuhan dijalankan sebagai root, dan secara lokal kami bekerja, biasanya sebagai pengguna dengan uid 1000, gid 1000. Aplikasi sedang berjuang, dan memberikan setiap aplikasi 777 hak untuk semuanya bukan merupakan pilihan. Aplikasi kita berada di bawah git, dan jika kita memberikan hak 777 secara lokal, maka git akan mencatat semua ini dan mentransfernya ke server pertempuran.
Kruk, berikut adalah contoh gambar php: 7.1-fpm yang akan dikompilasi.
Perbarui
Seperti yang ditunjukkan oleh komunitas dengan tepat, sama sekali tidak perlu kruk.
Misalnya 1tidak
mengubah habrozer dalam komentarContoh gambar php awal: 7.1-fpm (uid dan gid di-hardcode)FROM php:7.1-fpm RUN apt-get update && apt-get install -y \ git \ curl \ wget \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev zlib1g-dev libicu-dev g++ libmagickwand-dev libxml2-dev \ && docker-php-ext-configure intl \ && docker-php-ext-install intl \ && docker-php-ext-install mbstring zip xml gd mcrypt pdo_mysql \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && pecl install imagick \ && docker-php-ext-enable imagick \ && pecl install xdebug \ && docker-php-ext-enable xdebug ADD ./php.ini /usr/local/etc/php/php.ini RUN wget https:
Contoh Dockerfile terkoreksi
FROM php:7.1-fpm ARG USER_ID ARG GROUP_ID RUN apt-get update && apt-get install -y \ git \ curl \ wget \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev zlib1g-dev libicu-dev g++ libmagickwand-dev --no-install-recommends libxml2-dev \ && docker-php-ext-configure intl \ && docker-php-ext-install intl \ && docker-php-ext-install mbstring zip xml gd mcrypt pdo_mysql \ && pecl install imagick \ && docker-php-ext-enable imagick \ && pecl install xdebug-2.5.0 \ && docker-php-ext-enable xdebug ADD ./php.ini /usr/local/etc/php/php.ini RUN wget https://getcomposer.org/installer -O - -q \ | php -- --install-dir=/bin --filename=composer --quiet RUN usermod -u ${USER_ID} www-data && groupmod -g ${GROUP_ID} www-data WORKDIR /var/www USER "${USER_ID}:${GROUP_ID}" CMD ["php-fpm"]
Saat memulai sebuah wadah dari gambar ini, pengguna data-www mendapat uid = 1000, gid = 1000. Biasanya, pengguna pertama yang dibuat di Linux memiliki hak ini. Dan, persis dengan hak-hak tersebut, wadah php-fpm kami akan berfungsi. Saya akan sangat berterima kasih jika seseorang memberi tahu saya cara bekerja tanpa kruk dengan hak akses ke buruh pelabuhan.Saat memulai sebuah wadah dari gambar ini, pengguna data-www mendapat uid dan gid, yang akan ditransfer dari luar.
Juga di komentar topik yang diangkat : mengapa mengubah hak pengguna data-www sama sekali, mengapa hak standar tidak sesuai 33. Hanya satu hal: ketika kita masuk ke wadah dan membuat, misalnya, file migrasi, kita tidak akan menjadi pemilik file pada mesin host. Dan setiap kali akan diperlukan untuk menjalankan sesuatu seperti
sudo chown -R user:user ./
Dan masalah kecil kedua: agar Xdebug berfungsi dengan benar, Anda harus mendaftarkan alamat ip yang benar untuk mesin host. Setiap anggota tim berbeda. 127.0.0.1 tidak bergulir. Dan di sini buruh pelabuhan itu sendiri membantu kami. Sebagai contoh, kita dapat secara eksplisit mengkonfigurasi jaringan - 192.168.220.0/28. Dan kemudian mesin kami akan selalu memiliki alamat 192.168.220.1. Kami akan menggunakan alamat ini untuk mengkonfigurasi PhpStorm, serta mengkonfigurasi aplikasi lain. Misalnya, ketika bekerja dengan MySql.
Docker-compose.yml sendiri, setelah mempertimbangkan komentar, terlihat seperti ini:
version: '3' services: php71-first: build: context: ./images/php71 args: - USER_ID - GROUP_ID volumes: - ./www:/var/www - ./aliases/php71/bash.bashrc:/etc/bash.bashrc environment: XDEBUG_CONFIG: "remote_host=192.168.220.1 remote_enable=1 remote_autostart=off remote_port=9008" PHP_IDE_CONFIG: "serverName=first" networks: - test-network php71-two: build: context: ./images/php71 args: - USER_ID - GROUP_ID volumes: - ./www:/var/www - ./aliases/php71/bash.bashrc:/etc/bash.bashrc environment: XDEBUG_CONFIG: "remote_host=192.168.220.1 remote_enable=1 remote_autostart=off remote_port=9009" PHP_IDE_CONFIG: "serverName=two" networks: - test-network nginx-test: image: nginx volumes: - ./hosts:/etc/nginx/conf.d - ./www:/var/www - ./logs:/var/log/nginx ports: - "8080:80" depends_on: - php71-first - php71-two networks: test-network: aliases:
Kita melihat bahwa dalam konfigurasi ini dua kontainer php71-first dan php71-two dibuat, berdasarkan pada satu gambar php: 7.1-fpm. Setiap kontainer memiliki pengaturannya sendiri untuk Xdebug. Setiap kontainer individu akan mendengarkan, untuk debugging, port dan servernya.
Juga, saya menarik perhatian Anda ke arahan
args: - USER_ID - GROUP_ID
Tanpa variabel-variabel ini, gambar php-fpm tidak akan mulai. Pertanyaan: bagaimana cara mengirimkannya ke docker-compose.yml? Jawab: karena lebih nyaman bagi Anda. Anda bisa saat startup:
USER_ID=$(id -u) GROUP_ID=$(id -g) docker-compose up -d
Anda dapat menulis variabel-variabel ini dalam file .env, yang terletak pada level yang sama dengan file docker-compose.yml
USER_ID=1000
GROUP_ID=1000
Saya suka versi dengan file .env lebih banyak. Tentu saja, Anda bisa menggunakan Makefile. Anda lebih suka.
Kode lengkap untuk versi demo diposting di
github .
Daftar proyek demo:

Secara singkat memeriksa daftar proyek.
Alias -> php71 -> direktori bash.bashrc. Momen kontroversial. Saya lebih suka berkomunikasi dengan wadah php-fpm melalui alias.
File ini diteruskan ke docker-compose.yml: - ./aliases/php71/bash.bashrc:/etc/bash.bashrc
Alat standar Linux.
Direktori hosts - file konfigurasi untuk Nginx. Setiap konfigurasi memiliki wadah php-fpm sendiri. Contoh:
server { listen 80; index index.php; server_name first.loc; error_log /var/log/nginx/first_error.log; root /var/www/first.loc; location / { try_files $uri /index.php?$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$;
Direktori gambar - instruksi untuk merakit gambar php-fpm, direktori mysql - kami menyimpan database, direktori www - semua proyek web kami, dalam contoh kami first.loc dan two.loc.
Mari kita simpulkan hasil antara : menggunakan kemampuan buruh pelabuhan, kami meluncurkan semua proyek kerja kami dalam satu lingkungan. Semua proyek kami saling melihat, pengaturan unik untuk Xdebug terdaftar untuk masing-masing proyek.
Masih untuk mengkonfigurasi PhpStorm dengan benar untuk setiap proyek. Saat mengatur, kita harus mendaftarkan port untuk debug dan nama server di beberapa tempat.
Buat proyek di PhpStorm



Kami akan mengonfigurasi bagian menu
- PHP (Anda harus mendaftarkan CLI Interpreter dengan benar),
- Debug (ubah port menjadi 9008, seperti pada file docker-compose.yml),
- Proxy DBGp (kunci IDE, Host, Port),pembaruan Berkat
browser hub CrazyLazy untuk poin penting. Item menu proksi DBGp tidak perlu dikonfigurasi.
- Server (Anda harus menentukan nama server dengan benar, seperti pada file docker-compose.yml, dan menggunakan pemetaan jalur)

Saya akan menyembunyikan semua tangkapan layar lebih lanjut di bawah spoiler.
Mengkonfigurasi CLI Interpreter dari file docker-compose.yml Siapkan bagian menu DebugSekali lagi, kami meresepkan segalanya dari pengaturan docker-compose.yml untuk wadah tertentu. Pada langkah yang sama, kami memvalidasi cara kerja debug kami.


Siapkan bagian menu ServerPenting untuk mendaftar dengan benar pemetaan penggunaan jalur, sekali lagi kami mengambil nama server dari pengaturan


Kami meninggalkan bagian menu File -> Settings, pergi ke bagian menu Run -> Edit Configuration, buat Php Web Page Yah, itu saja. Ada banyak surat yang ditulis, sepertinya semuanya tidak mudah
Padahal, yang utama adalah memahami hal yang sangat sederhana. Berkat teknologi buruh pelabuhan, kami dapat menjalankan semua aplikasi yang berfungsi dalam satu ruang, tetapi dengan pengaturan yang berbeda untuk Xdebug. Setiap aplikasi bekerja dalam wadahnya sendiri, dan kita harus hati-hati meresepkan pengaturan untuk setiap aplikasi di PhpStorm.
Dan di pintu keluar kita mendapatkan gambar yang indah.
1. Kami mengkloning repositori di
github . Buat file .env dengan variabel
USER_ID= uid
GROUP_ID= gid
2. Kami mendaftarkan node first.loc dan two.loc di file / etc / hosts
127.0.0.1 first.loc 127.0.0.1 two.loc
3. Di folder git, jalankan perintah
docker-compose up -d
4. Kami mengkonfigurasi kedua proyek first.loc dan two.loc di PhpStorm, seperti dijelaskan di atas, dan menjalankan kedua proyek di PhpStorm. Yaitu kami memiliki dua jendela PhpStorm terbuka, dengan dua proyek, masing-masing dari mereka mendengarkan koneksi masuk (handset aktif).
5. Dalam proyek two.loc kita meletakkan breakpoint pada baris kedua, misalnya,. Dalam proyek first.loc pertama, kami memulai permintaan http dari file http.http
Dan lihatlah! Kami dilemparkan ke proyek kedua, di breakpoint kami.
Untuk men-debug skrip konsol, kami melakukan hal yang persis sama. Kita nyalakan penyadapan untuk penyadapan, atur breakpoint, pergi ke wadah yang tepat, jalankan skrip yang tepat.
Sesuatu seperti:
alex@alex-Aspire-ES1-572 ~ $ php71first www-data@a0e771cfac72:~$ cdf www-data@a0e771cfac72:~/first.loc$ php index.php I'am first host www-data@a0e771cfac72:~/first.loc$
Di mana php71first adalah alias pada mesin host:
alias php71first="cd ~/docker_git && docker-compose exec php71-first bash"
cdf
- alias yang bekerja di sebuah wadah. Saya menulis di atas bahwa saya lebih suka menggunakan alias untuk berkomunikasi dengan wadah.
Itu semua, kritik yang membangun, komentar disambut.
PS Saya ingin mengucapkan terima kasih yang mendalam kepada Denis Bondar untuk artikelnya
PhpStorm + Docker + Xdebug , yang merupakan titik awal untuk menulis tutorial ini.