2016-03-22 27 views
22

Beginner Docker câu hỏi ở đây,hostname địa phương cho Docker container

Vì vậy, tôi có một môi trường phát triển trong đó tôi đang chạy một ứng dụng mô-đun, nó đang làm việc sử dụng Docker Soạn thư để chạy 3 container: máy chủ, khách hàng, cơ sở dữ liệu.

Các docker-compose.yml trông như thế này:

############################# 
# Server 
############################# 
server: 
    container_name: server 
    domainname: server.dev 
    hostname: server 
    build: ./server 
    working_dir: /app 
    ports: 
    - "3000:3000" 
    volumes: 
    - ./server:/app 
    links: 
    - database 

############################# 
# Client 
############################# 
client: 
    container_name: client 
    domainname: client.dev 
    hostname: client 
    image: php:5.6-apache 
    ports: 
    - "80:80" 
    volumes: 
    - ./client:/var/www/html 

############################# 
# Database 
############################# 
database: 
    container_name: database 
    domainname: database.dev 
    hostname: database 
    image: postgres:9.4 
    restart: always 
    environment: 
    - POSTGRES_USER=postgres 
    - POSTGRES_PASSWORD=root 
    - POSTGRES_DB=dbdev 
    - PG_TRUST_LOCALNET=true 
    ports: 
    - "5432:5432" 
    volumes: 
    - ./database/scripts:/docker-entrypoint-initdb.d # init scripts 

Bạn có thể thấy tôi đang gán một domainname .dev cho mỗi người, điều này hoạt động tốt để xem một máy với nhau (Docker mạng nội bộ), ví dụ ở đây tôi đang ping server.dev từ CLI client.dev 's:

[email protected]:/var/www/html# ping server.dev 
    PING server.dev (127.0.53.53): 56 data bytes 
    64 bytes from 127.0.53.53: icmp_seq=0 ttl=64 time=0.036 ms 

này hoạt động tuyệt vời trong nội bộ, nhưng không phải trên mạng điều hành máy chủ của tôi.

Để thuận tiện, tôi muốn gán tên miền trong mạng cục bộ của tôi, không phải mạng vùng chứa Docker để tôi có thể gõ: client.dev trên URL trình duyệt của tôi và tải vùng chứa Docker.

Ngay bây giờ, tôi có thể truy cập nếu tôi sử dụng IP Docker, đó là năng động:

client: 192.168.99.100:80 
server: 192.168.99.100:3000 
database: 192.168.99.100:5432 

Có một chiều/thuận tiện tự động để làm điều này mà không liên quan đến tôi bằng tay thêm IP để tệp/etc/hosts của tôi?

BTW Tôi đang sử dụng OSX nếu có bất kỳ sự liên quan nào.

Cảm ơn!

Edit: tôi thấy vấn đề này Github mà dường như có liên quan: https://github.com/docker/docker/issues/2335

Theo như tôi hiểu, họ dường như nói rằng nó là một cái gì đó mà không có sẵn bên ngoài của hộp và họ đề nghị bên ngoài công cụ thích:

Điều đó có đúng không? Và nếu có, tôi nên đi đâu trong kịch bản cụ thể của mình?

+0

Tôi chưa bao giờ sử dụng đế cắm, nhưng địa chỉ IPv4 trong phạm vi 127.0.0.0/8 được định nghĩa là vòng lặp. Điều đó sẽ không cho phép bất kỳ communicatios nào bên ngoài máy – infixed

+0

Đây không phải là một câu hỏi của docker, vì nó là một câu hỏi mạng. Bạn muốn biết hostOS của bạn có thể có bí danh máy chủ lưu trữ động như thế nào (trong trường hợp thay đổi ip của docker) có? Tôi nghĩ bạn có thể kết hợp một 'docker ps -a | lệnh grep 192' có các khái niệm từ https://books.google.com/books?id=HggtWI1ShvMC&pg=PT142&lpg=PT142&dq=how+to+set+a+host+alias+as+an+environment+variable+/etc/hosts&source = bl & OTS = PSOwZZOwVs & sig = TEHiz2Ef_a36AEhXigSAi0hWsI0 & hl = vi & sa = X & ved = 0ahUKEwjdmpz-tdTLAhUIy2MKHZW3CTcQ6AEIWDAJ # v = onepage & q = cách% 20to% 20set% 20a% 20host% 20alias% 20as% 20an% 20environment% 20variable% 20% 2Fetc% 2Fhosts & f = false – CtheGood

