2015-05-15 15 views
18

Cách docker để triển khai các dự án java trong một vùng chứa docker là gì?Cách đúng để triển khai tệp WAR trong hình ảnh docker

Tôi sao chép chiến tranh vào webapps:

FROM jetty:9.2.10 
MAINTAINER Me "[email protected]" 
ADD ./target/*.war /var/lib/jetty/webapps/ROOT.war 

hay tôi mất tập tin chiến tranh bùng nổ:

FROM jetty:9.2.10 
MAINTAINER Me "[email protected]" 
ADD ./target/app-0.1.0.BUILD-SNAPSHOT /var/lib/jetty/webapps/ROOT 

Thông thường người ta sẽ triển khai tập tin chiến tranh đóng dấu nếu nó là một container bình thường, nhưng với docker, điều đó có nghĩa là đẩy một tập tin 10-20MB mỗi khi bạn thực hiện một thay đổi nhỏ trong khi thêm chiến tranh bùng nổ sẽ chỉ đẩy sự khác biệt - tệp .class đã thay đổi.

Có bất kỳ nhược điểm nào để triển khai chiến tranh bùng nổ thay vì tệp chiến tranh không?

Trả lời

4

Tôi tự hỏi bạn đang sử dụng hình ảnh như thế nào. Thêm một tập tin 20MB trong khi xây dựng một hình ảnh gần như là ngay lập tức. Mayb bạn bằng cách nào đó xây dựng hình ảnh trong quá trình triển khai, như AWS hiện khi bạn cung cấp cho nó một Dockerfile.

Trong mọi trường hợp, tôi nghĩ điều đó phụ thuộc vào cách bạn triển khai. Nếu bạn đang di chuyển các hình ảnh xung quanh mình, tôi không thấy nhiều sự khác biệt giữa việc thêm một tệp .war và thư mục WAR đã được giải mã. Tôi sẽ nói làm những gì thuận tiện cho bạn. Tuy nhiên, nếu bạn đôi khi chạy ứng dụng từ Docker và đôi khi từ một .war (có thể bỏ lỡ một số điểm của Docker), bạn cũng có thể sử dụng .war tất cả các thời gian.

Nếu bạn đang triển khai một cái gì đó như AWS Elastic Beanstalk (cái gì đó kéo hình ảnh từ một kho lưu trữ), muốn một tệp Dockerfile hoặc tệp Dockerrun.aws.json, thì tách hình ảnh khỏi những gì bạn thực sự triển khai một số ý nghĩa (hoặc nó đã có ý nghĩa với tôi cho đến nay). Điều này cho phép vùng chứa giữ nguyên, trong khi cập nhật ứng dụng của bạn có thể chỉ cần sao chép tệp .jar/.war vào đúng vị trí (cũng có thể bỏ sót một phần của điểm Docker;).

Điều tôi đang làm là tạo hình ảnh cơ sở trên Docker Hub và sau đó sử dụng tệp Dockerrun.aws.json để ánh xạ trong ứng dụng của tôi. Bằng cách đó, AWS không cần phải xây dựng hình ảnh của tôi, chỉ cần kéo nó. Đó là nhanh hơn và ít tốn kém hơn ($). Nhưng nó tách riêng ứng dụng của tôi khỏi hình ảnh, điều này có thể làm phức tạp triển khai trong một số trường hợp. Tuy nhiên, vì hình ảnh của tôi rất ổn định, tôi thường chỉ bó một tệp .jar, một tệp Dockerrun.aws.json và một tệp shell vào một tệp .zip và tải nó lên AWS. Khá dễ dàng.

My Dockerfile là khá đơn giản và thực sự tất cả những gì cần cho ứng dụng khởi động mùa xuân của tôi:

FROM java:8 
VOLUME /tmp 
VOLUME /app 
EXPOSE 8080 
ENTRYPOINT ["sh","/app/app.sh"] 

Bạn có thể làm điều gì đó tương tự và sử dụng tùy chọn -v, vv, để lập bản đồ số lượng ứng dụng của bạn, đó là cài đặt môi trường, vv BTW, this image có sẵn trên Docker Hub.

+0

Có lẽ tôi chỉ nên xây dựng và gói dự án trên máy chủ với Jenkins, sau đó 20MB sẽ là ngay lập tức, từ Macbook của tôi nó không phải là ngay lập tức, 20MB mất mãi mãi trên 8 megabit Internet. –

+0

Tôi nghĩ đó sẽ là một cách tiếp cận rất tốt. Làm cho Jenkins không chỉ máy chủ CI của bạn, mà là máy chủ tự động hóa của bạn: sử dụng nó quá xây dựng, kiểm tra và gói hệ thống của bạn. – objectuser

1

Bạn có thể thử này: Sao chép các tập tin chiến tranh vào chai lọ bằng COPY Sao chép jar cầu cảng Á hậu vào chai lọ bằng COPY và sau đó sử dụng CMD để chạy nó như thế này [ "java -jar/path/to /path/to/app.war /jetty-runner.jar "]

http://www.eclipse.org/jetty/documentation/current/runner.html

Chú ý: bạn sẽ cần phải có java cài đặt trong container.

5

Bạn nên thực sự LUÔN triển khai bản phát nổ .war.

Có hai yếu tố tốc độ để suy nghĩ về ở đây:

  1. Nhanh như thế nào là nó để có thể đẩy mạnh hình ảnh của bạn vào một kho chứa?

  2. Trường hợp mới của vùng chứa của tôi bắt đầu phân phối yêu cầu bao lâu? (quan trọng trong môi trường có quy mô đàn hồi)

Câu trả lời cho cả hai đều giống nhau: Bạn nên giải phóng tệp .war khi tạo vùng chứa và KHÔNG sao chép tệp .war vào nó.

này có hai hiệu ứng rất tích cực sau:

  1. Nó làm cho sự khác biệt giữa các phiên bản chứa nhỏ hơn nhiều, và vì vậy thời gian upload của bạn là ít.
  2. Điều đó có nghĩa là, khi mở rộng động để đáp ứng nhu cầu ứng dụng, các phiên bản vùng chứa mới của bạn không phải giải nén tệp .war của bạn trước khi chúng có thể bắt đầu trả lời các yêu cầu.

Đối với những người trong chúng tôi gánh nặng bởi kết nối tải lên chậm, bạn nên sử dụng máy chủ CI hoặc thậm chí máy chủ lưu trữ đám mây để xây dựng và đẩy hình ảnh đế của bạn vào dockerhub hoặc một đăng ký vùng chứa khác. Bằng cách đó bạn có thể tận dụng lợi thế của tốc độ tải lên quy mô gigabit.

2

Đây là cách tôi làm điều đó:

FROM tomcat:8.0 
MAINTAINER David Ford <[email protected]> 
ENV DB_HOST mySqlServer 
ENV DB_USER joeBlow 
ENV DB_PASSWORD bla bla bla 
EXPOSE 8080 
RUN rm -fr /usr/local/tomcat/webapps/ROOT 
COPY target/webapp /usr/local/tomcat/webapps/ROOT 

Trong danh sách todo tôi: tách ra WEB_INF/lib dir vào container riêng của mình.

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