Laravel + Docker + Gitlab. Di mana untuk memulai

Saya biasanya selalu melakukannya tanpa buruh pelabuhan dan berpikir bahwa buruh pelabuhan hanya diperlukan untuk proyek-proyek besar di perusahaan besar. Tetapi suatu hari saya melihat bagaimana buruh pelabuhan bekerja bersama dengan gitlab teman dan menyadari bahwa saya masih harus mempelajarinya. Namun, seperti biasanya terjadi, saya tidak menemukan satu artikel yang cocok - mereka terlalu kompleks atau tidak lengkap, atau tersirat bahwa Anda semua tahu dengan sendirinya. Saya harus mencari berbagai sumber untuk waktu yang lama, mengumpulkan semuanya dan pada akhirnya saya berhasil membuat proyek sederhana dan CI / CD untuk itu.

Semua pekerjaan dapat dibagi menjadi tiga bagian: pada mesin lokal, pada hitlab dan pada server.

Jadi, untuk implementasi proyek, kita memerlukan akun gitlab dan server jarak jauh dengan virtualisasi KVM atau XEN.

Bagian 1. Mesin lokal


Di mesin lokal, Anda perlu menginstal buruh pelabuhan.

Komentar
. Docker Linux ( Ubuntu, ), Windows MacOS. macos , Windows . - , linux . - , . VirtualBox. Ubuntu

Untuk menginstal di lingkungan Linux, Anda harus menjalankan perintah berikut.

Hapus wadah lama:

sudo apt-get remove docker docker-engine docker.io containerd runc

Perbarui apt:

sudo apt-get update

Instal paket-paket berikut ini sehingga Anda dapat mengunduh buruh pelabuhan dari repositori melalui https:

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

Tambahkan kunci buruh pelabuhan GPG resmi:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Pastikan hasil cetak sudah benar:

sudo apt-key fingerprint 0EBFCD88

Menjawab:

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

Unduh versi stabil:

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Perbarui kembali apt:

sudo apt-get update

Instal mesin buruh pelabuhan terbaru:

sudo apt-get install docker-ce docker-ce-cli containerd.io

Periksa operasi buruh pelabuhan:

sudo docker run hello-world

Jika semuanya benar, unduhan gambar Hello World akan dimulai.

Instruksi lengkap dalam dokumentasi resmi buruh pelabuhan .

Kita juga perlu menginstal docker-compose. Instruksi resmi ada di sini .

Untuk menginstalnya, jalankan perintah di terminal.

Unduh dari repositori:

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Menambahkan latihan yang benar:

sudo chmod +x /usr/local/bin/docker-compose

Pemeriksaan Versi:

sudo docker-compose --version

Kami memasang buruh pelabuhan, sekarang perlu untuk mengumpulkan gambar. Untuk melakukan ini, saya menggunakan artikel dari situs digitalocean: www.digitalocean.com/community/tutorials/how- to-set-up-up-laravel-nginx-and-mysql-with-docker-compose-ru . Akan ada cetak ulang artikel ini.

Mengunduh Laravel dan menginstal dependensi

Pada langkah pertama, kami mengunduh Laravel versi terbaru dan menginstal dependensi proyek, termasuk Composer, manajer paket PHP tingkat aplikasi. Kami akan menginstal dependensi ini menggunakan Docker agar tidak melakukan instalasi global Composer.

Buka direktori home Anda dan klon Laravel versi terbaru ke direktori bernama laravel-app:

cd ~
git clone https://github.com/laravel/laravel.git laravel-app

Pergi ke direktori aplikasi laravel:

cd ~/laravel-app

Kemudian pasang gambar komposer dari Docker ke direktori yang Anda perlukan untuk proyek Laravel Anda untuk menghindari biaya pemasangan Composer secara global:

docker run --rm -v $(pwd):/app composer install

Bendera -v dan --rm dari perintah run docker membuat wadah virtual yang mengikat ke direktori saat ini sampai dihapus. Konten direktori ~ / laravel-app Anda akan disalin ke wadah, dan konten Komposer yang dibuat di dalam wadah folder vendor akan disalin ke direktori saat ini.

Sebagai kesimpulan, setel tingkat izin di direktori proyek sehingga dimiliki oleh pengguna tanpa hak akses root:

sudo chown -R $USER:$USER ~/laravel-app