Trả lời

11

OK,

như vậy kể từ it seems that there is no native way to do this with Docker, tôi cuối cùng đã lựa chọn alternate solution này từ Ryan Armstrong, trong đó bao gồm trong động cập nhật các tập tin /etc/hosts.

Tôi đã chọn điều này vì nó thuận tiện cho tôi vì nó hoạt động như một tập lệnh và tôi đã có một tập lệnh khởi động, vì vậy tôi có thể thêm chức năng này vào nó.

Ví dụ sau tạo mục nhập máy chủ có tên docker.địa phương mà sẽ phân giải thành IP Docker-máy tính của bạn:

update-docker-host(){ 
    # clear existing docker.local entry from /etc/hosts 
    sudo sed -i '' '/[[:space:]]docker\.local$/d' /etc/hosts 

    # get ip of running machine 
    export DOCKER_IP="$(echo ${DOCKER_HOST} | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" 

    # update /etc/hosts with docker machine ip 
    [[ -n $DOCKER_IP ]] && sudo /bin/bash -c "echo \"${DOCKER_IP} docker.local\" >> /etc/hosts" 
} 

update-docker-host 

này sẽ tự động thêm Hoặc cập nhật dòng /etc/hosts trên OS máy chủ của tôi khi tôi khởi động máy Docker thông qua kịch bản khởi động của tôi.

Anyways, như tôi đã phát hiện ra trong quá trình nghiên cứu của tôi, ngoài việc chỉnh sửa file hosts, bạn cũng có thể giải quyết vấn đề này bằng cách setting up a custom DNS server:

Cũng tìm thấy một số dự án trên Github mà dường như nhằm mục đích giải quyết vấn đề này, mặc dù tôi không thử chúng:

4

Mở rộng câu trả lời của chính @ eduwass, dưới đây là những gì tôi đã làm theo cách thủ công (không có tập lệnh).

  1. Như đã đề cập trong câu hỏi, xác định domainname: myapp.devhostname: www trong file docker-compose.yml
  2. Mang-ten-nơ Docker của bạn như bình thường
  3. Run docker-compose exec client cat /etc/hosts để có được một sản lượng của tập tin host của container (nơi client là của bạn tên dịch vụ) (Output dụ: 172.18.0.6 www.myapp.dev)
  4. Mở mất (máy chủ của bạn) /etc/hosts tập tin và thêm dòng: 172.18.0.6 server.server.dev

Nếu vùng chứa dịch vụ Docker của bạn thay đổi IP hoặc thực hiện bất kỳ thứ gì lạ mắt, bạn sẽ muốn có một giải pháp phức tạp hơn, nhưng điều này đang làm việc cho các nhu cầu đơn giản của tôi vào lúc này.

+0

tôi đang tìm kiếm trong tất cả internet cho việc này. Cảm ơn bạn rất nhiều – Malaba

0

Để tạo toàn bộ miền cho máy chủ cục bộ, bạn có thể sử dụng dnsmasq. Trong trường hợp này nếu bạn chọn miền .dev bất kỳ tên miền phụ nào sẽ trỏ đến vùng chứa của bạn. Nhưng bạn phải biết về problems với .dev khu

Hoặc bạn có thể sử dụng kịch bản bash cho ra mắt Docker-soạn của bạn mà khi khởi động sẽ bổ sung thêm dòng vào/etc/hosts và sau khi bạn giết quá trình này dòng này sẽ bị loại bỏ

#!/usr/bin/env bash 

sudo sed -i '1s;^;127.0.0.1 example.dev\n;' /etc/hosts 

trap 'sudo sed -i "/example.dev/d" /etc/hosts' 2 

docker-compose up 
Các vấn đề liên quan