2014-11-09 14 views
7

Tôi không thể tìm ra cách bật API từ xa khi sử dụng boot2docker. Tôi đang cố gắng sử dụng dockerode như sau:Bật API từ xa trong Docker trên Mac OS X (boot2docker)

Docker = require('dockerode') 
docker = new Docker(socketPath: "/var/run/docker.sock") 

container = docker.getContainer('<my_container_id>') 

container.inspect (err, data) -> 
    debug data 

Dữ liệu là rỗng, mặc dù có vùng chứa có id ''. Tôi nghi ngờ điều này là vì không có /var/run/docker.sock trên host OS X, và rằng tôi sẽ cần phải sử dụng một cái gì đó như:

var docker2 = new Docker({host: 'http://192.168.1.10', port: 3000}); 

... nhưng không thể tìm ra cách để cấu hình boot2docker hoặc docker trong VirtualBox VM để cho phép truy cập thông qua http hoặc tcp.

Trả lời

3

Đế cắm, như được cấu hình bởi Boot2Docker, hỗ trợ truy cập từ xa trên cổng 2375 từ máy chủ OSX theo mặc định; đây là những gì được thiết lập khi nó yêu cầu bạn làm export DOCKER_HOST=tcp://192.168.59.103:2375

Nếu bạn muốn truy cập cổng từ máy khác, bạn cần định cấu hình mạng VirtualBox để định tuyến lưu lượng truy cập đến cổng đó. Điều này có thể được thực hiện bằng cách chuyển tiếp cổng bằng lệnh này:

VBoxManage modifyvm "boot2docker-vm" --natpf1 "guestssh,tcp,,2375,,2375" 

Sau đó, địa chỉ để sử dụng trong mã new Docker là địa chỉ IP của máy Mac.

Bạn cũng có thể định cấu hình điều này trong VirtualBox GUI trong boot2docker-vm/settings/network/advanced/port forwarding.

Xem VirtualBox docs. Lưu ý, như được mô tả here rằng điều này bây giờ cho phép bất kỳ ai có quyền truy cập IP vào máy của bạn để kiểm soát cài đặt Docker của bạn, đây có thể là mối lo ngại về bảo mật.

+0

Cảm ơn Bryan. Một thứ khác mà tôi đang cố gắng tìm ra là cách sử dụng curl để nói chuyện với API docker. Bạn có một số con trỏ? – akshayl

+0

yêu cầu tốt nhất là câu hỏi riêng. – Bryan

3

Trong phiên bản hiện tại của boot2docker (1.3.1), bạn có thể làm điều này bằng cách chỉ cần gắn một ổ đĩa vào container, ví dụ:

$ docker run -it -v /var/run/docker.sock:/home/docker.sock myimage bash 
[ [email protected]:~ ]$ ls /home 
docker.sock 

Docker = require('dockerode') 
docker = new Docker(socketPath: "/home/docker.sock") 
// should work! 

IMHO này là đơn giản và rõ ràng hơn so với rối tung xung quanh với cổng chuyển tiếp VirtualBox

Điều này thực sự giống như cách hầu hết các ví dụ về việc sử dụng trình khách API Docker được đặt ra, nghĩa là "chỉ cần gắn đế cắm vào bộ chứa dưới dạng ổ đĩa".

Có lẽ giống như tôi bạn nghĩ do cách boot2docker hoạt động, điều này sẽ không thể thực hiện được. Xét cho cùng, có vẻ như các phiên bản gần đây được thiết lập để chia sẻ khối lượng từ máy chủ OS X của bạn chứ không phải vm boot2docker, đó là những gì bạn muốn hầu hết thời gian. Nhưng không có đường dẫn /var/run/docker.sock trên máy chủ OS X của bạn, vậy điều gì đang xảy ra?

Điều thực sự xảy ra là thư mục /Users được gắn từ máy chủ của bạn vào vm boot2docker. Khi bạn thêm một ổ đĩa vào một thùng chứa dưới boot2docker nó vẫn còn chia sẻ bất cứ điều gì là tại đường dẫn trong vm ... nó chỉ xảy ra rằng bất kỳ đường dẫn dưới /Users trong vm được gắn kết từ máy chủ. Nhưng bất kỳ đường dẫn nào bên ngoài /Users sẽ đến từ chính vm boot2docker chứ không phải máy chủ lưu trữ của bạn.

tức là

$ boot2docker ssh 
[email protected]:~$ ls /var/run 
acpid.pid  acpid.socket  docker.pid  docker.sock  sshd.pid   udhcpc.eth0.pid udhcpc.eth1.pid utmp 

Có file socket Docker của chúng tôi, và vì nó nằm ngoài thư mục /Users chúng tôi có thể liên kết con đường đó vào container của chúng tôi như một khối lượng.

(Đối với một số lý do này không hoạt động:

$ docker run -it -v /var/run/docker.sock 

... các tập tin ổ cắm đi ra như một thư mục /var/run/docker.sock/ trong bao bì của chúng tôi - có vẻ như một lỗi Docker.)

Chúng tôi có để sử dụng mẫu thư đại tràng được tách biệt:

$ docker run -it -v /var/run/docker.sock:/home/docker.sock 
5

Đối với tất cả mọi người chạy vào vấn đề đó, hầu hết thời gian bạn muốn vô hiệu hóa TLS khi sử dụng một cái gì đó giống như boot2docker - đó là bui Nó không cho phép bạn truy cập vào API từ xa bằng cách sử dụng cơ bản giống như mọi công cụ REST mà bạn có thể nghĩ đến vì không ai trong số chúng hỗ trợ xác thực dựa trên TLS mà không có rất nhiều cấu hình.

Vì vậy, nếu bạn chỉ muốn phát triển trong vòng boot2docker, chạy này trong giao diện điều khiển boot2docker của bạn:

cp /etc/init.d/docker ~/docker.bak 
sudo sed -i 's/DOCKER_TLS:=auto/DOCKER_TLS:=no/1' /etc/init.d/docker 
sudo /etc/init.d/docker stop 
sudo /etc/init.d/docker start 

Nó sẽ vô hiệu hóa TLS và khởi động lại deamon Docker. Sau khi hoàn thành, bạn sẽ có thể mở http://your-boot2docker-ip:2375/info và nhận được một số đầu ra. Lưu ý rằng đây là của boot2docker 1,41. Tên của biến env được thay thế bởi lệnh sed ở trên có thể thay đổi trong tương lai. Có thể họ thậm chí sẽ vô hiệu hóa TLS theo mặc định trong các bản phát hành trong tương lai.

+0

sau hai ngày tôi cuối cùng đã api làm việc cảm ơn bài viết của bạn! cảm ơn lớn từ tôi! – pregmatch

+0

là điều này có nghĩa là tôi phải truy cập api từ https để thiết lập mặc định docker? – pregmatch

+0

Đơn giản chỉ cần sử dụng https sẽ không hoạt động vì docker không sử dụng xác thực cơ bản nhưng xác thực máy khách dựa trên cert. – masi