GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Semua yang Perlu Anda Ketahui tentang Menggunakan Docker Compose

Jika Anda bertanya-tanya bagaimana cara membuat wadah Docker yang dapat direproduksi dengan Docker Compose, Anda telah datang ke tempat yang tepat. Dalam tutorial Docker Compose langkah demi langkah ini, Anda akan mempelajari cara membuat container sederhana, memetakan port dengan Docker Compose hingga skenario multi-container yang kompleks.

Apakah kamu siap? Ayo gali!

Prasyarat

Jika Anda ingin mengikuti langkah demi langkah, dalam tutorial ini, pastikan Anda memiliki yang berikut:

  1. Instalasi baru Ubuntu Server LTS dengan SSH Diaktifkan . Panduan ini akan menggunakan Ubuntu Server LTS 20.04.1 sebagai mesin host Docker.
  2. Komputer dengan VS Code terpasang (opsional). Panduan ini akan menggunakan Visual Studio Code 1.52.1 untuk SSH ke host Docker dan menjalankan perintah.
  3. Ekstensi SSH resmi VS Code terpasang dan terhubung ke host Docker. (opsional)

Apa itu Penulisan Docker?

Perintah tunggal bisa menjadi panjang, sangat panjang di Docker. Ambil contoh di bawah ini. Contoh ini membuat wadah untuk aplikasi perangkat lunak yang disebut bookstack.

docker create \
   --name=bookstack \
   -e PUID # UID of user to take ownership of application/files \
   -e PGID # GID of user to take ownership of application/files \
   -e DB_USER # The database user \
   -e DB_PASS # The database password \
   -e DB_HOST # The database host \
   -e DB_DATABASE # The database to be used \
   -e APP_URL # The url your application will be accessed on (required for correct operation of reverse proxy) \
   -v /host/path/to/config:/config # Location of any uploaded data \
   -p 80:80/tcp # Web UI port \
   --restart unless-stopped \
   linuxserver/bookstack:version-v0.31.4

Seiring dengan meningkatnya kompleksitas lingkungan buruh pelabuhan, demikian pula jumlah flag dan kondisi yang diperlukan untuk penyiapan container yang berfungsi. Baris perintah Docker mulai menjadi rumit dan sulit untuk dipecahkan; terutama setelah pengaturan multi-kontainer mulai memasuki campuran.

Docker Compose adalah cara untuk membuat wadah Docker yang dapat direproduksi menggunakan file konfigurasi alih-alih perintah Docker yang sangat panjang. Dengan menggunakan file konfigurasi terstruktur, kesalahan lebih mudah diketahui dan interaksi container lebih mudah ditentukan.

Docker Compose dengan cepat menjadi sangat berharga ketika berhadapan dengan dependensi container atau lingkungan multi-kontainer.

Docker Compose adalah cara fantastis untuk masuk ke Infrastruktur sebagai Kode tanpa kerumitan sistem terdistribusi seperti Kubernetes.

Docker Compose menggunakan struktur file konfigurasi yang disebut YAML . YAML mirip dengan JSON atau HTML karena YAML adalah bahasa terstruktur yang dapat dibaca mesin. YAML secara khusus berfokus untuk menjadi sedapat mungkin dapat dibaca manusia sambil mempertahankan kekuatan terstruktur tersebut.

YAML memang memiliki kelemahan di mana tab dan spasi putih lainnya signifikan dan harus diformat dengan benar. VS Code melakukan banyak kerja keras ini untuk Anda dan juga mengapa Anda akan melihat banyak contoh dilakukan di VS Code.

Memasang Docker Compose

Sekarang mari kita mulai mengotori tangan Anda. Dengan asumsi Anda terhubung ke host Docker Anda, saatnya untuk menginstal Docker Compose.

Docker Compose adalah paket terpisah dari runtime Docker. Tetapi menginstal Docker Compose juga akan menginstal runtime Docker sehingga Anda akan membunuh dua burung dengan satu batu!

Untuk menginstal Docker Compose dan runtime Docker, jalankan dua perintah berikut.

