ฉันจะตั้งชื่อโฮสต์ใน Docker-compose ได้อย่างไร


122

ในdocker-compose.ymlไฟล์ของฉันฉันมีสิ่งต่อไปนี้ อย่างไรก็ตามคอนเทนเนอร์ไม่รับค่าชื่อโฮสต์ ความคิดใด ๆ ?

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

affyเมื่อตรวจสอบชื่อโฮสต์ในภาชนะที่มันไม่ได้รับ


1
คุณใช้การเขียนเวอร์ชันใดอยู่
kojiro

คำตอบ:



57

ดูเหมือนว่าจะทำงานได้อย่างถูกต้อง ถ้าฉันใส่ config ของคุณลงในไฟล์:

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

จากนั้นนำสิ่งต่างๆขึ้นมา:

$ 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

จากนั้นตรวจสอบชื่อโฮสต์ภายในคอนเทนเนอร์ดูเหมือนว่าทุกอย่างจะเรียบร้อย:

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

1
คุณใช้การเขียนเวอร์ชันใดอยู่
kojiro

รูปแบบนี้ใช้ไม่ได้กับ Docker-compose เวอร์ชันล่าสุด ไฟล์ YML เป็นสิ่งที่จู้จี้จุกจิก แน่ใจหรือว่านี่เป็นรูปแบบที่ถูกต้องสำหรับ DNS
George Stocker

3
ไฟล์ YML ไม่ใช่ทั้งหมดที่จู้จี้จุกจิก "ไม่ทำงาน" หมายความว่าอย่างไร ตามเอกสารทั้งสองอย่างhostnameและdomainnameเป็นdocker-compose.ymlตัวเลือกที่ถูกต้อง อัปเดต: เพิ่งทดสอบดูเหมือนว่าจะทำงานได้ดี (นักเทียบท่ารุ่น 1.4.2 นักเทียบท่า 1.8.2)
larsks

มีวิธีใดบ้างที่จะเปิดเผยชื่อโฮสต์นี้นอกสภาพแวดล้อม Docker คงจะดีไม่น้อยถ้าโฮสต์สามารถเข้าถึง Docker container โดยใช้ชื่อ DNS
Paul Praet

1
เป็นไปได้และน่าจะเป็นคำถามของตัวเอง หากคุณค้นหา "docker dns" คุณจะพบผลลัพธ์ที่เกี่ยวข้องมากมาย ดูสิ่งที่อยู่ข้างนอกก่อน
larsks

53

ฉันพบว่าชื่อโฮสต์ก็จะมองไม่เห็นภาชนะอื่น ๆ docker runเมื่อใช้ สิ่งนี้กลายเป็นปัญหาที่ทราบกันดี (อาจจะเป็นที่รู้จักมากกว่า) โดยส่วนหนึ่งของการสนทนาคือ:

เราควรเพิ่มคำเตือนในเอกสารเกี่ยวกับการใช้ชื่อโฮสต์ ผมว่าไม่ค่อยมีประโยชน์

วิธีที่ถูกต้องในการกำหนดชื่อโฮสต์ - ในแง่ของระบบเครือข่ายคอนเทนเนอร์ - คือการกำหนดนามแฝงดังนี้:

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

แต่น่าเสียดายที่นี้ยังคงdocker runไม่ได้ทำงานกับ วิธีแก้ปัญหาคือการกำหนดชื่อคอนเทนเนอร์:

docker-compose run --name alias1 some-service

และalias1จากนั้นจะสามารถส่ง Ping จากภาชนะอื่น ๆ

UPDATE: ดังที่ @grilix ชี้ให้เห็นคุณควรใช้docker-compose run --use-aliasesเพื่อทำให้นามแฝงที่กำหนดพร้อมใช้งาน


11
ฉันติดปัญหาที่ไม่สามารถเข้าถึงคอนเทนเนอร์โดย hosname จากคอนเทนเนอร์อื่นได้ และคุณเพียงคนเดียวในอินเทอร์เน็ตทั้งหมดที่ระบุปัญหานี้ .. รับ googling 20 ชั่วโมงแล้ว
Holms

7
เหมือนกันที่นี่! เป็นเรื่องบ้าที่นักพัฒนาหลายล้านคนดูเหมือนจะใช้ Docker แต่ไม่มีใครรู้วิธีตั้งชื่อกล่องให้เรียบง่ายไม่ใช่แม้แต่เอกสารทางการ ขอบคุณมาก :)
Sliq

