Bagaimana cara menyetel nama host di docker-compose?


120

Dalam docker-compose.ymlfile saya , saya memiliki yang berikut ini. Namun penampung tidak mengambil nilai nama host. Ada ide?

dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock

Ketika saya memeriksa nama host di penampung itu tidak diambil affy.


1
Versi Tulis apa yang Anda gunakan?
kojiro

Jawaban:



57

Sepertinya ini bekerja dengan benar. Jika saya memasukkan konfigurasi Anda ke dalam file:

$ cat > compose.yml <<EOF
dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock
EOF

Dan kemudian angkat semuanya:

$ docker-compose -f compose.yml up
Creating tmp_dns_1...
Attaching to tmp_dns_1
dns_1 | 2015-04-28T17:47:45.423387 [dockerdns] table.add tmp_dns_1.docker -> 172.17.0.5

Dan kemudian periksa nama host di dalam penampung, semuanya tampak baik-baik saja:

$ docker exec -it stack_dns_1 hostname
affy.affy.com

1
Versi Tulis apa yang Anda gunakan?
kojiro

Format ini tidak berfungsi di versi terbaru docker-compose. File YML adalah hal yang rumit; apakah Anda yakin ini adalah format yang tepat untuk dns?
George Stocker

3
File YML tidak terlalu rewel. Apa artinya "tidak berhasil"? Menurut dokumentasi , baik hostnamedan domainnameberlaku docker-compose.ymlpilihan. Pembaruan: baru saja diuji, tampaknya masih berfungsi dengan baik (docker-compose versi 1.4.2, versi docker 1.8.2).
Larsks

Apakah ada cara untuk mengekspos nama host ini di luar lingkungan buruh pelabuhan? Akan lebih baik jika tuan rumah dapat mengakses kontainer buruh pelabuhan dengan nama dns mereka.
Paul Praet

1
Itu mungkin, dan mungkin layak untuk pertanyaan itu sendiri. Jika Anda mencari "docker dns" Anda akan menemukan beberapa hasil yang relevan; lihat apa yang ada di luar sana dulu.
Larsks

53

Saya menemukan bahwa nama host tidak terlihat oleh penampung lain saat menggunakan docker run. Ini ternyata merupakan masalah yang diketahui (mungkin lebih merupakan fitur yang diketahui), dengan bagian dari pembahasannya adalah:

Kami mungkin harus menambahkan peringatan ke dokumen tentang menggunakan nama host. Saya pikir itu jarang berguna.

Cara yang benar untuk menetapkan nama host - dalam hal jaringan kontainer - adalah dengan mendefinisikan alias seperti ini:

services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1
          - alias2

Sayangnya ini masih tidak berhasil docker run. Solusinya adalah dengan menetapkan nama penampung:

docker-compose run --name alias1 some-service

Dan alias1kemudian dapat di-ping dari wadah lain.

PEMBARUAN: Seperti yang ditunjukkan @grilix, Anda harus menggunakan docker-compose run --use-aliasesuntuk membuat alias yang ditentukan tersedia.


11
Saya terjebak dengan masalah itu sehingga saya tidak dapat mengakses wadah dengan nama rumah dari wadah lain. Dan Anda satu-satunya di seluruh internet yang menyatakan masalah ini .. sudah googling selama 20 jam
holms

7
Sama disini! Sungguh gila bahwa jutaan pengembang tampaknya menggunakan Docker, tetapi tidak ada yang tahu cara memberi nama yang sederhana pada kotak, bahkan tidak untuk dokumen resmi. Terima kasih banyak :)
Sliq

1
Untuk berjaga-jaga, sekarang kita bisa menggunakan --use-aliasesdengan docker-compose run. Ini akan menghindari hardcode alias pada runperintah
grilix

38

Berdasarkan dokumentasi buruh pelabuhan: https://docs.docker.com/compose/compose-file/#/command

Saya hanya memasukkan hostname: <string> file docker-compose saya.

Misalnya:

[...]

lb01:
  hostname: at-lb01
  image: at-client-base:v1

[...]

dan kontainer lb01 diambil at-lb01sebagai nama host.


jika Anda memiliki beberapa container di file docker-compose, apakah Anda akan menyetel nama host untuk setiap container? yang tampaknya sangat tidak efisien?
vgoklani

6
Jika Anda membutuhkan nama terkenal untuk kontainer, itu adalah solusi yang layak.
Marcello Romani

9

Cara termudah yang saya temukan adalah dengan hanya mengatur nama wadah di docker-compose.ymlLihat dokumentasi nama_penampung . Ini berlaku untuk docker-compose v1 +. Ini berfungsi untuk penampung ke penampung, bukan dari mesin host ke penampung.

services:
  dns:
    image: phensley/docker-dns
    container_name: affy

Sekarang Anda seharusnya dapat mengakses affydari penampung lain menggunakan nama penampung. Saya harus melakukan ini untuk beberapa server redis dalam lingkungan pengembangan.

CATATAN Solusinya bekerja selama Anda tidak perlu mengukur. Seperti lingkungan pengembang individu yang konsisten.


Dalam Compose 3.7satu-satunya cara saya mendapat nama host layanan database untuk dilihat dari dalam wadah layanan lain dari tumpukan yang sama adalah untuk nama layanan sebagai nama host. Penggunaan hostname:properti gagal. Menggunakan lingkungan HOSTNAME = konstruksi gagal juga.
Stephane

Solusi lain yang juga berhasil, adalah menggunakan aliasesproperti seperti yang dijelaskan dalam fozsolusi.
Stephane

1
Ini berfungsi dengan baik tetapi agak berantakan - saya sekarang telah mengambil pengaturan container_namedan hostnamenilai yang sama untuk mencapai apa yang saya butuhkan
Oliver Dungey

3

Saya perlu memutar wadah freeipa untuk memiliki kdc yang berfungsi dan harus memberikannya nama host jika tidak maka tidak akan berjalan. Apa yang akhirnya berhasil untuk saya adalah mengatur HOSTNAMEvariabel env di compose:

version: 2
services:
  freeipa:
    environment:
      - HOSTNAME=ipa.example.test

Sekarang bekerja:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test

2
Bagi saya, menggunakan slim, yang menghasilkan variabel lingkungan HOSTNAME yang tidak berpengaruh sama sekali pada nama host sebenarnya dari penampung
Oliver Dungey

2
Meskipun ini mungkin berhasil dengan penampung yang Anda gunakan, perintah lingkungan hanya menampilkan variabel ke penampung. Terserah wadahnya untuk melakukan sesuatu dengan nilai yang telah ditetapkan. Dalam banyak kasus, kemungkinan besar tidak akan melakukan apa-apa.
MrJohnBBQ

mengekspos env var tidak ada hubungannya dengan nama host penampung, mereka adalah dua ranah yang terpisah.
Marcello Romani
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.