# update the software list (known as a repository) and then install docker compose
# with any needed dependencies. the -y flag is used to skip confirmation
sudo apt update -y
sudo apt install docker-compose -y

Setelah terinstal, Anda sekarang harus membuat struktur folder untuk menyimpan wadah.

Membuat Struktur Folder untuk Penulisan Docker

Sebelum dapat membuat container dengan Docker Compose, Anda harus terlebih dahulu membuat folder untuk menyimpan container. Anda tidak hanya harus membuat struktur folder untuk menyimpan wadah tetapi Anda akan menemukan bahwa berbagai perintah Docker sensitif terhadap lokasi berbagai file konfigurasi; Docker Compose tidak berbeda.

Komponen terpenting dari Docker Compose adalah file konfigurasinya yang bernama docker-compose.yaml . File konfigurasi ini, seperti yang dijelaskan di atas, menentukan bagaimana runtime Docker harus membangun sebuah container.

Saat Anda menjalankan Docker Compose, perintah akan mencari file konfigurasinya di folder yang sama dengan perintah yang dijalankan. Karena persyaratan ini, sebaiknya buat folder terpisah saat menjalankan Docker Compose.

Mungkin hanya ada satu file konfigurasi Docker Compose per folder.

Untuk mendemonstrasikan pembuatan container Docker dengan Docker Compose, pertama-tama buat struktur folder untuk menyimpan container masa depan dan file konfigurasinya menggunakan fileserver kecil bernama Caddy.

Caddy adalah server file, mirip dengan apache httpd atau nginx , tetapi ditulis dalam bahasa Go. Caddy dirancang khusus untuk kemudahan penggunaan (dan akan secara otomatis menghasilkan atau menyajikan file index.html) tanpa konfigurasi. Kombinasi ini menjadikan caddy pilihan yang baik untuk pemula.

Dengan asumsi Anda masuk ke host Docker Anda, buat struktur folder sebagai berikut:

  1. Di direktori home Anda, buat folder bernama containers . Folder ini akan menjadi tempat yang baik untuk wadah ini dan wadah lainnya.
  2. Di dalam wadah folder, buat subfolder bernama caddy . Folder ini akan berisi file konfigurasi Docker Compose dan wadah Caddy itu sendiri.
  3. Terakhir, di dalam folder container, caddy, buat file teks kosong bernama docker-compose.yaml yang akan menjadi file konfigurasi Docker Compose.

Dengan struktur folder dan file konfigurasi Docker Compose yang dibuat, Anda sekarang dapat mulai mengisi file konfigurasi tersebut dengan konfigurasi Docker Compose.

Membuat File Konfigurasi Penulisan Docker

Pada bentuknya yang paling dasar, docker-compose.yaml file untuk wadah caddy terlihat seperti berikut ini. Di editor teks Linux favorit Anda atau dengan VS Code, salin dan tempel kode di bawah ini ke dalam file konfigurasi Docker Compose yang dibuat sebelumnya.

version: "3.7"
services:
  caddy:
    container_name: "caddy"
    image: "caddy:latest"
    ports:
      - "80:80"

Mari menelusuri setiap opsi yang ditampilkan:

  • version menentukan versi file docker-compose. Setiap definisi baru dari Docker Compose mencakup perubahan yang melanggar spesifikasi. Oleh karena itu versi penting agar Docker Compose dapat mengetahui fitur apa saja yang perlu digunakan. Versi 3.7 adalah versi terbaru yang didukung oleh Ubuntu 20.04.1 LTS.

Spesifikasi lengkap untuk Docker Compose 3.x dapat ditemukan di sini. Dokumentasi tertaut menyebutkan setiap opsi yang dapat Anda gunakan dalam Docker Compose

  • services berisi spesifikasi untuk wadah yang sebenarnya. Anda dapat menentukan beberapa wadah di bagian ini.
  • caddy adalah nama wadah pertama (ini murni untuk referensi).
  • container_name mendefinisikan nama sebenarnya yang diberikan ke wadah oleh Docker dan harus unik.
  • image adalah nama gambar. Dalam hal ini, caddy dari Hub Docker didefinisikan. Nama atau nomor setelah tag dipisahkan oleh titik dua adalah versinya.

