2013-04-29 48 views
12

Docker (www.docker.io) trông thật tuyệt vời. Tuy nhiên, sau khi cài đặt VirtualBox, Vagrant ... và cuối cùng là Docker trên máy Mac, tôi không thể truy cập dịch vụ đang chạy trong vùng chứa Docker từ một máy tính khác (hoặc từ phiên đầu cuối trên máy Mac). Dịch vụ tôi đang truy cập là Redis.Docker container - làm thế nào để cấu hình để nó nhận được một địa chỉ IP khả thi khi chạy trong khu vực lang thang?

Sự cố có vẻ là không có tuyến đường đến địa chỉ IP được chỉ định cho vùng chứa Docker. Trong trường hợp này, IP của vùng chứa là 172.16.42.2 trong khi IP của máy Mac là 196.168.0.3.

Một vài lưu ý:

  1. nó có thể truy cập vào nó - nhưng chỉ từ bên trong phiên VirtualBox. Điều này có thể được thực hiện bằng redis-cli -h 172.16.42.2 -p 6379.
  2. Tôi đã thêm "config.vm.network: bridged" vào VagrantFile trong một nỗ lực để có được, nhưng điều đó không giải quyết được vấn đề .

Trả lời

16

Máy ảo được tạo bởi người lang thang thực sự bị cô lập, để truy cập máy chủ từ máy chủ của bạn, bạn có thể cấp phát một mạng riêng cho nó. Thay vì thực hiện config.vm.network :bridged, hãy thử config.vm.network :private_network, ip: "192.168.50.4", Cần thực hiện thủ thuật

Tuy nhiên, điều này sẽ chỉ cho phép bạn truy cập vào máy ảo chứ không phải các vùng chứa.
Để làm như vậy, khi chạy container, bạn có thể thêm tùy chọn -p

ví dụ: docker run -d -p 8989 base nc -lkp 8989

này sẽ chạy một netcat lắng nghe trên 8989 trong một container và phơi bày các cổng công khai. Vì nó cũng chạy với -d, vùng chứa sẽ ở chế độ tách rời và đầu ra duy nhất sẽ là ID của

của container để hiển thị cổng, Docker thực hiện NAT đơn giản. Để biết cảng thực, bạn có thể

làm docker port <ID of the container> 8989

Netcat sẽ có sẵn từ các mac tại 192.168.50.4: < result>

+5

Người ta có thể làm 'Docker chạy -d - p: 8989' bây giờ trực tiếp ánh xạ một cổng đến cùng một cổng công khai như https://github.com/dotcloud/docker/commit/2aad4a34785a1b0d02d910a14dbb9b0d6d3edc17 – bojo

+0

Có sự thay đổi nào trong Docker đã vô hiệu hóa chức năng này không? Tôi không thể nhận được để docker container của tôi từ máy chủ (OS X) mà không sử dụng ssh vagrant để tạo ra một đường hầm. –

+1

@DavClark bạn đã thiết lập một IP tĩnh cho vm vagrant của bạn? Docker bây giờ sử dụng unix socket theo mặc định. Bạn cần kích hoạt chế độ TCP. Bạn có thể chạy damon như thế này: 'docker -d -H tcp: //0.0.0.0: 4243' và client như sau:' docker -H tcp: // : 4243 run -i -t base bash' – creack

0

bạn cũng có thể xác định PRIVATE_NETWORK và môi trường FORWARD_DOCKER_PORTS biến để truy cập dịch vụ của bạn đang chạy trong các thùng chứa Docker:

$ vagrant halt 
$ export PRIVATE_NETWORK=192.168.50.4 
$ export FORWARD_DOCKER_PORTS=1 
$ vagrant up 

trong trường hợp của tôi, tôi có thể truy cập postgres từ máy Mac sử dụng

0.123.
$ telnet 192.168.50.4 49154 

để tìm hiểu cổng ứng dụng thực tế mà bạn có thể sử dụng

$ sudo docker port 1854499c6547 5432 
0.0.0.0:49154 
2

tôi chỉ viết một hướng dẫn về cách sử dụng một mạng lưới và TCP tuyến host-only để làm điều này khá dễ dàng. Bằng cách này bạn không phải lập bản đồ từng cổng cụ thể.

http://ispyker.blogspot.com/2014/04/accessing-docker-container-private.html

Điểm quan trọng ...

1) Thêm host-only mạng để Virtual Box 2) Cho boot2docker VM phải có một bộ chuyển đổi trên mạng host-only 3) Thêm một IP cho boot2docker mới VM host-only mạng adaptor 4) Định tuyến tất cả lưu lượng truy cập Mac OS X cho mạng con của trình docker tới mạng máy chủ VM boot2docker IP

Các bước thực tế trên blog với đầu ra để bạn có thể so sánh với những gì bạn thấy khi bạn theo dõi chúng.

+0

Chào mừng bạn đến với SO! Mặc dù bạn đã bao gồm URL, cũng rất hữu ích khi bao gồm các điểm quan trọng trong câu trả lời. –

+0

Đã thêm thông tin. Cảm ơn bạn đã bình luận. – Andrew

1

Tôi đã cài đặt tomcat từ Dockerfile của tôi và chuyển tiếp đến 6060 bằng cách sử dụng chuyển tiếp cổng vô lý. Đây là những bước làm việc cho tôi:

vagrant provision 
vagrant up 
vagrant ssh 
box_name$ docker run -i -t -p 8080:8080 bsb_tomcat6 /bin/bash 

Có thể thấy tomcat lên & chạy trên localhost: 6060, như tôi đã làm cổng chuyển tiếp tới 6060 trong Vagrantfile tôi

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