Men-debug sebagian besar program Linux biasanya melibatkan pemeriksaan file log, yang bisa menjadi proses yang rumit. Namun, saat berjalan di lingkungan kemas di bawah Docker, Anda harus menggunakan alat yang lebih spesifik untuk men-debug aplikasi dalam produksi.
Di mana Log Disimpan?
Jawaban sederhananya adalah Docker menyimpan log kontainer di lokasi penyimpanan utamanya, /var/lib/docker/
. Setiap penampung memiliki log khusus untuk ID mereka (ID lengkap, bukan yang disingkat yang biasanya ditampilkan) dan Anda dapat mengaksesnya seperti ini:
/var/lib/docker/containers/ID/ID-json.log
Di situlah di mana mereka disimpan, tetapi karena dalam format JSON, mereka tidak mudah dibaca, dan harus menggunakan ID penampung yang lengkap itu menjengkelkan. Docker menyediakan perintah bawaan untuk melihatnya:
docker logs -f e4bd48ef3103
Di sini, -f
flag akan membuat prompt tetap terbuka dan "ikuti" setiap entri baru dalam file. Anda juga dapat --tail
file, atau gunakan --timestamps
untuk menampilkan waktu log, atau gunakan --until
dan --since
untuk memfilter berdasarkan waktu.
Jika Anda menggunakan Docker Compose, Anda dapat menggunakan perintah log dari itu untuk melihat semua log dengan mudah:
docker-compose logs
Namun, satu hal yang akan Anda perhatikan adalah bahwa ini adalah STDOUT dan STDERR, yang berguna untuk banyak hal, tetapi hanya menampilkan output konsol dari titik masuk yang ditentukan oleh "CMD" di file Docker. Banyak aplikasi memiliki sistem pencatatan khusus mereka sendiri, yang sering kali masuk ke file seperti /var/log/nginx/access.log
. Mengakses log seperti ini masih dimungkinkan dari sisi host melalui Docker.
Melihat Log Dari Aplikasi Di Dalam Penampung
Tergantung pada wadahnya, ini mungkin tidak diperlukan. Misalnya, wadah NGINX default diatur untuk mengirim log Docker ke STDOUT untuk mempermudah pemeriksaan log. Ia melakukan ini dengan symlink dari /dev/stdout
ke file log, dan Anda dapat menyiapkan sesuatu yang serupa untuk container Anda.
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
Namun, jika Anda ingin memeriksa file tertentu di dalam wadah, Anda dapat melakukannya. Docker menyediakan exec -it
perintah untuk memungkinkan Anda menjalankan perintah apa pun di dalam proses Docker yang sedang berjalan. Dengan ini, Anda dapat mengekor file log di dalam wadah Docker:
docker exec -it e4bd48ef3103 tail -f log.txt
Karena ini memungkinkan Anda menjalankan perintah apa pun, Anda dapat menggunakan journalctl
atau strategi debugging lain yang Anda inginkan, selama Anda mengawalinya dengan docker exec -it
. Anda bahkan dapat menjalankan /bin/bash
jika Anda ingin masuk dan melihat-lihat.
Solusi yang lebih permanen yang bermain lebih baik dengan layanan host adalah dengan menggunakan volume mount Docker. Anda dapat mengikat direktori seperti /var/log/nginx
ke volume yang terlihat dari host. Pertama, buat volume baru:
docker volume create nginx-logs
Dan jalankan wadah dengan --mount
:
docker run -d --name devtest --mount source=nginx-logs,target=/var/log/nginx nginx:latest
Jika Anda menggunakan Docker Compose, prosesnya bisa otomatis:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-logs:/var/log/nginx/ volumes: nginx-logs:
Dengan cara ini, file log akan langsung dapat dicerna oleh layanan agregasi log apa pun di mesin host.
Melihat Log Daemon Docker
Jika Anda ingin melihat log khusus untuk keseluruhan layanan Docker di server Anda, dan bukan aplikasi kemas tertentu, Anda dapat melihat journalctl
log:
sudo journalctl -fu docker.service
Ini adalah tempat penyimpanannya di sebagian besar sistem, tetapi di beberapa tempat berbeda:
- Amazon Linux:
/var/log/docker
- CentOS/RHEL:
/var/log/messages | grep docker
- macOS:
~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
- Windows:
AppDataRoamingDockerlogvmdockerd.log