Saya ingin memberitahukan docker containers
konfigurasi mereka, dengan cara yang sama Anda dapat memperoleh informasi tentang instance EC2 melalui metadata.
Saya bisa menggunakan (asalkan docker
mendengarkan di port 4243
)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
untuk mendapatkan beberapa datanya, tetapi ingin tahu apakah ada cara yang lebih baik setidaknya mendapatkan ID lengkap wadah, karena HOSTNAME
sebenarnya disingkat menjadi 12 karakter dan buruh pelabuhan tampaknya melakukan "pertandingan terbaik" di atasnya.
Juga, bagaimana saya bisa mendapatkan IP eksternal dari host buruh pelabuhan (selain mengakses metadata EC2, yang khusus untuk AWS)
/var/run/docker.sock
, dimungkinkan (sepele) untuk keluar dari kontainmen yang disediakan oleh buruh pelabuhan dan mendapatkan akses ke mesin host. Jelas ini berpotensi berbahaya.Jawaban:
Saya menemukan bahwa id kontainer dapat ditemukan di / proc / self / cgroup
Jadi Anda bisa mendapatkan id dengan:
sumber
cat /proc/self/cgroup | grep "docker" | sed s/\\//\\n/g | tail -1
cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1
cat /proc/1/cgroup | grep 'docker/' | tail -1 | sed 's/^.*\///' | cut -c 1-12
basename "$(cat /proc/1/cpuset)"
danbasename "$(head /proc/1/cgroup)"
Kecuali dikesampingkan, nama host tampaknya menjadi id penampung pendek di Docker 1.12
Secara eksternal
sumber
const os = require('os'); console.log(os.hostname());
InetAddress.getLocalHost().getHostName()
.$HOSTNAME
(misalnya dalam skrip shell).Anda dapat berkomunikasi dengan buruh pelabuhan dari dalam wadah menggunakan soket unix melalui Docker Remote API:
https://docs.docker.com/engine/reference/api/docker_remote_api/
Dalam sebuah wadah, Anda dapat menemukan id buruh pelabuhan yang dipersingkat dengan memeriksa
$HOSTNAME
env var. Menurut dokter, ada sedikit kemungkinan tabrakan, saya pikir untuk sejumlah kecil kontainer, Anda tidak perlu khawatir. Saya tidak tahu cara mendapatkan id lengkap secara langsung.Anda dapat memeriksa wadah dengan cara yang sama seperti diuraikan dalam jawaban beringin :
Tanggapan:
Atau, Anda dapat mentransfer nomor buruh pelabuhan ke wadah dalam file. File ini terletak di "volume terpasang" sehingga dipindahkan ke wadah:
Id buruh pelabuhan (disingkat) akan berada di file / mydir/host1.txt dalam wadah.
sumber
env
tidak daftarHOSTNAME
, tetapiecho $HOSTNAME
berfungsi.requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Ini akan mendapatkan id kontainer lengkap dari dalam sebuah wadah:
sumber
Sebuah komentar oleh madeddie terlihat paling elegan bagi saya:
sumber
PERINGATAN: Anda harus memahami risiko keamanan dari metode ini sebelum Anda mempertimbangkannya. Ringkasan risiko John :
Di dalam wadah, dockerId adalah nama host Anda. Jadi, Anda bisa:
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
docker inspect $(hostname)
di dalam wadahHindari ini. Lakukan saja jika Anda memahami risikonya dan memiliki mitigasi risiko yang jelas.
sumber
--hostname
telah digunakan.--hostname
diatur, Anda dapat menggunakan kombinasi dari jawaban ini dan komentar dari @ Jay Taylor dalam jawaban yang diterima:docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)
untuk mendapatkan semua informasi tentang wadah yang sedang berjalan.Untuk membuatnya sederhana,
Untuk mendapatkan nama host,
atau
atau
Keluaran dapat diarahkan ke file apa saja & dibaca kembali dari aplikasi. Mis:
# hostname > /usr/src//hostname.txt
sumber
Saya telah menemukan bahwa di 17.09 ada cara paling sederhana untuk melakukannya di dalam wadah buruh pelabuhan:
Atau seperti yang sudah diberitahukan, versi yang lebih pendek dengan
Atau sederhananya:
sumber
Docker secara default menetapkan nama host ke ID wadah, tetapi pengguna dapat menimpanya
--hostname
. Sebagai gantinya, periksa/proc
:Berikut ini adalah satu-liner berguna untuk mengekstrak ID wadah:
sumber
Anda dapat menggunakan baris perintah ini untuk mengidentifikasi ID kontainer saat ini (diuji dengan buruh pelabuhan 1.9).
Kemudian, sedikit permintaan ke Docker API (Anda dapat membagikan /var/run/docker.sock) untuk mengambil semua informasi.
sumber
Beberapa solusi yang diposting telah berhenti berfungsi karena perubahan format
/proc/self/cgroup
. Ini adalah satu perintah grep GNU yang seharusnya sedikit lebih kuat untuk memformat perubahan:Untuk referensi, berikut adalah potongan dari / proc / self / cgroup dari container docker dalam yang telah diuji dengan perintah ini:
Linux 4.4:
Linux 4.8 - 4.13:
sumber
sumber
Sebagai tambahan, jika Anda memiliki pid dari wadah dan ingin mendapatkan buruh pelabuhan dari wadah itu, cara yang baik adalah menggunakan nsenter dalam kombinasi dengan sihir sed di atas:
nsenter -n -m -t pid -- cat /proc/1/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
sumber
Gunakan
docker inspect
.Bisa mendapatkan ip sebagai berikut.
sumber