Ini akan menjadi penting ketika Anda menulis Dockerfile untuk gambar aplikasi Anda, karena itu akan memungkinkan Anda untuk bekerja dengan kode aplikasi dan memulai proses dalam wadah tanpa hak root.

Sekarang Anda telah menempatkan kode aplikasi dan dapat melanjutkan ke definisi layanan menggunakan Docker Compose.

Membuat Docker Compose File

membangun aplikasi dengan Docker Compose menyederhanakan proses konfigurasi dan versi di infrastruktur Anda. Untuk menyesuaikan aplikasi Laravel kami, kami akan membuat file docker-compose dengan definisi layanan server web, database, dan aplikasi.

Buka file:

nano ~/laravel-app/docker-compose.yml

Tiga layanan didefinisikan dalam file pembuatan docker: app, server web dan db. Tambahkan kode berikut ke file, sambil mengganti kata sandi root untuk MYSQL_ROOT_PASSWORD, didefinisikan sebagai variabel lingkungan layanan db, dengan kata sandi pilihan Anda:

~/laravel-app/docker-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge

Layanan berikut termasuk di sini:

  • app: Definisi layanan ini berisi aplikasi Laravel dan meluncurkan gambar Docker yang dipersonalisasi, digitalocean.com/php. Ini juga menetapkan parameter working_dir di wadah ke / var / www.
  • server web: definisi layanan ini mengambil gambar nginx: alpine dari Docker dan membuka port 80 dan 443.
  • db: definisi layanan ini mengambil gambar mysql: 5.7.22 dari Docker dan mendefinisikan variabel lingkungan baru, termasuk basis data laravel untuk aplikasi Anda dan kata sandi root untuk database. Anda dapat menggunakan nama basis data apa pun yang Anda inginkan, Anda juga harus mengganti kata sandi my_mysql_root_password Anda. Definisi layanan ini juga memetakan port host 3306 ke port container 3306.

Setiap properti container_name mendefinisikan nama kontainer yang sesuai dengan nama layanan. Jika Anda tidak mendefinisikan properti ini, Docker akan memberikan setiap nama kontainer yang terdiri dari nama orang historis dan kata acak, dipisahkan oleh garis bawah.

Untuk menyederhanakan interaksi antar wadah, layanan terhubung ke jaringan penghubung yang disebut app-network. Jaringan penghubung menggunakan jembatan perangkat lunak yang memungkinkan kontainer terhubung ke jaringan ini untuk berkomunikasi satu sama lain. Driver bridge secara otomatis menetapkan aturan host sehingga kontainer pada jaringan penghubung yang berbeda tidak dapat berkomunikasi secara langsung satu sama lain. Ini meningkatkan keamanan aplikasi karena hanya layanan terkait yang dapat berkomunikasi satu sama lain. Ini juga berarti bahwa Anda dapat menentukan berbagai jaringan dan layanan yang terhubung ke fungsi terkait: misalnya, layanan aplikasi klien dapat menggunakan jaringan frontend, dan layanan server dapat menggunakan jaringan backend.

Sekarang, mari kita lihat cara menambahkan volume dan mengikat gambar yang dipasang ke definisi layanan untuk menyimpan data aplikasi secara permanen.

Penyimpanan data yang persisten

Docker memiliki sarana yang kuat dan nyaman untuk penyimpanan data yang persisten. Dalam aplikasi kami, kami akan menggunakan volume dan gambar yang dipasang untuk secara permanen menyimpan file database, aplikasi, dan konfigurasi. Volume memberikan fleksibilitas cadangan dan pengawetan setelah penghentian siklus hidup wadah, dan gambar yang dapat dipasang yang dapat dipasang menyederhanakan perubahan kode selama pengembangan dengan segera mencerminkan perubahan pada file host atau direktori dalam wadah. Kami menggunakan kedua opsi.

Peringatan!
, , . , Docker . .

Tentukan volume bernama dbdata di file docker-compose dalam definisi layanan db untuk tetap menggunakan database MySQL:

~/laravel-app/docker-compose.yml

...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network
  ...

Volume bernama dbdata digunakan untuk menyimpan secara permanen isi folder / var / lib / mysql di dalam wadah. Ini memungkinkan Anda untuk menghentikan dan memulai kembali layanan db tanpa kehilangan data.
Tambahkan definisi volume dbdata di akhir file:

~/laravel-app/docker-compose.yml

...
#Volumes
volumes:
  dbdata:
    driver: local

Dengan definisi ini, Anda dapat menggunakan volume ini untuk berbagai layanan.

