Pengembangan untuk Docker. Lingkungan lokal. Bagian 2 - Nginx + PHP + MySql + phpMyAdmin

Untuk pemahaman yang lebih baik tentang materi berikut, Anda disarankan untuk terlebih dahulu membaca Posting Sebelumnya

Pertimbangkan contoh pengembangan lingkungan lokal yang terdiri dari sekelompok Nginx + PHP + MySql + phpMyAdmin. Bundel ini sangat populer dan dapat memenuhi sejumlah kebutuhan standar pengembang biasa.

Seperti pada posting sebelumnya, penekanan akan dialihkan ke utilitas docker-compose daripada buruh pelabuhan dalam bentuk yang paling murni.

Jadi ayo pergi!

Mari kita mulai dengan docker-compose.yml, yang ada di folder proxy terpisah:

docker-compose.yml untuk nginx-proxy
version: '3.0' services: proxy: image: jwilder/nginx-proxy ports: - 80:80 volumes: - /var/run/docker.sock:/tmp/docker.sock:ro networks: - proxy networks: proxy: driver: bridge 


File yang disajikan menjelaskan konfigurasi untuk membuat satu wadah dengan nama proxy berdasarkan gambar: jwilder / nginx-proxy image dan membuat jaringan dengan nama yang sama. Arahan jaringan menunjukkan ke jaringan mana kontainer terhubung, dalam contoh ini, ini adalah jaringan proxy kami.

Saat membuat jaringan, arahan driver: bridge dapat dihilangkan. Driver jembatan adalah driver default. Wadah ini akan berkomunikasi melalui jaringan dengan wadah lain.

Gambar jwilder / nginx-proxy adalah dasar dan diambil, dan Docker Hub juga menyediakan deskripsi penggunaannya yang cukup luas dan terperinci. Prinsip operasi nginx-proxy cukup sederhana: ia mengakses informasi tentang menjalankan kontainer melalui soket buruh pelabuhan yang diteruskan, menganalisis keberadaan variabel lingkungan dengan nama VIRTUAL_HOST dan mengalihkan permintaan dari host yang ditentukan ke wadah yang ditetapkan untuk variabel lingkungan yang ditetapkan.

Kami memulai proxy dengan perintah docker-compose up -d yang sudah dikenal, kami amati output berikut:

 Creating network "proxy_proxy" with driver "bridge" Creating proxy_proxy_1 ... done 

Kesimpulan ini memberi tahu kami bahwa pada awalnya jaringan proxy_proxy dibuat, dan kemudian wadah proxy_proxy_1 dibuat. Nama jaringan diperoleh dari nama folder tempat file docker-compose.yml berada, saya memiliki proxy dan nama jaringan dengan nama yang sama.

Jika Anda memasukkan perintah ls jaringan docker , kita akan melihat daftar jaringan buruh pelabuhan di sistem kami dan salah satunya adalah proxy_proxy.

Nama kontainer dibuat dengan prinsip yang sama dengan nama folder plus nama layanan dan nomor, yang memungkinkan kontainer dengan nama yang mirip tidak dapat diduplikasi. Menggunakan direktif container_name , Anda dapat menentukan nama wadah secara eksplisit, tetapi saya menemukan ini fungsi yang agak tidak berguna. Ini akan dibahas lebih rinci dalam posting berikut.

Buat docker-compose.yml kedua dengan konten berikut:

docker-compose.yml untuk layanan lain
 version: '3.0' services: nginx: image: nginx environment: - VIRTUAL_HOST=site.local depends_on: - php volumes: - ./docker/nginx/conf.d/default.nginx:/etc/nginx/conf.d/default.conf - ./html/:/var/www/html/ networks: - frontend - backend php: build: context: ./docker/php volumes: - ./docker/php/php.ini:/usr/local/etc/php/php.ini - ./html/:/var/www/html/ networks: - backend mysql: image: mysql:5.7 volumes: - ./docker/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root networks: - backend phpmyadmin: image: phpmyadmin/phpmyadmin:latest environment: - VIRTUAL_HOST=phpmyadmin.local - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=root networks: - frontend - backend networks: frontend: external: name: proxy_proxy backend: 