Pemetaan Port

Opsi terakhir itu secara khusus memerlukan perhatian khusus:

ports:
  - "80:80"

Di Docker Compose, ports direktif memungkinkan Anda untuk mengatur satu atau lebih pemetaan dari Host ke wadah. Misalnya, di atas Anda telah memetakan port 80 pada host ke port 80 pada wadah. Namun, Anda tidak perlu mencocokkan nomor port. Contoh di bawah ini memetakan port 8800 pada host ke port 80 dalam wadah.

ports:
  - "8800:80"

Anda juga dapat menentukan beberapa port seperti di bawah ini.

ports:
  - "80:80"
  - "443:443"

Melakukannya akan memetakan kedua port 80 dan 443 ke host (konfigurasi umum untuk server web, untuk melayani HTTP dan HTTPS).

Pembuat gambar Docker mendefinisikan port yang tersedia pada saat pembuatan. Pastikan untuk memeriksa dokumentasi gambar yang Anda kerjakan di Docker Hub atau situs web pengelola untuk port yang dapat dipetakan. Tidak ada gunanya memetakan port jika port tidak digunakan!

Dengan mengingat hal itu, mari kita lihat cara menjalankan container.

Menjalankan Penampung

Sekarang Anda seharusnya sudah memiliki docker-compose.yaml file di dalam ~\containers\caddy . Anda map. Sekarang saatnya membuat dan memulai wadah Caddy.

Di terminal Anda, jalankan perintah berikut yang akan memunculkan wadah Docker yang didefinisikan di docker-compose.yaml berkas.

# This command must be run in the same folder as the file. The -d flag runs
# the command *detached*, which will bring up the container in the background
sudo docker-compose up -d

Anda mungkin memperhatikan bahwa Anda tidak perlu menentukan lokasi file docker-compose.yaml saat menjalankan sudo docker-compose up -d . Docker Compose mengharapkan Anda untuk menjalankan semua perintah di dalam folder yang berisi file docker-compose.yaml, karena banyak perintah yang terkait dengan folder tersebut.

Sekarang verifikasi bahwa penampung sudah aktif dan berjalan dengan menavigasi ke http:// . Panduan ini menggunakan http://homelab-docker untuk referensi.

Anda dapat melihat pemrosesan ini terjadi di VS Code saat SSH masuk ke host Docker dalam animasi di bawah ini:

Kesuksesan! Anda sekarang telah berhasil menggunakan Docker Compose untuk memulai wadah dari file konfigurasi. Dengan langkah penting pertama yang diambil, mari kita lihat bagaimana Anda mengelola status penampung Anda.

Perintah untuk Mengelola Kontainer Terpisah

Di bagian sebelumnya, Anda memulai wadah caddy menggunakan -d bendera. Melakukannya menjalankan wadah dalam terpisah negara. Ketika sebuah wadah dalam keadaan terlepas, wadah itu akan terus berjalan di latar belakang. Namun, ini menimbulkan masalah:bagaimana Anda mengelola wadah itu jika Anda tidak lagi memiliki kendali langsung?

Untuk mengatasi masalah ini, Docker Compose memiliki serangkaian perintah yang akan mengelola container yang dimulai dengan docker-compose.yaml berkas:

  • docker-compose restart digunakan untuk me-restart container yang sedang berjalan. Melakukannya berbeda dengan menjalankan kembali docker-compose up -d . Perintah restart hanya akan memulai ulang wadah yang ada, jalankan kembali docker-compose up -d perintah, dan buat ulang wadah dari awal (jika file konfigurasi telah diubah).
  • docker-compose stop akan menghentikan container yang sedang berjalan tanpa merusak container. Demikian pula, docker-compose start akan memulai penampung lagi.
  • docker-compose down akan menghentikan kontainer yang sedang berjalan dan juga menghancurkannya . Di sinilah pengikat volume berperan (baca selengkapnya di bawah).
  • docker-compose pull akan menarik versi gambar buruh pelabuhan (atau gambar) saat ini dari repositori. Jika menggunakan latest tag, Anda dapat mengikuti dengan docker-compose down && sudo docker-compose up -d untuk mengganti wadah dengan versi terbaru. Menggunakan docker-compose pull adalah cara mudah untuk memperbarui container dengan cepat dengan waktu henti yang minimal.
  • docker-compose logs akan menampilkan log dari container yang sedang berjalan (atau dihentikan). Anda juga dapat menangani container individual (jika ada beberapa container yang ditentukan dalam file penulisan) dengan docker-compose logs <container name> .