Kemudian tambahkan ikatan mount image ke layanan db untuk file konfigurasi MySQL:

~/laravel-app/docker-compose.yml

...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
  ...

Gambar yang dipasang ini mengikat file ~ / laravel-app / mysql / my.cnf ke direktori /etc/mysql/my.cnf dalam wadah.

Kemudian tambahkan gambar yang dipasang ke layanan server web. Akan ada dua: satu untuk kode aplikasi, dan yang lainnya untuk menentukan konfigurasi Nginx

~/laravel-app/docker-compose.yml

#Nginx Service
webserver:
  ...
  volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
  networks:
      - app-network

Gambar yang dipasang pertama mengikat kode aplikasi di direktori ~ / laravel-app ke direktori / var / www di dalam wadah. File konfigurasi, ditambahkan ke ~ / laravel-app / nginx / conf.d /, juga dipasang di /etc/nginx/conf.d/ dalam wadah, yang memungkinkan Anda untuk menambah dan mengubah isi direktori konfigurasi sesuai kebutuhan.

Sebagai kesimpulan, tambahkan tunggangan gambar yang dipasang berikut ke layanan aplikasi untuk kode aplikasi dan file konfigurasi:

~/laravel-app/docker-compose.yml

#PHP Service
app:
  ...
  volumes:
       - ./:/var/www
       - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
  networks:
      - app-network

Layanan aplikasi mengikat gambar yang dipasang pada folder ~ / laravel-app, yang berisi kode aplikasi, ke folder / var / www. Ini akan mempercepat proses pengembangan, karena setiap perubahan dalam direktori aplikasi lokal akan segera tercermin dalam wadah. Anda juga menautkan file konfigurasi PHP ~ / laravel-app / php / local.ini ke file /usr/local/etc/php/conf.d/local.ini dalam wadah. Nanti Anda akan membuat file konfigurasi PHP lokal.

File komposisi buruh pelabuhan Anda sekarang akan terlihat seperti ini:

~/laravel-app/docker-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql/
      - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local

Membuat Dockerfile

Docker memungkinkan Anda untuk menentukan lingkungan di dalam masing-masing wadah menggunakan Dockerfile. Dockerfile memungkinkan Anda membuat gambar yang dipersonalisasi. yang dapat digunakan untuk menginstal perangkat lunak aplikasi yang diperlukan dan mengubah pengaturan sesuai kebutuhan. Anda dapat mentransfer gambar yang dibuat ke Docker Hub atau registri pribadi apa pun.

Dockerfile akan berlokasi di direktori ~ / laravel-app. Buat file:

nano ~/laravel-app/Dockerfile

Dockerfile ini akan menentukan gambar dasar dan perintah serta instruksi yang diperlukan untuk membangun gambar aplikasi Laravel. Tambahkan kode berikut ke file:

~/laravel-app/php/Dockerfile

FROM php:7.2-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    mysql-client \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

Pertama, Dockerfile membuat gambar di atas php: gambar Docker 7.2-fpm. Ini adalah gambar berdasarkan instance PHP FastCGI PHP-FPM yang diinstal. File ini juga menginstal paket yang diperlukan untuk Laravel: mcrypt, pdo_mysql, mbstring dan imagick dengan komposer.

Arahan RUN menentukan perintah untuk memperbarui, menginstal, dan mengkonfigurasi parameter di dalam wadah, termasuk pengguna khusus dan grup bernama www. Pernyataan WORKDIR menetapkan direktori / var / www sebagai direktori kerja aplikasi.

Membuat pengguna dan grup terpisah dengan hak akses terbatas mengurangi kerentanan saat meluncurkan wadah Docker, yang secara default dijalankan dengan hak akses root. Alih-alih menjalankan wadah ini dengan hak akses root, kami membuat pengguna www dengan izin baca dan tulis untuk folder / var / www menggunakan perintah COPY dengan flag --chown untuk menyalin izin folder aplikasi.

Perintah EXPOSE membuka port 9000 dalam wadah untuk server php-fpm. CMD menunjukkan perintah yang harus dijalankan setelah wadah dibuat. Di sini, CMD menunjukkan perintah php-fpm yang memulai server.

Ketika Anda selesai melakukan perubahan, simpan file dan tutup editor.

Sekarang Anda dapat beralih ke mendefinisikan konfigurasi PHP Anda.

Pengaturan PHP