1
ในกรณีนี้เราสามารถใช้--use-aliasesกับdocker-compose run. วิธีนี้จะหลีกเลี่ยงการเข้ารหัสนามแฝงบนrunคำสั่งอย่าง
หนัก

39

อ้างอิงจากเอกสารนักเทียบท่า: https://docs.docker.com/compose/compose-file/#/command

ฉันแค่ใส่ hostname: <string> ไฟล์นักเทียบท่าเขียน

เช่น:

[...]

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

[...]

และคอนเทนเนอร์ lb01 รับat-lb01เป็นชื่อโฮสต์


ถ้าคุณมีหลายคอนเทนเนอร์ในไฟล์ Docker-compose คุณจะตั้งชื่อโฮสต์สำหรับแต่ละคอนเทนเนอร์หรือไม่ ที่ดูเหมือนไม่มีประสิทธิภาพมาก?
vgoklani

6
หากคุณต้องการชื่อที่รู้จักกันดีสำหรับคอนเทนเนอร์นั่นเป็นทางออกที่ใช้ได้
Marcello Romani

9

วิธีที่ง่ายที่สุดที่ฉันพบคือเพียงตั้งชื่อคอนเทนเนอร์ในเอกสารdocker-compose.ymlดูcontainer_name ใช้ได้กับนักเทียบท่าเขียน v1 + ใช้ได้กับตู้คอนเทนเนอร์ไม่ใช่จากเครื่องโฮสต์ไปยังตู้คอนเทนเนอร์

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

ตอนนี้คุณควรจะสามารถเข้าถึงaffyจากคอนเทนเนอร์อื่นโดยใช้ชื่อคอนเทนเนอร์ ฉันต้องทำสิ่งนี้สำหรับเซิร์ฟเวอร์ redis หลายตัวในสภาพแวดล้อมการพัฒนา

หมายเหตุวิธีแก้ปัญหานี้ใช้ได้ตราบเท่าที่คุณไม่จำเป็นต้องปรับขนาด เช่นสภาพแวดล้อมของนักพัฒนาแต่ละคนที่สอดคล้องกัน


ในCompose 3.7วิธีเดียวที่ฉันมีชื่อโฮสต์บริการฐานข้อมูลที่จะเห็นจากภายในภาชนะบริการอื่นของสแต็คเดียวกันคือการตั้งชื่อบริการเป็นชื่อโฮสต์ การใช้hostname:คุณสมบัติล้มเหลว การใช้สภาพแวดล้อม HOSTNAME = การสร้างล้มเหลวเช่นกัน
Stephane

อีกวิธีหนึ่งที่ได้ผลเช่นกันคือการใช้aliasesคุณสมบัติตามที่อธิบายไว้ในfozโซลูชัน
Stephane

1
สิ่งนี้ใช้งานได้ดี แต่ค่อนข้างยุ่ง - ตอนนี้ฉันได้ตั้งค่าcontainer_nameและhostnameใช้ค่าเดียวกันเพื่อให้บรรลุสิ่งที่ฉันต้องการ
Oliver Dungey

3

ฉันต้องการหมุนคอนเทนเนอร์ freeipaเพื่อให้มี kdc ที่ใช้งานได้และต้องตั้งชื่อโฮสต์มิฉะนั้นจะไม่ทำงาน ในที่สุดสิ่งที่ได้ผลสำหรับฉันคือการตั้งค่าHOSTNAMEตัวแปร env ในการเขียน:

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

ตอนนี้ใช้งานได้:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test

2
สำหรับฉันการใช้ slim ซึ่งส่งผลให้ตัวแปรสภาพแวดล้อม HOSTNAME ไม่มีผลกับชื่อโฮสต์จริงของคอนเทนเนอร์
Oliver Dungey

2
แม้ว่าสิ่งนี้อาจใช้งานได้กับคอนเทนเนอร์ที่คุณใช้ แต่คำสั่งสภาพแวดล้อมจะแสดงตัวแปรไปยังคอนเทนเนอร์เท่านั้น ยังคงขึ้นอยู่กับคอนเทนเนอร์ที่จะทำอะไรบางอย่างกับค่าที่ตั้งไว้ ในหลาย ๆ กรณีอาจไม่ทำอะไรเลย
MrJohnBBQ

การเปิดเผย env var ไม่มีส่วนเกี่ยวข้องกับชื่อโฮสต์ของคอนเทนเนอร์ แต่เป็นสองอาณาจักรที่แยกจากกัน
Marcello Romani
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.