2015-04-22 12 views
32

Có những cách nào để nhận hostname của host docker từ bên trong một container đang chạy trên host đó ngoài việc sử dụng các biến môi trường? Tôi biết tôi có thể chuyển tên máy chủ dưới dạng biến môi trường cho vùng chứa tại thời điểm tạo vùng chứa. Tôi tự hỏi làm thế nào tôi có thể tìm kiếm nó tại thời gian chạy.Làm thế nào để có được tên máy chủ lưu trữ của docker host từ bên trong một docker container trên máy chủ đó mà không có env vars

foo.example.com (docker host) 
    bar (docker container) 

Có cách nào cho container bar chạy trong máy chủ Docker foo.example.com để có được "foo.example.com"?

Chỉnh sửa để thêm trường hợp sử dụng:

Các container sẽ tạo một bản ghi SRV cho khám phá dịch vụ của mẫu

_service._proto.name. TTL class SRV priority weight port target. 
----------------------------------------------------------------- 
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo.example.com. 

nơi 20003 là một cổng tự động phân bổ trên các máy chủ Docker cho một dịch vụ lắng nghe trên một số cổng cố định trong thanh (docker xử lý ánh xạ từ cổng máy chủ đến cổng container).

Vùng chứa của tôi sẽ chạy kiểm tra sức khỏe để đảm bảo rằng nó đã tạo thành công bản ghi SRV đó vì sẽ có nhiều vùng chứa thanh khác trên máy chủ lưu trữ khác cũng tạo bản ghi SRV của riêng họ.

_service._proto.name. TTL class SRV priority weight port target. 
----------------------------------------------------------------- 
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo.example.com. <-- 
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo2.example.com. 
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo3.example.com. 

Kiểm tra sức khỏe sẽ lặp qua các bản ghi SRV tìm kiếm tệp đầu tiên ở trên và do đó cần biết tên máy chủ của nó.

dành

Tôi đang sử dụng Helios và chỉ phát hiện ra nó cho biết thêm một env var for me từ mà tôi có thể nhận được hostname. Nhưng tôi chỉ tò mò trong trường hợp tôi đang sử dụng docker mà không có Helios.

+0

Bạn có thể làm rõ, tại sao bạn cần tính năng này? –

+0

Có lẽ nếu bạn có thể giải thích trường hợp sử dụng của mình, có thể có cách tiếp cận tốt hơn cho vấn đề của bạn? –

+1

@VitalyIsaev đã thêm trường hợp sử dụng –

Trả lời

9

Bạn có thể chuyển tên máy chủ dưới dạng biến môi trường. Bạn cũng có thể gắn kết/etc để bạn có thể cat/etc/hostname. Nhưng tôi đồng ý với Vitaly, đây không phải là trường hợp sử dụng dự định cho container IMO.

+0

mount/etc có lẽ là dễ nhất hoặc một số dữ liệu khác thư mục mà bạn lưu trữ giá trị này trong, để không phơi bày toàn bộ thư mục/etc. Thay vào đó hãy tạo '~/data/hostname' và chia sẻ ~/data – Michael

+0

Trường hợp sử dụng đã dẫn tôi đến đây là tạo liên kết đặt lại mật khẩu. – jxstanford

+0

Varnish tạo một thư mục với tên máy chủ lưu trữ vùng chứa như: '/ usr/local/var/varnish/a15daa0160c8 /' – guneysus

17

Bạn có thể dễ dàng vượt qua nó như là một môi trường biến

docker run .. -e HOST_HOSTNAME=`hostname` .. 

sử dụng

-e HOST_HOSTNAME=`hostname` 

sẽ gọi tên máy và sử dụng nó trở lại như là một biến môi trường được gọi là HOST_HOSTNAME, tất nhiên bạn có thể tùy chỉnh phím như bạn muốn.

lưu ý rằng điều này hoạt động trên vỏ bash, nếu bạn sử dụng một lớp vỏ khác nhau mà bạn có thể cần phải xem thay thế cho "backtick", ví dụ như một sự thay thế fish vỏ sẽ

docker run .. -e HOST_HOSTNAME=(hostname) .. 
+3

Tôi đã tự hỏi liệu có cách nào để thực hiện điều này mà không sử dụng v.v. –

3

Một tùy chọn khác mà làm việc cho tôi đã để ràng buộc không gian tên mạng của máy chủ với docker.

Bằng cách thêm:

docker run --net host 
+1

bạn có thể làm rõ câu trả lời của mình không? đối với câu hỏi ban đầu của người đăng, bạn có gợi ý rằng mình chạy 'docker run --net host bar'? – ekkis

7

tôi thêm này vì nó không được đề cập trong bất kỳ câu trả lời khác.Bạn có thể cung cấp cho một container một tên máy chủ cụ thể khi chạy với lệnh -h.

docker run -h=my.docker.container.example.com ubuntu:latest 

Bạn có thể sử dụng dấu gạch chéo ngược (hoặc bất kỳ giá trị nào tương đương với vỏ sử dụng) để nhận đầu ra của hosthame vào đối số -h.

docker run -h=`hostname` ubuntu:latest 

Có một caveat, giá trị của hostname sẽ được lấy từ máy chủ mà bạn chạy lệnh từ, vì vậy nếu bạn muốn tên máy của một máy ảo đang chạy chứa Docker của bạn sau đó sử dụng hostname như một cuộc tranh cãi có thể không chính xác nếu bạn đang sử dụng máy chủ để thực hiện các lệnh docker trên máy ảo.

5

Tôi nghĩ lý do tôi có cùng một vấn đề là bug in the latest Docker for Mac beta, nhưng bị chôn vùi trong các nhận xét ở đó tôi có thể tìm được giải pháp phù hợp với tôi & nhóm của tôi. Chúng tôi đang sử dụng điều này để phát triển địa phương, nơi chúng tôi cần các dịch vụ container của chúng tôi để nói chuyện với một nguyên khối khi chúng tôi làm việc để thay thế nó. Đây có lẽ không phải là giải pháp khả thi sản xuất.

Trên máy chủ, bí danh một sẵn địa chỉ IP được biết đến với giao diện loopback:

$ sudo ifconfig lo0 alias 10.200.10.1/24 

Sau đó thêm rằng IP với một hostname để cấu hình Docker của bạn. Trong trường hợp của tôi, tôi đang sử dụng Docker-soạn, vì vậy tôi thêm này để tôi Docker-compose.yml:

extra_hosts: 
# configure your host to alias 10.200.10.1 to the loopback interface: 
#  sudo ifconfig lo0 alias 10.200.10.1/24 
- "relevant_hostname:10.200.10.1" 

sau đó tôi xác nhận rằng dịch vụ máy chủ mong muốn (một máy chủ web) đã có sẵn từ bên trong container bằng cách đính kèm vào một phiên bash và sử dụng wget để yêu cầu một trang từ máy chủ web của máy chủ:

$ docker exec -it container_name /bin/bash 
$ wget relevant_hostname/index.html 
$ cat index.html 
+0

Cảm ơn vì điều này, tôi đã đọc qua các vấn đề về docker và đây là giải pháp ưa thích của tôi cho một dự án docker-compose – ebrohman

Các vấn đề liên quan