Anda telah menentukan infrastruktur dalam file pembuatan docker, dan sekarang Anda dapat mengonfigurasi layanan PHP untuk bertindak sebagai prosesor PHP untuk permintaan Nginx yang masuk.

Untuk mengkonfigurasi PHP, Anda akan membuat file local.ini di folder php. Ini adalah file yang Anda tautkan ke file /usr/local/etc/php/conf.d/local.ini dalam wadah di atas. Membuat file ini akan memungkinkan Anda untuk mengabaikan file php.ini default yang dibaca PHP saat startup.

Buat direktori php:

mkdir ~/laravel-app/php

Kemudian buka file local.ini:

nano ~/laravel-app/php/local.ini

Untuk mendemonstrasikan pengaturan PHP, kami akan menambahkan kode berikut untuk menetapkan batas ukuran unggahan file:

~/laravel-app/php/local.ini

upload_max_filesize=40M
post_max_size=40M

Arahan upload_max_filesize dan post_max_size mengatur ukuran maksimum yang diijinkan dari file yang diunggah dan menunjukkan cara mengatur konfigurasi php.ini dari file local.ini. Anda dapat menyisipkan parameter konfigurasi PHP apa pun yang ingin Anda abaikan dalam file local.ini.

Mengkonfigurasi Nginx

Ketika Anda mengkonfigurasi layanan PHP, Anda dapat memodifikasi layanan Nginx untuk menggunakan PHP-FPM sebagai server FastCGI untuk menyajikan konten dinamis. Server FastCGI didasarkan pada protokol biner untuk interaksi program interaktif dengan server web. Informasi tambahan dapat ditemukan di artikel "Memahami dan Menerapkan FastCGI Proxies in Nginx".
Untuk mengkonfigurasi Nginx, Anda akan membuat file app.conf dengan konfigurasi layanan di folder ~ / laravel-app / nginx / conf.d /.

Pertama-tama buat direktori nginx / conf.d /:

mkdir -p ~/laravel-app/nginx/conf.d

Kemudian buat file konfigurasi app.conf:

nano ~/laravel-app/nginx/conf.d/app.conf

Tambahkan kode berikut ke file untuk mengkonfigurasi Nginx:

~/laravel-app/nginx/conf.d/app.conf

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app: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 / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

Blok server mengkonfigurasi server web Nginx menggunakan arahan berikut:

  • dengarkan: arahan ini mendefinisikan port yang didengarkan oleh server untuk permintaan yang masuk.
  • error_log dan access_log: arahan ini menentukan file untuk logging.
  • root: arahan ini menetapkan path ke folder root, membentuk path lengkap untuk setiap file yang diminta dalam sistem file lokal.

Di blok lokasi php, arahan fastcgi_pass menunjukkan bahwa layanan aplikasi mendengarkan pada soket TCP pada port 9000. Dengan itu, server PHP-FPM mendengarkan pada jaringan, bukan pada soket Unix. Meskipun soket Unix memberikan keuntungan kecepatan sedikit di atas soket TCP, ia tidak memiliki protokol jaringan dan melompati tumpukan jaringan. Dalam kasus di mana host berada pada sistem yang sama, menggunakan soket Unix mungkin masuk akal, tetapi jika layanan berjalan pada host yang berbeda, soket TCP memberikan keuntungan dengan memungkinkan Anda terhubung ke layanan terdistribusi. Karena wadah aplikasi dan server web kami berjalan pada host yang berbeda, lebih efisien menggunakan soket TCP dalam konfigurasi kami.

Ketika Anda selesai melakukan perubahan, simpan file dan tutup editor.

Berkat pengikatan yang dibuat sebelumnya, setiap perubahan dalam folder nginx / conf.d / langsung tercermin dalam wadah server web.

Sekarang mari kita lihat parameter MySQL.

Menyiapkan MySQL

Setelah mengatur PHP dan Nginx, Anda dapat mengaktifkan MySQL sebagai basis data untuk aplikasi Anda.

Untuk mengkonfigurasi MySQL, Anda perlu membuat file my.cnf di folder mysql. Ini adalah file yang Anda lampirkan ke file /etc/mysql/my.cnf di dalam wadah selama langkah konfigurasi database. Memasang gambar yang dipasang memungkinkan Anda untuk mengabaikan opsi my.cnf, jika dan ketika diperlukan.

