Cheat Sheet Docker Compose untuk Pelayan Sebenar
Rujukan perintah Docker Compose V2 untuk kitar hayat, perubahan, log, shell, rangkaian, volum dan pembersihan selamat, termasuk perangkap %%C11%%.
Perintah Compose yang benar-benar anda gunakan
Docker Compose mengeluarkan lebih daripada empat puluh subperintah. Kerja harian pada pelayan biasanya menggunakan kira-kira sedozen subperintah. Halaman ini mengumpulkannya mengikut tugas yang anda lakukan, memberikan satu sebab ringkas bagi setiap perintah, dan merujuk kepada penerangan terperinci apabila sesuatu perintah mempunyai perangkap yang tersembunyi.
Semua kandungan di sini menggunakan Compose V2: docker compose dengan ruang, bukan skrip lama docker-compose. V2 ialah pemalam Go yang dipasang bersama Docker Engine, manakala V1 telah dikeluarkan daripada pakej semasa. Oleh itu, docker-compose: command not found pada sistem Ubuntu baharu setakat July 2026 adalah keadaan yang dijangka, bukan kerosakan. Semak dengan docker compose version. Jika tiada output dipaparkan, pasang pakej docker-compose-plugin.
Setiap perintah di bawah mesti dijalankan dari direktori yang mengandungi compose.yaml, kerana Compose mengambil nama projek daripada direktori tersebut dan mencari fail itu secara relatif kepadanya. Jika anda menjalankan perintah yang sama satu aras lebih tinggi, Compose berhenti dengan no configuration file provided: not found. Jika format fail itu masih baharu bagi anda, mulakan dengan fail Compose pertama pada VPS dan kembali ke sini untuk melihat perintah-perintahnya.
Kitar Hayat: empat yang anda taip, dan satu yang mengalih keluar kontena
docker compose up -d
docker compose up -d --wait
docker compose stop
docker compose start
docker compose restart web
docker compose downup -d mencipta rangkaian, mencipta kontena, memulakannya dan kembali. Ia kembali sebaik sahaja kontena dicipta. Oleh itu, skrip deploy yang menjalankan probe curl selepasnya sering gagal pada percubaan pertama. up -d --wait menunggu sehingga setiap servis yang mengisytiharkan healthcheck melaporkan status sihat, dan keluar dengan kod bukan sifar jika ada servis yang tidak pernah mencapai status itu. Flag ini hanya setepat pemeriksaan yang mendasarinya. Oleh itu, tulis healthcheck yang boleh dipercayai oleh Compose sebelum menggunakannya dalam automasi.
stop menghentikan kontena dan mengekalkannya. Oleh itu, start menghidupkan semula kontena yang sama dengan lapisan boleh tulis yang sama. down menghentikan kontena, kemudian mengalih keluar kontena dan rangkaian projek. Apa-apa yang ditulis di dalam kontena tetapi di luar volume akan turut hilang. Ini ialah salah faham paling merugikan dalam Compose. Perbezaan penuh antara down dan stop menerangkan kesannya.
restart bukan operasi reload. Ia menghentikan dan memulakan kontena yang sama menggunakan konfigurasi yang sedia ada. Oleh itu, perubahan pemboleh ubah persekitaran, tag imej baharu atau pemetaan port yang diedit langsung tidak berkesan. Untuk menggunakan perubahan fail, jalankan up -d sekali lagi. Compose membandingkan setiap servis dengan kontena yang sedang berjalan dan hanya mencipta semula kontena yang konfigurasinya berubah.
Menerapkan perubahan: cipta semula, tarik, atau bina semula
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 tidak melakukan apa-apa jika tiada perubahan, sebab itu perintah ini selamat dijalankan berulang kali. --force-recreate mengatasi perbandingan tersebut dan menggantikan setiap kontena walaupun konfigurasinya sama. Oleh itu, perintah ini ialah cara terpantas untuk mengosongkan keadaan luar biasa dalam kontena.
Mengemas kini imej memerlukan dua perintah kerana kedua-duanya melakukan perkara yang berbeza. pull memuat turun imej semasa bagi setiap tag yang dinamakan dalam fail. up -d kemudian mengesan bahawa ID imej perkhidmatan tidak lagi sepadan dengan kontena yang sedang berjalan, lalu mencipta semulanya. Jika operasi pull dilangkau, up -d terus menjalankan latest bulan lalu tanpa sebarang ralat.
build terpakai pada perkhidmatan yang mengisytiharkan bahagian build: dan bukannya image:. up -d --build membina dan memulakan perkhidmatan dalam satu langkah. Ini ialah kitaran biasa semasa anda mengubah kod. Gunakan --no-cache hanya apabila lapisan cache jelas sudah lapuk, kerana perintah ini membina semula setiap lapisan dari awal.
Melihat perkara 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 menyenaraikan container yang sedang berjalan. Perkhidmatan yang gagal semasa dimulakan tidak akan kelihatan sehingga anda menambah -a. Oleh itu, container yang tiada dalam ps tetapi ditunjukkan sebagai Exited (1) oleh ps -a ialah keadaan biasa bagi kegagalan permulaan. Baca kod keluar, kemudian baca log.
logs -f memantau semua perkhidmatan serentak dan menambah nama perkhidmatan pada awal setiap baris. Paparan ini sesuai apabila perkhidmatan berkomunikasi antara satu sama lain dan urutan peristiwa penting. Nyatakan nama perkhidmatan untuk mengehadkan paparan. --tail=100 penting bagi container yang telah berjalan selama sebulan kerana tetapan lalai mencetak seluruh sejarah dan memenuhi terminal. --since 15m menjawab soalan yang biasanya anda perlukan, iaitu perkara yang berlaku semasa mula semula yang baru anda lakukan.
top menyenaraikan proses dalam setiap container. Ini membezakan keadaan "container sedang berjalan" daripada keadaan "proses di dalamnya sedang berjalan". ls keluar daripada direktori semasa dan menyenaraikan semua projek Compose pada hos berserta statusnya. Dengan itu, anda boleh mencari tindanan yang anda mulakan tiga bulan lalu.
Mendapatkan shell di dalam perkhidmatan
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 arahan di dalam kontena yang sedang berjalan. run memulakan kontena baharu berdasarkan definisi perkhidmatan yang sama. Gunakan arahan ini apabila perkhidmatan tidak kekal berjalan cukup lama untuk membolehkan anda menggunakan exec. Sentiasa gabungkan run dengan --rm. Tanpa pilihan itu, setiap penggunaan meninggalkan kontena yang dihentikan, dan kontena tersebut akan bertambah sehingga docker compose ps -a tidak lagi dapat dibaca.
Cuba sh sebelum bash. Imej berasaskan Alpine tidak mengandungi bash, dan kegagalan akan memaparkan exec: "bash": executable file not found in $PATH. Menambah --no-deps pada run melangkau kebergantungan perkhidmatan. Ini menghalang semakan konfigurasi ringkas daripada memulakan keseluruhan pangkalan data anda.
run --rm web env ialah cara terpantas untuk melihat persekitaran sebenar yang diterima oleh perkhidmatan selepas setiap fail .env, blok environment: dan pemboleh ubah shell digabungkan. Jika nilainya salah, punca biasanya ialah susunan penggabungan. cara Compose menyelesaikan fail env dan rahsia menerangkan sumber yang mempunyai keutamaan.
Rangkaian, port dan resolusi nama
docker compose port web 80
docker compose exec web getent hosts db
docker compose config --networksCompose meletakkan semua perkhidmatan pada satu rangkaian projek, dan setiap nama perkhidmatan menjadi nama DNS pada rangkaian itu. Menjalankan getent hosts db dalam web memaparkan IP kontena apabila resolusi berjaya dan tidak memaparkan apa-apa apabila resolusi gagal. Oleh itu, arahan ini menjawab soalan "bolehkah kontena ini saling melihat" dalam masa dua saat. Jika nama berjaya diselesaikan tetapi sambungan ditolak, proses dalam db terikat pada 127.0.0.1 dan bukannya 0.0.0.0. Oleh itu, proses itu tidak menerima paket daripada kontena lain. Penerangan selebihnya tentang model ini terdapat dalam cara rangkaian Compose dan DNS perkhidmatan berfungsi.
port web 80 memaparkan alamat hos dan port yang menerbitkan port kontena. Ini mengelakkan tekaan apabila pemetaan datang daripada pemboleh ubah. Penerbitan port turut menulis peraturan firewall yang diuruskan sendiri oleh Docker. Peraturan itu berada sebelum peraturan anda. Oleh itu, perkhidmatan yang anda anggap peribadi mungkin terbuka kepada Internet. Kes ini diterangkan dalam sebab port Docker yang diterbitkan memintas ufw.
Volum dan data
docker compose config --volumes
docker compose cp db:/etc/postgresql/pg_hba.conf ./pg_hba.conf
docker compose down -vconfig --volumes memaparkan volum bernama yang diisytiharkan oleh projek, satu volum bagi setiap baris. Senarai itu ialah data yang perlu anda sandarkan. cp menyalin fail ke dalam atau keluar dari bekas tanpa membuka shell, menggunakan bentuk service:path pada mana-mana bahagian yang merupakan bekas.
down -v mengalih keluar volum bernama tersebut bersama-sama bekas. Perintah ini sesuai untuk merobohkan susunan ujian, tetapi tidak sesuai untuk apa-apa yang mengandungi data penting, kerana tiada pengesahan dan tiada cara untuk membuat asal tindakan itu. Lekapan bind kekal selepas tindakan ini kerana data tersebut berada pada sistem fail hos. Perbezaan dalam skop kesan ini ialah salah satu sebab untuk memilih dengan teliti antara lekapan bind dan volum bernama.
Pembersihan yang membebaskan ruang cakera tanpa kehilangan data
docker compose down --remove-orphans
docker system df
docker image prune -a
docker builder prune--remove-orphans memadam bekas yang tergolong dalam projek tetapi tidak lagi muncul dalam fail. Keadaan ini biasanya berlaku selepas anda menamakan semula perkhidmatan. Tanpanya, bekas tersebut terus berjalan dan tidak kelihatan kepada docker compose ps.
docker system df menunjukkan penggunaan ruang cakera sebelum anda memadam apa-apa. Perintah ini memisahkan imej, bekas, volum setempat dan cache binaan, serta memaparkan jumlah yang boleh dituntut semula bagi setiap satu. image prune -a membuang setiap imej yang tidak dirujuk oleh sebarang tag. Pada pelayan yang telah memuat turun beberapa versi imej besar, ini biasanya memberikan penjimatan terbesar. builder prune mengosongkan cache binaan, yang berkembang secara senyap pada mana-mana pelayan yang membina imejnya sendiri.
Tiada satu pun daripada perintah tersebut menyentuh volum bernama. Hanya docker volume prune dan docker compose down -v berbuat demikian.
Menyemak fail sebelum menjejaskan sistem
docker compose config --quiet
docker compose config --services
docker compose --dry-run up -dconfig --quiet mengesahkan fail dan tidak mencetak apa-apa jika berjaya. Oleh itu, letakkannya dalam langkah prapelancaran atau cangkuk git. config biasa mencetak fail yang telah digabungkan dan diinterpolasi sepenuhnya. Ini membolehkan anda mengesahkan bahawa pemboleh ubah telah diselesaikan dan fail penggantian disusun seperti yang dijangkakan. Pemboleh ubah yang tidak ditetapkan akan muncul sebagai nilai kosong, bersama-sama amaran The "X" variable is not set. Defaulting to a blank string.
--dry-run ialah flag global, bukan flag subperintah. Oleh itu, letakkannya sebelum up. Perintah ini mencetak setiap tindakan yang akan diambil oleh Compose tanpa mengubah apa-apa. Tiga puluh saat ini berbaloi sebelum down pada tindanan yang penting.
Bekerja merentas fail, profil dan projek
docker compose -f compose.yaml -f compose.prod.yaml up -d
docker compose --profile debug up -d
docker compose -p staging up -dBerbilang bendera -f digabungkan mengikut turutan, dan fail yang kemudian mengatasi fail terdahulu mengikut setiap kunci. Ini ialah cara standard untuk mengekalkan satu fail asas dengan penggantian kecil bagi pengeluaran. Namun, peraturannya berbeza untuk senarai dan peta. Oleh itu, baca cara Compose menggabungkan berbilang fail sebelum menyahpepijat hasil yang tidak dijangka.
--profile memulakan perkhidmatan yang ditandai dengan profil tersebut bersama-sama perkhidmatan yang tidak ditandai. Ini mengelakkan alat nyahpepijat daripada up biasa. -p menetapkan nama projek. Oleh itu, dua salinan satu tindanan boleh dijalankan bersebelahan dengan rangkaian dan nama volum yang berasingan. Untuk memulihkan tindanan selepas but semula, anda tidak perlu menaip perintah secara langsung. Sebaliknya, gunakan unit yang menjalankannya untuk anda, seperti yang diterangkan dalam memulakan tindanan Compose semasa but.
FAQ
Apakah yang menggantikan docker-compose dengan tanda sempang?
Compose V2, yang dipanggil sebagai docker compose dengan ruang. Ia ialah pemalam yang disertakan bersama Docker Engine, manakala alat Python V1 tidak lagi dipasang oleh pakej semasa. Jika bentuk dengan ruang tidak memaparkan apa-apa, pasang pakej docker-compose-plugin untuk pengedaran anda. Kemas kini skrip lama kepada bentuk dengan ruang dan bukannya menambah alias, kerana V2 mempunyai bendera yang tiada dalam V1.
Mengapakah docker compose restart tidak menggunakan perubahan konfigurasi saya?
restart menghentikan dan memulakan bekas sedia ada dengan konfigurasi yang digunakan semasa bekas itu dicipta. Ia tidak membaca semula compose.yaml. Sebarang perubahan pada pemboleh ubah persekitaran, port, volum atau tag imej memerlukan docker compose up -d. Perintah ini membandingkan setiap perkhidmatan dengan bekas yang sedang berjalan dan mencipta semula bekas yang berbeza. Tambahkan --force-recreate apabila anda mahu penggantian berlaku walaupun tiada perubahan pada fail.
Bagaimanakah cara mengemas kini perkhidmatan kepada imej yang lebih baharu?
Jalankan docker compose pull, kemudian docker compose up -d. Perintah pull mendapatkan imej semasa bagi setiap tag dalam fail. up -d mencipta semula mana-mana perkhidmatan yang ID imejnya tidak lagi sepadan dengan bekasnya. Menjalankan up -d sahaja menggunakan semula imej yang sudah ada pada cakera. Oleh itu, tindanan yang dipinkan kepada latest boleh terus menggunakan binaan yang berusia beberapa bulan tanpa memaparkan sebarang ralat.
Apakah perintah pembersihan yang selamat pada pelayan aktif?
docker system df, docker image prune -a dan docker builder prune hanya mengalih keluar imej dan cache. Oleh itu, perkhidmatan yang sedang berjalan terus berfungsi dan volum bernama tidak disentuh. Pasangan yang berbahaya ialah docker compose down -v dan docker volume prune, yang memadam volum bernama tanpa gesaan. Jalankan docker compose config --volumes terlebih dahulu supaya anda mengetahui perkara yang berisiko.
Bolehkah saya menjalankan satu perintah tanpa memulakan seluruh tindanan?
Ya. docker compose run --rm --no-deps web sh memulakan satu bekas daripada definisi perkhidmatan web, melangkau kebergantungannya dan mengalih keluar bekas apabila anda keluar. Gunakan exec apabila bekas itu sudah berjalan, kerana exec menyertai proses aktif dan memaparkan keadaan sebenar perkhidmatan tersebut.