Cheat Sheet Perintah Docker Compose di Server
Panduan perintah Docker Compose V2 untuk server: kelola siklus layanan, terapkan perubahan, lihat log, buka shell, atur jaringan dan volume, serta bersihkan dengan aman.
Perintah Compose yang benar-benar Anda gunakan
Docker Compose menyediakan lebih dari empat puluh subperintah. Pekerjaan sehari-hari di server biasanya menggunakan sekitar selusin subperintah. Halaman ini mengelompokkannya berdasarkan pekerjaan yang Anda lakukan, memberikan satu alasan sederhana untuk setiap subperintah, dan merujuk ke pembahasan mendalam jika suatu perintah memiliki jebakan tersembunyi.
Semua contoh di sini menggunakan Compose V2: docker compose dengan spasi, bukan skrip lama docker-compose. V2 adalah plugin Go yang dipasang bersama Docker Engine, sedangkan V1 sudah tidak tersedia dalam paket saat ini. Karena itu, docker-compose: command not found pada instalasi Ubuntu baru per Juli 2026 merupakan kondisi yang diharapkan, bukan kerusakan. Periksa dengan docker compose version. Jika tidak menampilkan apa pun, instal paket docker-compose-plugin.
Setiap perintah di bawah ini dijalankan dari direktori yang berisi compose.yaml, karena Compose mengambil nama proyek dari direktori tersebut dan mencari file secara relatif terhadapnya. Jika Anda menjalankan perintah yang sama satu tingkat di atasnya, Compose berhenti dengan no configuration file provided: not found. Jika format file tersebut masih baru bagi Anda, mulai dengan file Compose pertama di VPS, lalu kembali ke sini untuk mempelajari perintah-perintahnya.
Siklus hidup: empat perintah yang Anda gunakan, dan satu perintah yang menghapus container
docker compose up -d
docker compose up -d --wait
docker compose stop
docker compose start
docker compose restart web
docker compose downup -d membuat network, membuat container, menjalankannya, lalu mengembalikan kontrol. Perintah ini selesai segera setelah container dibuat. Karena itu, skrip deploy yang langsung menjalankan probe curl setelahnya sering gagal pada percobaan pertama. up -d --wait menunggu hingga setiap service yang mendeklarasikan healthcheck melaporkan status healthy, lalu keluar dengan kode non-zero jika ada service yang tidak pernah mencapai status tersebut. Flag ini hanya sebaik pemeriksaan yang mendasarinya. Karena itu, tulis healthcheck yang dapat dipercaya oleh Compose sebelum mengandalkannya dalam automation.
stop menghentikan container dan mempertahankannya. Dengan demikian, start menjalankan kembali container yang sama dengan writable layer yang sama. down menghentikan container, lalu menghapus container dan network project. Semua data yang ditulis di dalam container dan tidak berada dalam volume akan ikut terhapus. Ini adalah salah satu kesalahpahaman paling merugikan tentang Compose. Perbedaan lengkap antara down dan stop menjelaskan dampaknya.
restart bukan reload. Perintah ini menghentikan dan menjalankan kembali container yang sama dengan konfigurasi yang sudah dimilikinya. Karena itu, perubahan environment variable, tag image baru, atau perubahan port mapping tidak berpengaruh sama sekali. Untuk menerapkan perubahan file, jalankan up -d lagi. Compose membandingkan setiap service dengan container yang sedang berjalan dan hanya membuat ulang service yang konfigurasinya berubah.
Menerapkan perubahan: buat ulang, pull, atau build
docker compose up -d --force-recreate
docker compose pull && docker compose up -d
docker compose build --no-cache web
docker compose up -d --build webup -d sendiri tidak melakukan apa pun jika tidak ada perubahan. Inilah yang membuatnya aman untuk dijalankan berulang kali. --force-recreate mengabaikan perbandingan tersebut dan mengganti setiap container meskipun konfigurasinya identik. Ini adalah cara tercepat untuk menghapus state yang tidak semestinya di dalam container.
Memperbarui image memerlukan dua command karena keduanya melakukan hal yang berbeda. pull mengunduh image terbaru untuk setiap tag yang tercantum dalam file. Selanjutnya, up -d mendeteksi bahwa ID image service tidak lagi cocok dengan container yang sedang berjalan, lalu membuat ulang container tersebut. Jika pull dilewati, up -d tetap menjalankan latest bulan lalu tanpa error. Risiko sebaliknya muncul pada stack dengan banyak service. Menarik latest untuk semua service sekaligus dapat merusak aplikasi yang masih berjalan normal sepuluh detik sebelumnya. Karena itu, workspace AFFiNE yang di-host sendiri menetapkan setiap dari keempat tag image secara eksplisit.
build berlaku untuk service yang mendeklarasikan bagian build:, bukan image:. up -d --build melakukan build dan start dalam satu langkah. Ini adalah alur normal saat Anda mengubah kode. Gunakan --no-cache hanya jika suatu layer cache jelas sudah kedaluwarsa, karena command tersebut membangun ulang setiap layer dari awal.
Melihat apa yang sedang berjalan
docker compose ps
docker compose ps -a
docker compose logs -f --tail=100
docker compose logs --since 15m --timestamps db
docker compose top
docker compose lsps hanya mencantumkan container yang sedang berjalan. Service yang gagal saat start tidak terlihat di sana sampai Anda menambahkan -a. Karena itu, container yang tidak ada di ps sementara ps -a menampilkannya sebagai Exited (1) merupakan pola normal saat startup gagal. Baca exit code, lalu baca log.
logs -f mengikuti setiap service sekaligus dan menambahkan nama service di awal setiap baris. Tampilan ini diperlukan ketika service saling berkomunikasi dan urutan kejadian penting. Gunakan nama service untuk mempersempit hasil. --tail=100 penting pada container yang sudah berjalan selama sebulan karena output default mencetak seluruh riwayat dan memenuhi terminal. --since 15m menjawab pertanyaan yang biasanya Anda ajukan, yaitu apa yang terjadi selama restart yang baru saja dilakukan.
top mencantumkan proses di dalam setiap container. Dengan demikian, Anda dapat membedakan antara "container sedang berjalan" dan "proses di dalamnya sedang berjalan". ls keluar dari direktori saat ini dan mencantumkan semua project Compose pada host beserta statusnya. Anda dapat menemukan stack yang dijalankan tiga bulan lalu.
Membuka shell di dalam service
docker compose exec web sh
docker compose exec -u root web sh
docker compose run --rm web env
docker compose run --rm --no-deps web shexec menjalankan perintah di dalam container yang sudah berjalan. run memulai container baru dari definisi service yang sama. Gunakan ini jika service tidak berjalan cukup lama untuk menerima perintah exec. Selalu pasangkan run dengan --rm. Tanpa opsi tersebut, setiap pemanggilan akan meninggalkan container yang berhenti. Container-container itu akan menumpuk hingga docker compose ps -a tidak dapat dibaca.
Coba sh sebelum bash. Image berbasis Alpine tidak menyertakan bash, sehingga kegagalannya menampilkan exec: "bash": executable file not found in $PATH. Menambahkan --no-deps ke run akan melewati dependensi service. Dengan demikian, pemeriksaan konfigurasi singkat tidak akan menyalakan seluruh database Anda.
run --rm web env adalah cara tercepat untuk melihat environment yang benar-benar diterima service setelah setiap file .env, blok environment:, dan variabel shell digabungkan. Jika suatu nilai salah, penyebabnya biasanya adalah urutan penggabungan. cara Compose menyelesaikan file env dan secret menjelaskan sumber mana yang diprioritaskan.
Jaringan, port, dan resolusi nama
docker compose port web 80
docker compose exec web getent hosts db
docker compose config --networksCompose menempatkan setiap service pada satu jaringan project, dan nama setiap service menjadi nama DNS di jaringan tersebut. Menjalankan getent hosts db di dalam web menampilkan IP container jika resolusi berhasil, dan tidak menampilkan apa pun jika resolusi gagal. Dengan demikian, perintah ini menjawab pertanyaan "apakah container-container ini dapat saling terhubung" dalam dua detik. Jika nama berhasil di-resolve tetapi koneksi ditolak, proses di dalam db terikat ke 127.0.0.1, bukan 0.0.0.0. Akibatnya, proses tersebut tidak pernah menerima paket dari container lain. Penjelasan selengkapnya tentang model ini tersedia di cara kerja jaringan Compose dan DNS service.
port web 80 menampilkan alamat host dan port tempat port container dipublikasikan. Ini menghindari tebakan ketika pemetaan tersebut berasal dari variabel. Publikasi port juga menambahkan aturan firewall yang dikelola Docker sendiri. Aturan tersebut ditempatkan sebelum aturan Anda. Akibatnya, service yang Anda anggap privat dapat terbuka ke Internet. Kasus ini dibahas di alasan port Docker yang dipublikasikan melewati ufw. Membiarkan port tersebut tidak dipublikasikan dan menempatkan satu proxy yang menangani autentikasi di jaringan project, di depan service-service tersebut, merupakan arsitektur yang lebih aman. Itulah yang diberikan oleh menjalankan Authentik sebagai lapisan single sign-on.
Volume dan data
docker compose config --volumes
docker compose cp db:/etc/postgresql/pg_hba.conf ./pg_hba.conf
docker compose down -vconfig --volumes menampilkan named volume yang dideklarasikan project, satu per baris. Daftar tersebut adalah data yang harus Anda cadangkan. Jika volume menyimpan data yang tidak dapat digantikan, perintah backup yang tepat sama pentingnya dengan daftarnya. Karena itu, perbandingan PhotoPrism dan Immich menjelaskan perintah dump dan copy yang diperlukan setiap server foto. cp menyalin file ke atau dari container tanpa membuka shell, dengan menggunakan bentuk service:path pada sisi yang merupakan container.
down -v menghapus named volume tersebut bersama container. Perintah ini tepat untuk membongkar test stack, tetapi tidak tepat untuk apa pun yang menyimpan data penting bagi Anda, karena tidak ada konfirmasi dan tidak ada cara untuk membatalkannya. Bind mount tetap ada karena berada di filesystem host. Perbedaan dampak ini adalah salah satu alasan untuk memilih secara sengaja antara bind mount dan named volume.
Pembersihan yang membebaskan ruang disk tanpa kehilangan data
docker compose down --remove-orphans
docker system df
docker image prune -a
docker builder prune--remove-orphans menghapus container yang dimiliki project tetapi tidak lagi tercantum dalam file. Ini biasanya terjadi setelah nama service diubah. Tanpa perintah tersebut, container tetap berjalan dan tidak terlihat oleh docker compose ps.
docker system df menunjukkan penggunaan disk sebelum Anda menghapus apa pun. Perintah ini memisahkan image, container, volume lokal, dan cache build, serta menampilkan jumlah yang dapat diperoleh kembali untuk masing-masing kategori. image prune -a menghapus semua image yang tidak lagi dirujuk oleh tag apa pun. Pada server yang telah mengunduh beberapa versi image berukuran besar, perintah ini biasanya memberikan penghematan terbesar. builder prune menghapus cache build, yang bertambah secara diam-diam pada server yang membuat image sendiri.
Tidak satu pun dari perintah tersebut menyentuh named volume. Hanya docker volume prune dan docker compose down -v yang melakukannya.
Memeriksa file sebelum menimbulkan masalah
docker compose config --quiet
docker compose config --services
docker compose --dry-run up -dconfig --quiet memvalidasi dan tidak mencetak apa pun jika berhasil. Karena itu, gunakan perintah ini pada tahap pra-deployment atau git hook. config biasa mencetak file yang sudah digabungkan dan diinterpolasi sepenuhnya. Dengan cara ini, Anda dapat memastikan bahwa variabel berhasil di-resolve dan file override diterapkan sesuai harapan. Variabel yang tidak disetel akan muncul sebagai nilai kosong, diikuti peringatan The "X" variable is not set. Defaulting to a blank string.
--dry-run adalah flag global, bukan flag subperintah. Karena itu, letakkan flag ini sebelum up. Perintah ini mencetak semua tindakan yang akan dilakukan Compose tanpa mengubah apa pun. Waktu tiga puluh detik ini layak digunakan sebelum menjalankan down pada stack yang penting.
Bekerja dengan file, profil, dan proyek
docker compose -f compose.yaml -f compose.prod.yaml up -d
docker compose --profile debug up -d
docker compose -p staging up -dBeberapa flag -f digabungkan secara berurutan, dan file berikutnya menimpa file sebelumnya berdasarkan setiap key. Ini adalah cara standar untuk mempertahankan satu file dasar dengan sedikit override untuk produksi. Namun, aturannya berbeda untuk list dan map. Baca cara Compose menggabungkan beberapa file sebelum menelusuri masalah yang tidak terduga.
--profile menjalankan service yang ditandai dengan profil tersebut bersama service tanpa profil. Dengan demikian, alat debugging tidak masuk ke dalam up normal. -p menetapkan nama proyek, sehingga dua salinan dari satu stack dapat berjalan berdampingan dengan network dan nama volume yang terpisah. Untuk memulihkan stack setelah reboot, Anda tidak perlu mengetikkan command. Gunakan unit yang menjalankannya secara otomatis, seperti yang dijelaskan dalam menjalankan stack Compose saat boot.
FAQ
Apa yang menggantikan docker-compose dengan tanda hubung?
Compose V2, yang dijalankan sebagai docker compose dengan spasi. Compose V2 adalah plugin yang disertakan dalam Docker Engine, sedangkan alat Python V1 tidak lagi diinstal oleh paket saat ini. Jika bentuk dengan spasi tidak menampilkan apa pun, instal paket docker-compose-plugin untuk distribusi Anda. Perbarui skrip lama agar menggunakan bentuk dengan spasi, bukan menambahkan alias, karena V2 memiliki flag yang tidak tersedia pada V1.
Mengapa docker compose restart tidak menerapkan perubahan konfigurasi saya?
restart menghentikan dan menjalankan kembali container yang ada dengan konfigurasi saat container tersebut dibuat. Perintah ini tidak pernah membaca ulang compose.yaml. Setiap perubahan pada variabel lingkungan, port, volume, atau tag image memerlukan docker compose up -d. Perintah tersebut membandingkan setiap service dengan container yang sedang berjalan, lalu membuat ulang service yang berbeda. Tambahkan --force-recreate jika Anda ingin penggantian tetap dilakukan meskipun tidak ada perubahan pada file.
Bagaimana cara memperbarui service ke image yang lebih baru?
Jalankan docker compose pull, lalu docker compose up -d. Perintah pull mengambil image terbaru untuk setiap tag dalam file, sedangkan up -d membuat ulang service yang ID image-nya tidak lagi cocok dengan container-nya. Menjalankan up -d saja akan menggunakan kembali image yang sudah tersimpan di disk. Akibatnya, stack yang dikunci ke latest dapat tetap menggunakan build yang sudah berusia berbulan-bulan tanpa menampilkan error.
Perintah pembersihan mana yang aman pada server aktif?
docker system df, docker image prune -a, dan docker builder prune hanya menghapus image serta cache. Service yang sedang berjalan tetap berfungsi, dan named volume tidak tersentuh. Pasangan perintah yang berbahaya adalah docker compose down -v dan docker volume prune, karena keduanya menghapus named volume tanpa konfirmasi. Jalankan docker compose config --volumes terlebih dahulu agar Anda mengetahui data yang berisiko.
Apakah saya dapat menjalankan satu perintah tanpa memulai seluruh stack?
Ya. docker compose run --rm --no-deps web sh memulai satu container dari definisi service web, melewati dependensinya, dan menghapus container tersebut saat Anda keluar. Gunakan exec jika container sudah berjalan, karena exec menghubungkan Anda ke proses yang aktif dan menampilkan kondisi service yang sebenarnya.