Untuk mendemonstrasikan cara kerjanya, kami akan menambahkan pengaturan ke my.cnf yang mencakup log permintaan umum dan mengatur file log.

Buat direktori mysql:

mkdir ~/laravel-app/mysql

Buat file my.cnf:

nano ~/laravel-app/mysql/my.cnf

Tambahkan kode berikut ke file untuk mengaktifkan log kueri dan mengatur lokasi file log:

~/laravel-app/mysql/my.cnf

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

File my.cnf mendukung log dengan mengatur parameter general_log ke 1, yang memungkinkan log umum. Parameter general_log_file menentukan di mana log akan disimpan.

Memulai wadah dan mengubah pengaturan lingkungan

Anda mendefinisikan semua layanan dalam file pembuatan docker dan membuat file konfigurasi untuk layanan ini. Sekarang Anda dapat menjalankan kontainer. Sebagai kesimpulan, kami akan membuat salinan file .env.example yang Laravel sertakan secara default dan beri nama .env, karena Laravel menggunakan file seperti itu untuk menentukan lingkungan:

cp .env.example .env

Setelah memulai wadah, kami akan mengonfigurasi parameter pemasangan khusus dalam file ini.

Sekarang semua layanan Anda didefinisikan dalam file pembuatan docker, dan Anda hanya perlu menjalankan satu perintah untuk memulai semua kontainer, membuat volume dan mengkonfigurasi dan menghubungkan jaringan:

docker-compose up -d

Pertama kali Anda meluncurkan komposisi docker, semua gambar Docker yang diperlukan akan diunduh, yang mungkin memerlukan waktu. Setelah mengunduh gambar dan menyimpannya di komputer lokal, Compose akan membuat wadah Anda. Bendera -d mengubah proses menjadi daemon yang wadahnya tetap berjalan di latar belakang.

Setelah proses selesai, gunakan perintah berikut untuk mendaftar semua wadah yang berjalan:
docker ps


Anda akan melihat hasil berikut dengan data pada aplikasi, server web, dan wadah db:

Output
CONTAINER ID        NAMES               IMAGE                             STATUS              PORTS
c31b7b3251e0        db                  mysql:5.7.22                      Up 2 seconds        0.0.0.0:3306->3306/tcp
ed5a69704580        app                 digitalocean.com/php              Up 2 seconds        9000/tcp
5ce4ee31d7c0        webserver           nginx:alpine                      Up 2 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

Dalam hasil ini, ID KONTAINER adalah pengidentifikasi unik untuk setiap wadah, dan NAMES mencantumkan nama layanan untuk setiap wadah. Anda dapat menggunakan kedua pengidentifikasi ini untuk mengakses kontainer. IMAGE mendefinisikan nama gambar setiap wadah, dan STATUS memberikan informasi tentang status wadah: mulai, dimulai ulang, atau dihentikan.

Sekarang Anda dapat memodifikasi file .env di wadah aplikasi untuk menambahkan parameter spesifik ke sistem Anda.

Buka file dengan exec docker-compose, yang memungkinkan Anda untuk menjalankan perintah tertentu dalam wadah. Dalam hal ini, Anda membuka file untuk diedit:

docker-compose exec app nano .env

Temukan blok yang menentukan DB_CONNECTION dan perbarui untuk mencerminkan pengaturan sistem Anda. Anda akan mengubah bidang-bidang berikut:

  1. DB_HOST akan menjadi wadah basis data db Anda.
  2. DB_DATABASE akan menjadi basis data laravel.
  3. DB_USERNAME akan menjadi nama pengguna untuk basis data Anda. Dalam hal ini, kita akan menggunakan laraveluser.
  4. DB_PASSWORD akan menjadi kata sandi yang dilindungi untuk akun pengguna ini.

/var/www/.env

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password

Hal ini juga diperlukan untuk memperbaiki variabel yang sama dalam file .env.example, karena akan digunakan nanti ketika digunakan ke server.

Kemudian konfigurasikan kunci aplikasi untuk Laravel dengan kunci artisan php: menghasilkan perintah. Perintah ini akan menghasilkan kunci dan menyalinnya ke file .env, yang akan melindungi sesi pengguna dan data terenkripsi:

docker-compose exec app php artisan key:generate

Sekarang Anda memiliki semua pengaturan lingkungan yang diperlukan untuk menjalankan aplikasi. Untuk cache pengaturan ini dalam file yang mempercepat pemuatan aplikasi, jalankan perintah:

docker-compose exec app php artisan config:cache

Pengaturan konfigurasi akan dimuat ke file /var/www/bootstrap/cache/config.php dalam wadah.

Terakhir, buka situs localhost di browser Anda . Halaman utama aplikasi Laravel terbuka.

Membuat pengguna MySQL

Saat memasang MySQL, secara default hanya akun root administratif yang dibuat dengan hak tidak terbatas untuk mengakses server database. Biasanya, ketika bekerja dengan database, yang terbaik adalah menghindari menggunakan akun root administratif. Sebagai gantinya, kami akan membuat pengguna basis data khusus untuk basis data Laravel aplikasi kami.
Untuk membuat pengguna baru, mulai shell interaktif bash di wadah db menggunakan perintah exec docker-compose:

docker-compose exec db bash

Di dalam wadah, masuk ke akun administratif root MySQL:

mysql -u root -p

Anda akan diminta untuk memasukkan kata sandi yang ditentukan untuk akun root MySQL ketika diinstal pada file docker-compose.

Pertama, periksa database laravel yang ditentukan dalam file docker-compose.
Jalankan perintah show databases untuk memverifikasi database yang ada:

show databases;

Dalam hasil, Anda akan melihat database laravel:

Output
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

Kemudian buat akun pengguna yang akan diizinkan mengakses ke basis data ini.
Kami menggunakan nama pengguna laraveluser, tetapi Anda dapat menggantinya dengan nama yang lebih disukai. Pastikan nama pengguna dan kata sandi cocok dengan yang ada di file .env pada langkah sebelumnya:

GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';

Perbarui hak istimewa untuk memberi tahu server MySQL tentang perubahan:

FLUSH PRIVILEGES;

Tutup MySQL:

EXIT;

Keluar dari wadah:

exit

Sekarang Anda dapat melakukan migrasi untuk menguji basis data:

docker-compose exec app php artisan migrate

Hasil konfirmasi migrasi adalah sebagai berikut:

Output

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

Bagian 2. Gitlab


Di Hitlab, Anda perlu membuat proyek baru.

Sekarang kita perlu menyimpan proyek di repositori hitlab. Untuk melakukan ini, panggil perintah berikut dari folder proyek pada mesin lokal:

git init
git remote add origin git@gitlab.com:<>/<>  
git remote add origin https://gitlab.com/<>/<>      SSH
git add .
git commit -m "Initial commit"
git push -u origin master

Proyek akan muncul di Ikhtisar Proyek -> Detail.
Untuk membuatnya nyaman untuk segera mendapatkan lingkungan yang selesai, kami menyimpan gambar buruh pelabuhan dari lingkungan di register hitlist.

Untuk melakukan ini, Anda harus melakukan:

docker login registry.gitlab.com

Dan lemparkan gambar ke gitlab:

docker build -t registry.gitlab.com/<>/<> .
docker push registry.gitlab.com/<>/<>

Gambar akan ditempatkan di

Package- > Container Registry. Untuk menyelesaikannya dengan gitlab, kami segera mendapatkan kunci untuk gitlab-runner. Untuk melakukan ini, pergi ke Pengaturan-> CI / CD-> Runner. Kuncinya ada di langkah 3 di bagian Konfigurasi manual (Mengatur Runner spesifik secara manual).

Bagian 3. Konfigurasi server


Server VPS harus diambil dengan virtualisasi tipe KVM atau XEN. Virtualisasi seperti OpenVZ berbagi inti sistem antara semua pengguna, sehingga tidak memiliki kemampuan untuk mengubah parameter kernel. Untuk pengujian, saya mengambil server KVM dengan Docker terinstal. Namun, mungkin tidak ada buruh pelabuhan di server. Dalam hal ini, Anda harus menginstalnya secara manual. Algoritma ini sama dengan ketika menginstal pada mesin lokal. Juga perlu memeriksa versi php. Untuk Laravel Anda membutuhkan setidaknya 7.2. Saya juga harus secara terpisah menginstal ekstensi untuk php ext-mbstring (dalam kasus saya untuk php 7.3):

sudo apt-get update
sudo apt-get install php7.3-mbstring

Selanjutnya, kita perlu menginstal gitlab-runner. Runner adalah layanan yang akan menerima webhook dari hitlab ketika menerima versi baru dan menyebarkan semuanya di server kami.

Untuk menginstal gitlab-runner yang perlu Anda lakukan:

curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