Apa yang diumumkan di sini?

Empat layanan terdaftar: nginx, php, mysql dan phpmyadmin. Dan dua jaringan. Satu jaringan proxy, yang disebut frontend, diiklankan sebagai jaringan eksternal dan jaringan backend internal baru. Driver untuk itu tidak ditentukan, seperti yang saya tulis sebelumnya, driver default dari tipe jembatan akan digunakan.

nginx


Semuanya harus jelas di sini. Kami menggunakan gambar dasar dengan hub buruh pelabuhan. Variabel lingkungan diperlukan agar proksi berfungsi dan memberitahukannya pada alamat apa wadah harus dapat diakses. Opsi depend_on menunjukkan ketergantungan wadah ini pada wadah php. Ini berarti bahwa wadah php akan diluncurkan terlebih dahulu, dan setelah itu wadah nginx yang bergantung padanya akan diluncurkan. Selanjutnya, kami meneruskan konfigurasi untuk nginx kami. Ini akan menjadi sedikit lebih rendah dan me-mount folder dengan html. Kami juga memperhatikan bahwa wadah memiliki akses ke dua jaringan sekaligus. Ini harus mengkomunikasikan kedua proxy dari jaringan frontend dan php dari jaringan backend. Pada prinsipnya, akan mungkin untuk mendorong semua kontainer ke jaringan frontend yang sama, tapi saya yakin pemisahan seperti itu lebih tepat.

default.nginx
 server { listen 80; server_name_in_redirect off; access_log /var/log/nginx/host.access.log main; root /var/www/html/; location / { try_files $uri /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } } 


default.nginx adalah konfigurasi untuk nginx yang diteruskan ke wadah. Poin kunci di sini adalah arahan php fastcgi_pass: 9000 . Ini menetapkan alamat server FastCGI. Alamat tersebut dapat ditentukan sebagai nama domain atau alamat IP, dan port.

php: 9000 - nama layanan adalah alamat server FastCGI. Nginx yang mengakses php akan menerima alamat IP dari wadah tempat php dijalankan. Port 9000 adalah port standar, dinyatakan saat membuat wadah dasar. Port ini tersedia untuk nginx melalui jaringan, tetapi tidak tersedia di mesin host, karena tidak diteruskan.

php


Tidak biasanya gambar tidak diindikasikan. Alih-alih, ia membangun gambar sendiri langsung dari file penulisan. Arahan konteks menunjuk ke folder tempat Dockerfile berada.

Dockerfile
 FROM php:7.3.2-fpm RUN apt-get update && apt-get install -y \ libzip-dev \ zip \ && docker-php-ext-configure zip --with-libzip \ && docker-php-ext-install zip \ && docker-php-ext-install mysqli COPY --from=composer:latest /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html 


Dockerfile menyatakan bahwa build menggunakan gambar php dasar: 7.3.2-fpm, kemudian perintah untuk menginstal ekstensi php dijalankan. Selanjutnya, komposer disalin dari gambar dasar lain dan direktori kerja untuk proyek diatur. Saya akan mempertimbangkan masalah perakitan secara lebih rinci di pos lain.

Juga, file php.ini dan folder html dengan proyek kami dilemparkan ke dalam wadah.

Perhatikan bahwa php terletak di jaringan backend dan, misalnya, proxy tidak lagi dapat mengaksesnya.

mysql


Gambar mysql dasar diambil dengan tag 5.7, yang bertanggung jawab untuk versi mysql. Folder ./docker/mysql/data digunakan untuk menyimpan file basis data (Anda bahkan tidak perlu membuatnya, itu dibuat saat startup). Dan melalui variabel lingkungan, kata sandi diatur untuk pengguna root, juga root.

