2014-11-28 23 views
44

Tôi đang chạy dưới boot2docker 1.3.1.Cách truy cập máy chủ web của Docker container từ máy chủ

Tôi có vùng chứa Docker đang chạy máy chủ web qua uwsgi --http :8080.

Nếu tôi đính kèm vào vùng chứa, tôi có thể duyệt trang web bằng cách sử dụng lynx http://127.0.0.1:8080 để tôi biết máy chủ đang hoạt động.

Tôi chạy container của tôi với:

$ docker run -itP --expose 8080 uwsgi_app:0.2 

Nó có các nội dung sau:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS      NAMES 
5248ad86596d  uwsgi_app:0.2  "bash"    11 minutes ago  Up 11 minutes  0.0.0.0:49159->8080/tcp cocky_hypatia 
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d 
172.17.0.107 

Tôi nghĩ tôi có thể truy cập vào trang web đó từ máy chủ của tôi bằng cách vào http://172.17.0.107:49159.

Điều này không có tác dụng. Tôi chỉ thấy 'đang kết nối ...' trong Chrome, không đi đâu cả.

Tôi đang làm gì sai?

+0

Bạn đang chạy Boot2Docker trên máy Mac hoặc Windows PC? Tôi sẽ giả sử Mac vì '$' – Bryan

+2

Mac, may mắn là – Anentropic

Trả lời

33

Ok, ngu ngốc tôi, tôi tìm thấy câu trả lời trong các tài liệu cho boot2docker https://docs.docker.com/installation/mac/#container-port-redirection

tôi cần phải sử dụng địa chỉ IP của vm boot2docker, chứ không phải là ip của container, tức là

$ boot2docker ip 
192.168.59.103 

và tôi có thể duyệt trang web của tôi từ máy chủ tại http://192.168.59.103:49159/

tôi không cần thêm bất kỳ route trên máy chủ

+1

Ah, tôi không phát hiện tùy chọn -P. – Bryan

+2

Trong trường hợp của tôi, tôi đã đảo ngược các cổng bằng tùy chọn 'run -p'. '-p 80: 5000'. Điều này sẽ ánh xạ cổng 5000 bên trong container của chúng tôi đến cổng 80 trên máy chủ cục bộ của chúng tôi. Tôi đã làm ngược lại. Xem https://docs.docker.com/userguide/usingdocker/ – Maxence

+2

Điều này giải quyết được vấn đề của tôi sau 1 ngày xử lý sự cố – David

0

[EDIT: phiên bản gốc đã được bỏ qua -P trong câu hỏi]

Nếu bạn muốn để có được các container mà không cần phải 'xuất bản' cảng (làm thay đổi số lượng của nó) có một run- tốt qua số here.

Điều quan trọng là dòng này:

sudo route -n add 172.17.0.0/16 172.16.0.11 

kể về Mac như thế nào để định tuyến cho mạng riêng bên trong VirtualBox VM rằng container Docker đang ở trên.

+0

chỉ cần thêm tuyến đường đó không khắc phục được tôi. Tôi tự hỏi IP này là gì? 172.16.0.11'? đó có nên là IP của vùng chứa của tôi không? Tôi đã thử nó nhưng điều đó không hoạt động hoặc – Anentropic

+0

Bạn đã đọc toàn bộ bài báo chưa? – Bryan

+0

Hoặc trang này: http: // viget.com/extend/how-to-use-docker-on-os-x-the-missing-guide – Bryan

4

Bạn có thể sử dụng tùy chọn ánh xạ cổng boot2docker -L, như được mô tả here.

Vì vậy, trong trường hợp của bạn nó sẽ là

boot2docker ssh -L 0.0.0.0:8080:localhost:8080 

và sau đó

docker run -it -p 8080:8080 uwsgi_app:0.2 

Bằng cách đó, bạn không cần phải sử dụng địa chỉ IP boot2docker: bạn có thể sử dụng localhost hoặc địa chỉ IP của riêng bạn (và container docker của bạn có thể được truy cập từ bên ngoài).

89