Setelah mengunduh, tetapkan izin untuk menjalankan:

sudo chmod +x /usr/local/bin/gitlab-runner

Selanjutnya, buat pengguna gitlab-runner dan jalankan layanan gitlab runner:

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

Daftar pelari. Untuk melakukan ini, kita memerlukan token dari bagian 2 artikel ini:

sudo gitlab-runner register

Sebagai tanggapan, mereka akan menanyakan alamat hitlab Anda.

Tentukan gitlab.com :

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com

Selanjutnya, Anda harus memasukkan token. Masukkan token dari bagian 2.

Please enter the gitlab-ci token for this runner
xxx

Selanjutnya, tentukan deskripsi dan tag yang dipisahkan oleh koma. Kemudian kami ditawari untuk memilih pelaksana. Di sini Anda perlu memilih shell:


Please enter the executor:
shell

Seperti yang saya pahami, eksekutor adalah lingkungan di mana kode dari file .gitlab-ci.yml dieksekusi. Ada bash, ssh, buruh pelabuhan, paralel, kotak virtual dan kubernet untuk dipilih. Dokumentasi merekomendasikan bahwa jika Anda tidak tahu apa yang harus digunakan, gunakan bash. Ini adalah opsi universal yang berjalan pada baris perintah di server Anda.

Maka kita perlu menambahkan pengguna gitlab-runner ke grup pengguna buruh pelabuhan.

sudo usermod -aG docker gitlab-runner

Untuk menghindari kesalahan akses, tambahkan ke sudoers

sudo nano /etc/sudoers

baris

gitlab-runner ALL=(ALL) NOPASSWD: ALL

Sekarang kita dapat membuat file .gitlab-ci.yml. Hal ini diperlukan untuk pelaksanaan yang disebut Pipeline: urutan perintah untuk menggunakan proyek.

Untuk melakukan ini, pergi ke repositori proyek pada daftar hit dan klik Buat file baru. Gitlab sendiri akan menawarkan templat file, di antaranya Anda harus memilih .gitlab-ci.yml. Setelah membuat file di gitlab, Anda dapat memilih template untuk konten file. Saya memilih laravel dan mengubahnya sedikit untuk diri saya sendiri:


# This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/php
# .    ,        
image: registry.gitlab.com/<>/<>:latest

# Pick zero or more services to be used on all builds.
# Only needed when using a docker container to run your tests in.
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-a-service
services:
  - mysql:latest
#    
variables:
  MYSQL_DATABASE: laravel
  MYSQL_ROOT_PASSWORD: ***********

# This folder is cached between builds
# ,      
# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
cache:
  paths:
    - vendor/
    - node_modules/

# This is a basic example for a gem or script which doesn't use
# services such as redis or postgres
#     
before_script:
  #   
  - sudo apt-get update -yqq
  #    nodejs
  - sudo apt-get install gnupg -yqq
  #  Node   12
  - curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
  #  
  - sudo apt-get install git nodejs libcurl4-gnutls-dev libicu-dev libmcrypt-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libpq-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev -yqq
  #  composer
  - curl -sS https://getcomposer.org/installer | php
  - php composer.phar install
  - composer install
  #   Node
  - npm install
  # Copy over testing configuration.
  # Don't forget to set the database config in .env.testing correctly
  - DB_HOST=mysql
  - DB_DATABASE=laravel
  - DB_USERNAME=root
  - DB_PASSWORD=*********
  #  .env.example    .env
  - cp .env.example .env
  #  npm build
  - npm run dev
  #       laravel
  - php artisan key:generate
  - php artisan config:cache
  - php artisan route:clear
  - php artisan config:clear
  - php artisan cache:clear
  #  .
  - docker-compose exec app php artisan migrate
  #   
  #- docker-compose exec app php artisan db:seed

#
test:
  script:
    #  
    - php vendor/bin/phpunit --coverage-text --colors=never
    #  npm
    - npm test

#       
deploying:
  stage: deploy
  script:
    - echo "Deployed"
    - docker-compose stop
    - docker-compose up -d

Setelah berhasil mengeksekusi pipeline (CI / CD-> Pipelines) di alamat ip server Anda, Anda akan melihat halaman laravel Anda.

Untuk mengkonfigurasi CI / CD, saya menggunakan instruksi dari Sean Bradley:


dan medium.com/@sean_bradley/auto-devops-with-gitlab-ci-and-docker-compose-f931233f080f

All Articles