Daftar lengkap perintah docker-compose dapat dilihat dengan menjalankan docker-compose tanpa argumen tambahan atau dirujuk di sini dalam dokumentasi.

Sekarang setelah Anda memiliki container yang sedang berjalan, mari kita lihat penggunaan konten yang disimpan secara lokal di komputer Anda.

Membuat Bind Mount di Docker Compose

Mengikat Gunung adalah bagaimana Docker memetakan data pengguna yang penting ke penyimpanan lokal di server Anda. Untuk memulai, buat beberapa konten untuk wadah yang akan dihosting:

  1. Di host Docker, Di dalam ~/containers/caddy folder buat folder baru bernama file .

2. Buat file baru bernama index.html di dalam ~/containers/caddy folder yang terlihat seperti di bawah ini. Ini akan menjadi halaman utama yang akan dilayani oleh server web Caddy.

<body><h2>hello world!</h2></body>

3. Ubah file konfigurasi Docker Compose Anda menjadi seperti di bawah ini. Contoh file di bawah ini menambahkan volumes bagian dan mengarahkan pengikatan ke file folder yang baru saja dibuat untuk membuatnya tersedia untuk wadah.

version: "3.7" services: caddy: container_name: "caddy" image: "caddy:latest" ports: - "80:80" volumes: #the ./ refers a folder relative to the docker-compose file - "./files:/usr/share/caddy"

4. Jalankan docker-compose up -d lagi. Docker Compose sekarang akan mengenali file yang telah diubah dan membuat ulang container Anda.

5. Navigasikan ke halaman penampung dengan browser dan Anda sekarang akan melihatnya melayani "Hello World!" halaman.

Anda dapat melihat yang berikut dalam animasi di bawah ini:

Anda sekarang menghosting konten yang disimpan secara lokal di mesin Anda! Namun, bagaimana jika konten Anda berada di sumber eksternal seperti jaringan yang dibagikan?

Menggunakan Penulisan Docker dengan Volume Docker

Setelah Anda membuat wadah sederhana dengan Docker Compose, Anda mungkin memerlukan wadah itu untuk mengakses file di tempat lain mungkin di jaringan berbagi. Jika demikian, Anda dapat mengonfigurasi container untuk menggunakan volume Docker langsung di file konfigurasi Docker Compose Anda.

Untuk tujuan demonstrasi, panduan ini akan membuat server Network File Share (NFS) di host Docker. Melayani konten lokal sebagai mount NFS tidak memiliki tujuan praktis di luar demonstrasi. Jika Anda memasang volume NFS, biasanya volume tersebut berasal dari sumber eksternal seperti NAS atau server jarak jauh.

Menyiapkan Berbagi NFS

Jika Anda belum memiliki pengaturan berbagi NFS, buat sekarang di host Docker untuk tutorial ini. Untuk melakukannya:

  1. Instal server NFS paket dengan menjalankan apt install nfs-kernel-server -y .

2. Tambahkan wadah sebagai ekspor NFS (mirip dengan berbagi Windows CIFS) dengan menjalankan yang berikut ini.

# Add a line to the /etc/exports config file to create a NFS share for # /home/homelab/containers. This share is only exposed to localhost (to # prevent other computers from having access) echo '/home/homelab/containers localhost(rw,sync,no_root_squash,no_subtree_check)' | sudo tee -a /etc/exports # Restart the NFS server with the new config sudo systemctl restart nfs-kernel-server

3. Sekarang verifikasi bahwa host mengekspos bagian NFS dengan menjalankan showmount -e localhost . Perintah ini akan menampilkan share NFS yang saat ini terbuka dan siapa yang memiliki akses.