Mở rộng Anentropic'sanswer: boot2docker là ứng dụng cũ cho Mac và Windows, docker-machine là ứng dụng mới.

Thứ nhất, danh sách máy của bạn:

$ docker-machine ls 

NAME  ACTIVE DRIVER  STATE  URL       SWARM 
default *  virtualbox Running tcp://192.168.99.100:2376 

Sau đó chọn một trong những máy (mặc định một được gọi là default) và:

$ docker-machine ip default 

192.168.99.100 
+3

Giải quyết sự cố Windows của tôi. –

+16

Thông tin này có chính xác trong năm 2016 không? Tôi không nhận được kết quả nào khi chạy 'docker-machine ls', mặc dù' docker ps' hiển thị mọi thứ hiện đang chạy. – Trejkaz

+0

Vẫn hoạt động trên máy Mac của tôi. Không có thông báo lỗi? Thử cài đặt lại https://docs.docker.com/docker-for-mac//https://docs.docker.com/docker-for-windows/. Các phiên bản cũ hơn cần thiết để đánh giá một số cấu hình shell ala https://docs.docker.com/machine/get-started/. – HankCa

7

Để tìm địa chỉ IP của container, bạn nên cần NO thêm cài đặt:

docker inspect <container> 

Điều này cung cấp nhiều thông tin. grep cho địa chỉ IP.

1

Có cùng vấn đề và trong trường hợp của tôi, tôi đang sử dụng phiên bản AWS EC2. Tôi đã thử với IP vùng chứa không hoạt động. Sau đó, tôi đã sử dụng IP công cộng thực sự của máy chủ AWS làm IP.

+0

OMG. Đã lãng phí rất nhiều thời gian sau này. Tự hỏi lý do cho hành vi này là gì –

0

Boot2docker đã lỗi thời, nhưng bạn vẫn có thể gặp sự cố này trên Docker cho Windows hoặc Mac, mặc dù cùng một vùng chứa hoạt động trên Linux. Một trong những triệu chứng là cố gắng truy cập vào một trang trên máy chủ bên trong vùng chứa cho lỗi "không gửi bất kỳ dữ liệu nào" thay vì "không thể kết nối".

Nếu có, có thể là do trên Win/Mac, container host has its own IP, nó không phải là localhost vì nó nằm trên Linux. Thử chạy Django trên IP 0.0.0.0, có nghĩa là chấp nhận kết nối từ tất cả các khu công nghiệp, như thế này:

python manage.py runserver 0.0.0.0:8000 

Ngoài ra, nếu bạn cần phải chắc chắn rằng máy chủ duy nhất đáp ứng yêu cầu địa phương (chẳng hạn như từ proxy địa phương của bạn như nginx , apache, hoặc gunicorn), bạn có thể sử dụng IP máy chủ được trả về bởi hostname -i.

Và đảm bảo bạn đang sử dụng chính xác -pport forwarding option trong lệnh docker run.

Giả sử tất cả đều tốt, bạn sẽ có thể truy cập máy chủ của mình tại http://localhost trong trình duyệt đang chạy trên máy chủ.

0

Làm thế nào để gỡ rối vấn đề về lưu trữ ứng dụng trên trình duyệt host nội bộ

Đối với phóng này container với lệnh dưới đây, trong trường hợp của tôi đó là:

[[email protected] ~]# docker ps -a 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS      PORTS    NAMES 
1b81d8a0e3e1  centos:baseweb  "/bin/bash"   8 minutes ago  Exited (0) 24 seconds ago      webtest 
[[email protected] ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash 

Trong cấu hình httpd:

[[email protected] /]# cd /etc/httpd/conf 
[[email protected] conf]# ll 
total 52 
-rw-r--r--. 1 root root 34419 Sep 19 15:16 httpd.conf 

chỉnh sửa tệp với cổng 8000 trong danh sách phát và cập nhật ip vùng chứa và cổng trong Servername.

Khởi động lại dịch vụ httpd và bạn đã hoàn tất.

Hy vọng điều này sẽ giúp

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