Basis data terletak di jaringan backend, yang memungkinkannya untuk tetap berhubungan dengan php. Gambar dasar menggunakan port standar 3306. Gambar ini tersedia di jaringan buruh pelabuhan untuk php, tetapi tidak tersedia di mesin host. Jika Anda meneruskan untuk port ini, Anda dapat menghubungkannya, misalnya, dari PHPSTORM yang sama. Tetapi jika antarmuka phpmyadmin sudah cukup untuk Anda, maka Anda tidak bisa melakukan ini.

phpmyadmin


Gambar resmi dari phpmyadmin. Variabel lingkungan menggunakan VIRTUAL_HOST untuk berinteraksi dengan proxy, mirip dengan nginx. PMA_USER dan PMA_PASSWORD akses ke database. Dan PMA_HOST database host itu sendiri. Tapi ini bukan localhost, seperti biasanya, tetapi mysql. Yaitu komunikasi dengan basis data tersedia dengan nama layanannya, yaitu mysql. Wadah phpmyadmin dapat berkomunikasi dengan database, karena memiliki koneksi ke jaringan frontend.

Kami memulai layanan dengan perintah biasa: docker-compose -d.

Kami melihat output berikut:

Peluncuran layanan
 Creating network "lesson2_backend" with the default driver Building php Step 1/4 : FROM php:7.3.2-fpm ---> 9343626a0f09 Step 2/4 : RUN apt-get update && apt-get install -y libzip-dev zip && docker-php-ext-configure zip --with-libzip && docker-php-ext-install zip && docker-php-ext-install mysqli ---> Using cache ---> 5e4687b5381f Step 3/4 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer ---> Using cache ---> 81b9c665be08 Step 4/4 : WORKDIR /var/www/html ---> Using cache ---> 3fe8397e92e6 Successfully built 3fe8397e92e6 Successfully tagged lesson2_php:latest Pulling mysql (mysql:5.7)... 5.7: Pulling from library/mysql fc7181108d40: Already exists 787a24c80112: Already exists a08cb039d3cd: Already exists 4f7d35eb5394: Already exists 5aa21f895d95: Already exists a742e211b7a2: Already exists 0163805ad937: Already exists 62d0ebcbfc71: Pull complete 559856d01c93: Pull complete c849d5f46e83: Pull complete f114c210789a: Pull complete Digest: sha256:c3594c6528b31c6222ba426d836600abd45f554d078ef661d3c882604c70ad0a Status: Downloaded newer image for mysql:5.7 Creating lesson2_php_1 ... done Creating lesson2_mysql_1 ... done Creating lesson2_phpmyadmin_1 ... done Creating lesson2_nginx_1 ... done 


Kita melihat bahwa pada awalnya jaringan lesson2_backend dibuat, kemudian gambar php dirakit, maka gambar yang belum ada dalam sistem (tarikan) dapat diunduh dan layanan yang dijelaskan benar-benar diluncurkan.

Sentuhan terakhir, agar semuanya berfungsi, ini tambahan untuk host atau domain sites.local dan phpmyadmin.local.

Isi index.php mungkin sebagai berikut:

index.php
 <?php //phpinfo(); $link = mysqli_connect('mysql', 'root', 'root'); if (!$link) { die(' : ' . mysqli_error()); } echo ' '; mysqli_close($link); 


Di sini kita memeriksa bahwa koneksi dari ekstensi php - mysqli, yang ditambahkan selama perakitan Dockerfile, sudah benar.

Dan perhatikan bahwa untuk koneksi dengan wadah, nama layanan digunakan - mysql.

Struktur seluruh proyek adalah sebagai berikut:

Struktur proyek
 habr/lesson2$ tree . ├── docker │ ├── mysql │ │ └── data │ ├── nginx │ │ └── conf.d │ │ └── default.nginx │ └── php │ ├── Dockerfile │ └── php.ini ├── docker-compose.yml ├── html │ └── index.php └── proxy └── docker-compose.yml 

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


All Articles