Pada tangkapan layar di bawah, Anda dapat melihat /home/homelab/containers diekspos, tetapi hanya ke komputer localhost (yang merupakan server yang sama yang menjalankan host Docker).

Jika Anda melihat folder /home//containers dalam output, pembagian NFS diatur.

Mendefinisikan Volume Bernama Docker

Setelah Anda membuat share NFS, Anda sekarang perlu memberi tahu Docker cara mengakses share itu. Menggunakan Docker Compose, Anda dapat melakukannya dengan mendefinisikan volume bernama di file konfigurasi Docker Compose.

Volume bernama adalah cara bagi Docker untuk mengabstraksi pembagian file berbasis jaringan. Berbagi file jaringan hadir dalam berbagai bentuk dan ukuran akhir-akhir ini:pembagian CIFS (windows), pembagian NFS (Linux), Bucket AWS S3, dan banyak lagi. Dengan membuat Volume Bernama, Docker melakukan bagian tersulit dalam mencari cara untuk berbicara dengan jaringan yang dibagikan dan membiarkan wadah hanya memperlakukan bagian tersebut seolah-olah itu adalah penyimpanan lokal.

Untuk membuat volume bernama:

  1. Buka file konfigurasi Docker Compose (docker-compose.yaml ). Jika Anda mengikuti, file harus berada di ~/containers/caddy map.

2. Di dalam file konfigurasi Docker Compose, tambahkan volumes bagian setelah services bagian. File konfigurasi Anda harus seperti di bawah ini. volumes bagian membuat volume bernama yang disebut Situs Web Saya . Di dalam volume bernama itu, parameter yang diperlukan (seperti IP, pengaturan NFS, dan jalur) ditentukan. volumes parameter dalam services bagian juga dimodifikasi, untuk menunjuk ke volume nama yang bertentangan dengan folder lokal.

version: "3.7"
 services:
   caddy:
     container_name: "caddy"
     image: "caddy:latest"
     ports:
       - "80:80"
     volumes:
       - "MyWebsite:/usr/share/caddy"
 volumes:
   MyWebsite:
     driver_opts:
       type: "nfs"
       o: "addr=localhost,nolock,soft,rw"
       device: ":/home/homelab/containers/caddy/files"

3. Setelah Anda menentukan volume bernama yang menunjuk ke bagian NFS di file konfigurasi Docker Compose, jalankan docker-compose up -d untuk membuat dan memulai wadah. Jika semuanya berjalan dengan baik, wadah dan situs web akan muncul kembali.

4. Navigasikan ke halaman penampung lagi. index.html konten akan muncul seolah-olah file sedang dipasang secara lokal. Namun, file tersebut sedang dipasang melalui server NFS yang diatur di jaringan.

Karena Anda sekarang dapat memasang volume Docker eksternal di Docker Compose, Anda sekarang dapat membawa semua jenis penyimpanan jaringan ke dalam wadah Anda. Namun, Docker Compose dapat melakukan lebih dari sekadar mendefinisikan wadah atau volume tunggal. Mari selami skenario multi-kontainer yang lebih kompleks.

Tutorial ini tidak lagi menggunakan wadah caddy, jadi Anda dapat menghapus wadah menggunakan docker-compose down .

Mendefinisikan Beberapa Container di Docker Compose

Sebagian besar wadah Docker tidak berfungsi di dalam ruang hampa. Kontainer Docker biasanya memiliki dependensi layanan seperti database atau layanan web terpisah yang berbicara melalui API.

Menggunakan Docker Compose, Anda dapat mengelompokkan container bersama-sama yang ditentukan dalam satu file. Dengan mendefinisikan beberapa container dalam satu file, container dapat berkomunikasi antara layanan yang bergantung dan menyederhanakan organisasi tata letak container yang kompleks.

Untuk mendemonstrasikan skenario seperti itu, mari siapkan aplikasi wiki populer bernama BookStack .

BookStack adalah perangkat lunak wiki populer yang dikenal karena kemudahan penggunaan dan tata letak hierarkisnya (berlawanan dengan tata letak datar, seperti mediawiki).

