2014-10-20 18 views
5

Tôi đang cố gắng thiết lập bộ chứa Docker của Ubuntu chạy ứng dụng HTTP Node.js trên cổng 9000. Để bắt chước cài đặt môi trường sản xuất, tôi cũng muốn chạy Apache như một máy chủ proxy ngược lại đơn giản trong vùng chứa chuyển tiếp đến ứng dụng này từ, ví dụ, cổng 80 (mà tôi tiếp xúc với thế giới xấu lớn).Cấu hình tối thiểu cho proxy ngược Apache trong vùng chứa Docker

Tôi đã có thể thiết lập vùng chứa ứng dụng Node.js tốt và tôi có thể cài đặt và thiết lập Apache trong số Dockerfile; nhưng tôi hoàn toàn mới để thiết lập một proxy ngược, do đó, trong khi Apache chắc chắn bắt đầu, nó không proxy.

Dockerfile tôi trông giống như:

# DOCKER-VERSION 1.3.0 
FROM ubuntu:12.04 

# Install and set up Apache as a reverse proxy 
RUN  apt-get -y install apache2 libapache2-mod-proxy-html 
COPY apache2.conf /etc/apache2/app.conf 
RUN  cat /etc/apache2/app.conf >> /etc/apache2/apache2.conf 
RUN  service apache2 start 

# Install and set up Node.js and bundle app 
# ...This works... 

EXPOSE 80 
CMD  ["./start-app.sh"] 

... nơi apache2.conf Tôi đang phụ thêm để /etc/apache2/apache2.conf là:

ServerName localhost 

LoadModule proxy_module  /usr/lib/apache2/modules/mod_proxy.so 
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so 
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so 
LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

ProxyPass  /http://localhost:9000/ 
ProxyPassReverse/http://localhost:9000/ 

Tôi đang chạy hình ảnh này bằng cách sử dụng lệnh sau:

docker run -p 80:80 -p 81:9000 -d IMAGE 

Điều tôi đang mong đợi là sẽ chuyển sang http://$DOCKER_HOST (tức là, thư mục gốc) sẽ được Apache chọn và chuyển tiếp đến localhost:9000 (ví dụ: ứng dụng của tôi) trong vùng chứa. (Nếu tôi đi đến http://$DOCKER_HOST:81, tôi đi thẳng đến ứng dụng; chỉ để chứng minh rằng nó đang hoạt động. Điều này hoạt động.) Tôi nghi ngờ rằng vấn đề không phải là tất cả để làm với Docker, nhưng cấu hình Apache.

+0

Bạn có đang sử dụng proxy đảo ngược apache cho mục đích duy nhất là hiển thị máy chủ web của bạn trên cổng 80 thay vì 9000 hoặc nó có mục đích khác không? – Thomasleveil

+0

Chính xác. Trên máy sản xuất, Apache đang làm những thứ khác, không liên quan; Tôi chỉ đặt lớp proxy ngược trong vùng chứa của mình để nó khớp với thiết lập trong quá trình sản xuất. – Xophmeister

+0

Vui lòng chỉnh sửa câu hỏi của bạn bằng lệnh mà bạn đang sử dụng để chạy vùng chứa docker – Thomasleveil

Trả lời

6

Trong Dockerfile của bạn, các câu lệnh RUN xác định các lệnh sẽ được chạy bởi trình nền của docker khi xây dựng hình ảnh docker. Các lệnh này sẽ không được thực hiện khi bạn sử dụng lệnh docker run.

Trong trường hợp của bạn, bạn đang cố gắng để đưa ra một hình ảnh Docker rằng sẽ bắt đầu hai quá trình:

  • máy chủ apache
  • nodejs máy chủ

Nhưng start-app.sh kịch bản trong CMD ["./start-app.sh"] dường như chỉ bắt đầu máy chủ nodejs.

Bạn không thể có lệnh docker run bắt đầu thêm một quy trình, nhưng bạn có thể bắt đầu quá trình sẽ bắt đầu một quá trình khác. Có nhiều cách differents để đạt được điều này, hãy xem tại địa chỉ:

nhưng đơn giản hơn bạn có thể thay thế hướng dẫn CMD của bạn với:

CMD  /bin/bash -c "service apache2 start; ./start-app.sh" 

và loại bỏ dòng RUN service apache2 start vô dụng.

Trong vùng chứa của bạn, Docker sẽ bắt đầu một quá trình (/bin/bash) mà lần lượt sẽ bắt đầu apache và sau đó chạy ./start-app.sh.

+0

lưu ý: bạn cũng có thể thêm 'service apache2 start' ở đầu tập lệnh' start-app.sh' – Thomasleveil

+0

:) Cảm ơn bạn ... đặc biệt là đoạn đầu tiên của bạn đã xóa mọi thứ cho tôi. – Xophmeister

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