BookStack, seperti banyak aplikasi web, memerlukan database terpisah agar berfungsi dengan baik, serta informasi yang diperlukan untuk berkomunikasi ke database. Menyiapkan situasi seperti itu adalah keunggulan Docker Compose.

Buat File Konfigurasi Penulisan Docker

BookStack tidak memiliki image Docker yang dikelola secara internal, namun, linuxserver.io mempertahankan image Docker Hub yang memiliki reputasi baik atas nama BookStack. Meskipun dokumentasi di situs hub docker memiliki file konfigurasi Docker Compose yang direkomendasikan, tutorial ini akan membuat file konfigurasi baru sambil menjelaskan konsepnya.

Di host Docker:

  1. Pertama, buat folder untuk BookStack. Jika Anda mengikuti tutorial bagian sebelumnya, Anda harus memiliki ~/containers map. Buat folder bernama tumpukan buku di sana.

2. Kemudian buat file konfigurasi Docker Compose kosong bernama docker-compose.yaml di dalam tumpukan buku map.

3. Sekarang buka file konfigurasi Docker Compose dan tentukan dua wadah:bookstack wadah dan bookstack_db (mariadb) wadah.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"

Sejauh ini, docker-compose.yaml . ini sebagian besar menggunakan konsep yang sudah diperkenalkan:Anda memiliki dua layanan (bookstack , dan bookstack_db ), baik dengan gambar dan pengikatan mount. Wadah tumpukan buku memiliki pemetaan port dari port host 8080 ke port internal 80.

Mengingat overhead container Docker yang sangat rendah, merupakan praktik umum untuk mendefinisikan container database terpisah untuk setiap aplikasi web. Melakukan hal itu memungkinkan pemisahan tugas yang lebih besar. Ini jelas berbeda dari penyiapan basis data tradisional, di mana satu penginstalan basis data dapat melayani ratusan aplikasi web.

Salah satu opsi baru yang dapat Anda lihat di file di atas adalah depends_on memerintah. Perintah ini memberi tahu Docker urutan kontainer yang harus dimulai. Mendefinisikan depends_on perintah memberitahu Docker bahwa bookstack_db wadah harus mulai dulu.

Menyiapkan Komunikasi Kontainer dengan Variabel Lingkungan

File konfigurasi yang dibuat di bagian terakhir ini belum selesai. Meskipun Anda telah menentukan dua layanan (wadah), mereka tidak berbicara satu sama lain! bookstack container tidak tahu cara berkomunikasi dengan bookstack_db wadah. Mari kita selesaikan itu menggunakan variabel lingkungan.

Variabel lingkungan adalah cara paling umum untuk menyediakan variabel ke container Docker. Ini adalah variabel yang diberikan saat runtime (atau didefinisikan di docker-compose.yaml file konfigurasi) untuk memberikan informasi tentang apa yang perlu dilakukan penampung.

Variabel Lingkungan ditentukan oleh orang yang membuat gambar Docker. Mereka akan berbeda tergantung pada gambar Docker yang Anda gunakan, dan Anda harus merujuk ke dokumentasi dari pembuatnya mengenai variabel lingkungan apa yang akan digunakan.

Ada dua metode untuk mendefinisikan variabel lingkungan; langsung di docker-compose.yaml file itu sendiri atau sebagai file terpisah.

File terpisah, biasanya, adalah metode yang disarankan, terutama jika variabel berisi data sensitif seperti kata sandi. Sebuah docker-compose.yaml file dirancang untuk dibagikan atau bahkan diunggah ke repo GitHub yang menghadap publik. Memiliki file terpisah untuk data sensitif mengurangi kemungkinan pelanggaran keamanan yang tidak disengaja.

Pada host Docker, sekarang buat dua variabel lingkungan; satu untuk tumpukan buku wadah dan satu untuk bookstack_db wadah.

  1. Buat file baru di ~/containers/bookstack folder bernama bookstack.env dengan isi sebagai berikut:
APP_URL is the IP address or hostname of your server. This article is using homelab-docker
 APP_URL=http://homelab-docker:8080
 DB_HOST is the container name you gave your container
 DB_HOST=bookstack_db
 DB_USER is defined in the bookstack_DB environment file
 DB_USER=bookstack_user
 DB_PASS is also defined in the bookstack_DB environment file
 DB_PASS=MySecurePassword
 DB_DATABASE is the name of the database within mariadb
 DB_DATABASE=bookstack

2. Buat file baru di ~/containers/bookstack folder bernama bookstack_db.env dan sertakan konten berikut:

The root password for our database, keep it secret, keep it safe
 MYSQL_ROOT_PASSWORD=MySecureRootPassword
 The database bookstack will be using
 MYSQL_DATABASE=bookstack
 the user bookstack will be using
 MYSQL_USER=bookstack_user
 the password bookstack will be using
 MYSQL_PASSWORD=MySecurePassword

3. Sebagai praktik terbaik, sekarang pastikan keduanya env file tidak dapat dibaca oleh pengguna lain.

chmod 600 bookstack.env bookstack_db.env

Anda harus mengubah akses baca karena file bookstack.env dan bookstack_db.env memiliki data sensitif di dalamnya.

4. Perbarui ~/containers/bookstack/docker-compose.yaml Docker Compose file untuk mereferensikan dua file lingkungan yang ditunjukkan di bawah ini.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"

5. Sekarang mulai tumpukan buku dan tumpukan buku_db container menggunakan Docker Compose.

sudo docker-compose up -d

Anda dapat melihat setiap langkah yang disebutkan di bagian ini dilakukan di VS Code di bawah ini.

Memantau Log Penulisan Docker

Mesin Docker bekerja dengan Docker Compose untuk melakukan banyak tugas berbeda di latar belakang. Mampu memantau apa yang terjadi terutama saat bekerja dengan beberapa kontainer sekaligus sangat membantu.

Untuk memantau wadah tumpukan buku, misalnya, gunakan logs memerintah. Dalam tutorial ini, setelah Anda melihat log menunjukkan [services.d] done , Anda dapat membuka URL tumpukan buku.

sudo docker-compose logs bookstack

Pada tahap ini, Anda harus memiliki wiki yang berfungsi penuh yang berjalan di dalam wadahnya sendiri, dengan basis datanya sendiri, seluruhnya di dalam Docker!

Selama Anda memiliki folder bookstack dan bookstack_db, Anda dapat membuat ulang lingkungan bookstack Anda dari awal.

Penyusunan dan Jaringan Docker

Sampai saat ini, Anda belum belajar terlalu banyak tentang aspek komunikasi dan jaringan tentang bagaimana container bekerja sama. Mari kita ubah itu.

Saat Anda membuat beberapa wadah dalam satu docker-compose.yaml file seperti yang telah Anda lakukan di bagian sebelumnya, mereka semua ditugaskan ke jaringan yang sama (biasanya disebut name-of-parent-folder_default ).

Anda dapat melihat jaringan yang dibuat untuk container saat menjalankan docker-compose up -d seperti yang ditunjukkan di bawah ini.

Ketika semua kontainer ditugaskan dalam jaringan yang sama, Docker membuat entri DNS untuk mereka secara internal. Itulah sebabnya pada contoh sebelumnya, Anda merujuk ke database Anda sebagai bookstack_db dalam variabel lingkungan. bookstack_db itu name sebenarnya adalah entri DNS yang menunjuk ke alamat IP penampung basis data.

Anda juga tidak harus bergantung pada Docker Compose untuk membuat jaringan secara otomatis untuk Anda. Anda dapat menentukan jaringan internal atau eksternal secara manual. Mendefinisikan jaringan secara manual sangat bagus ketika Anda memiliki wadah yang perlu berbicara dengan wadah lain di docker-compose.yaml yang terpisah mengajukan. Anda dapat mengekspos port, atau Anda dapat membuat jaringan yang dapat mereka gabungkan berdua!

Perhatikan bahwa ketika Anda mulai mendefinisikan jaringan secara eksplisit, Anda juga harus secara eksplisit mendefinisikan jaringan default. Docker Compose akan berhenti membuat jaringan itu secara otomatis setelah Anda mulai mendefinisikan jaringan

Sekarang ubah tumpukan buku docker-compose.yaml untuk menyertakan jaringan yang dibuat secara eksternal.

  1. Buat jaringan eksternal dengan docker network create my_external_network .

2. Tentukan jaringan eksternal di docker-compose.yaml :

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
     networks:
       - "my_external_network"
       - "bookstack_default"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"
     networks:
       - "bookstack_default"
 networks:
   bookstack_default:
   my_external_network:
     external: true

3. Jalankan docker-compose up -d untuk membuat ulang wadah. Dua wadah Anda sekarang bergabung ke dua jaringan seperti yang ditunjukkan di bawah ini.

Wadah tumpukan buku sekarang juga bergabung ke jaringan yang ditentukan secara eksternal. Ini memungkinkan Anda membuat wadah lain yang mengubah lalu lintas HTTP tumpukan buku menjadi HTTPS sebelum meninggalkan Docker (disebut sebagai proxy-terbalik ).

Menyetel Pengguna Tertentu untuk Menjalankan Container

Secara default, semua container Docker dijalankan sebagai root user sandbox. Ini setara dengan menjalankan mesin virtual yang masuk sebagai pengguna Administrator default. Sementara ini umumnya tidak masalah, ada masalah keamanan jika kotak pasir disusupi.

Masalah lain dengan menjalankan sebagai root adalah izin file. Anda mungkin memperhatikan bahwa jika Anda mencoba menghapus db folder di dalam tumpukan buku folder, Anda sebenarnya tidak bisa; isinya dimiliki oleh root.

Meskipun sebagian besar gambar tidak suka dijalankan sebagai pengguna non-root, linuxserver.io gambar khususnya menawarkan variabel lingkungan untuk mengatur pengguna yang berjalan di dalam wadah. Anda dapat melakukannya dengan menambahkan UID=1000 dan GID=1000 di dalam bookstack.env konfigurasi.

1000:1000 adalah ID pengguna dan grup default untuk pengguna pertama di ubuntu (yang mungkin bukan Anda). You can read more about User IDs and Group IDs at Related:A Windows Guy in a Linux World:Users and File Permissions )

You can also force a UID and GID using the user parameter in docker-compose, but this is not recommended as most containers do not behave well when forced to a different user

Setting the Restart Policy

If you’d like containers built with Docker Compose to restart on failure, use the restart policy by adding a restart: <option> parameter under the container settings in docker-compose.yaml .

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

Adding this parameter will cause containers to automatically restart on failure to help maintain uptime in the event of unexpected power issues.

Manually setting DNS entries for Containers

Just like with Windows and Linux, Docker also has a “hosts file”. By using the extra_hosts parameter in a config file, you can force a host to resolve to a specific IP. This can be useful when you have DNS constraints, such as split DNS or a test server you want to interact with temporarily.

extra_hosts:
  - "somehost:x.x.x.x"
  - "otherhost:x.x.x.x"

Running Commands

Once the container is started, you can run commands inside of the container using the docker-compose run . For example, maybe you’d like to start up a Bash terminal inside of your bookstack wadah. To do that, you’d run the command below.

docker-compose run web bash

Kesimpulan

At this stage, you should have enough information to follow along with the majority of docker-compose tutorials out on the web. Having this knowledge can vastly expand your ability to move into the world of Docker, and the building of web apps in Infrastructure as Code.


Docker
  1. Podman vs Docker:Semua yang Perlu Anda Ketahui

  2. Semua yang ingin Anda ketahui tentang Zorin OS 12

  3. Apa Itu VPN? Semua yang Perlu Anda Ketahui Tentang VPN

  1. Semua yang Perlu Anda Ketahui Tentang Ubuntu 13.04

  2. Semua yang Perlu Anda Ketahui Tentang CentOS Stream

  3. Semua yang Perlu Anda Ketahui Tentang Sistem File Linux

  1. Semua yang Perlu Anda Ketahui Tentang Perintah Chmod Linux

  2. Semua yang Perlu Anda Ketahui tentang Linux Containers (LXC)

  3. Semua yang Perlu Anda Ketahui Tentang Server DNS Ubuntu