Các lợi ích phát triển của việc sử dụng Docker có bị phủ nhận khi sử dụng Java so với các ngôn ngữ khác gần với các nhị phân Unix không?


53

Tôi có một người bạn nói:

Docker là tuyệt vời. Bạn có thể sử dụng nó để tái tạo sản xuất và tất cả các tiện ích của nó trên máy cục bộ của bạn. Sau đó, bạn có thể triển khai ví dụ đó thông qua tất cả các quy trình dàn dựng siêu nhanh .

Bây giờ điều này sẽ đúng nếu các nhà phát triển đang viết Ruby, PHP hoặc Go - nơi có liên kết nhị phân hướng đến hệ điều hành.

Nhưng khi sử dụng Java - đã có một lớp ảo giữa hệ điều hành và ngôn ngữ, tạo sự thống nhất cho hoạt động bất kể hệ điều hành bên dưới.

Có thể cho rằng, trong trường hợp này, lợi ích của việc chạy Docker cho các nhà phát triển cục bộ để tái tạo môi trường sản xuất bị phủ nhận . (So ​​với Ruby, PHP hoặc Go).

Tôi sẵn sàng thảo luận về vấn đề này và rất muốn nghe quan điểm bất đồng (có bằng chứng).

Các lợi ích phát triển của việc sử dụng Docker có bị phủ nhận khi sử dụng Java so với các ngôn ngữ khác gần với các nhị phân Unix không?


34
Tại sao bạn nghĩ ruby ​​và php là nhị phân? Ruby và php về mặt kỹ thuật thậm chí còn ảo hơn Java - trong Java bạn phải biên dịch trước sau đó thực hiện chương trình của mình trong một máy ảo. Trong Ruby và php, bạn gửi mã nguồn và máy ảo đọc trực tiếp nguồn.
slebetman

12
"Nhưng khi sử dụng Java - đã có một lớp ảo giữa hệ điều hành và ngôn ngữ, tạo sự thống nhất cho hoạt động bất kể hệ điều hành cơ bản." LOL. Java đã phát minh ra "viết một lần, kiểm tra mọi nơi."
Andy

2
Java là một mục tiêu di chuyển. Đôi khi các tính năng được giới thiệu là phá vỡ mọi thứ (việc thắt chặt bảo mật vài năm trước là ví dụ điển hình) hoặc bạn gặp phải một lỗi yêu cầu bạn sử dụng một phiên bản cụ thể. Việc kiểm soát điều này trong docker sẽ dễ dàng hơn nhiều so với việc sử dụng hệ thống đóng gói riêng của máy tính chủ.
Thorbjørn Ravn Andersen

1
"Tạo sự thống nhất của hoạt động bất kể hệ điều hành cơ bản" Lưu ý rằng làm cho thời gian chạy ngôn ngữ luôn hoạt động không phủ nhận thực tế là bạn có thể vẫn còn một số phụ thuộc bên ngoài. Có thể là một cái gì đó đơn giản như sử dụng một đường dẫn tệp cụ thể cho nhật ký của bạn.
jpmc26

Câu trả lời:


86

Không có gì.

Hãy tưởng tượng bạn đang chạy phiên bản 1.8.0 của Java trên cả máy phát triển và máy chủ. Nhân tiện, bạn đang làm việc đồng thời trên hai dự án, cả hai đều sử dụng Java.

Một ngày nọ, một lỗi được tìm thấy trong JVM và các máy chủ chạy dự án đầu tiên bạn đang làm việc được chuyển sang 1.8.1. Nhân tiện, các máy chủ chạy dự án thứ hai không bị ảnh hưởng bởi lỗi và được quản lý bởi một nhóm quản trị viên hệ thống khác, những người có thể không sẵn sàng cập nhật lên 1.8.1.

Bây giờ, ít nhất là đối với một trong các dự án, bạn đang chạy một phiên bản Java khác.

Điều này có thể không làm phiền bạn quá nhiều (cho đến khi một máy chủ chuyển sang 1.9, trong khi máy chủ kia giữ phiên bản cũ), nhưng điều này có nghĩa là bạn không tái tạo môi trường sản xuất nữa trên máy cục bộ của mình, điều này có thể làm cho nó nhỏ đi lỗi để leo vào.

Nếu bạn tưởng tượng rằng hệ thống tệp của bạn, các phụ thuộc của bạn, cài đặt bảo mật, cấu hình cục bộ và phiên bản Linux của bạn khác với sản xuất, thì bạn có nguy cơ viết mã sẽ thất bại trong sản xuất. Thay vì chấp nhận rủi ro này, bạn có thể sử dụng ảo hóa hoặc Docker, với mức giảm nhẹ để không giảm năng suất.


20
Ngoài ra loại điều này xảy ra TẤT CẢ thời gian trong các công ty lớn hơn. Nó không chỉ là một điều lý thuyết.
enderland

5
Bạn làm gì khi phát hiện ra lỗi trong Docker?
Owen

Ngoài ra Java 9 sẽ phá vỡ mọi thứ. Sẽ có một số nỗ lực cần thiết.
Thorbjørn Ravn Andersen

8
@Owen Điều tương tự bạn làm khi bạn tìm thấy một lỗi trong Java. Hoặc trong {Linux, Windows}. Hoặc trong CPU của bạn .
Kroltan

1
@Trilarion: Có, mặc dù chủ yếu ở dạng bài đăng trên blog của các nhà phát triển công ty. Điều đó nói rằng, bất kỳ liên kết "Tìm hiểu thêm" trên docker.com/customers sẽ cung cấp các ví dụ về các công ty lớn sử dụng docker để giải quyết các vấn đề như vậy. Điều đó nói rằng, thông thường các công ty như vậy đã chấp nhận rằng họ cần một sự kết hợp hoàn hảo giữa sản xuất và phát triển, và đã hoàn thành điều này với VM. Sau đó, họ nhận ra, "này, Docker giải quyết vấn đề tương tự như máy ảo, ngoại trừ nó chạy nhanh hơn và có thể được sử dụng để giữ cho việc triển khai nhất quán."
Brian

35

Bạn hiếm khi chỉ triển khai một "Ứng dụng Java". Ứng dụng java của bạn có rất nhiều chương trình hỗ trợ khác nhau xung quanh nó. Chúng tôi sử dụng Apache HTTPD, Apache Tomcat, ActiveMQ để nhắn tin, FTP Deamon, MySQL và một số dịch vụ tùy chỉnh để tích hợp với các chương trình không hoạt động trực tiếp với Java.

Điều này thậm chí không đi vào phần mềm phát triển đi kèm với nó - nhật thực, kiến, adobe flex, Groovy, firefox và lật đổ (Tôi bỏ qua khá nhiều)

Phải mất từ ​​một ngày đến một tuần để thiết lập một máy trạm mới - chúng tôi đã thảo luận về việc chuyển sang Docker để đơn giản hóa vấn đề này. Thật tuyệt vời nếu chúng ta có thể tung ra một máy trạm mới trong một vài giờ.

Chưa kể đến việc khi chúng tôi triển khai, chúng tôi cần duy trì tối đa - 20 máy chủ; Docker đang bắt đầu trông giống như một thỏa thuận khá tốt!

. / sao lưu trang web (x2) và bạn lên đó khá nhanh)


Tại sao không làm hình ảnh?
Dmitry Kudriavtsev

Chúng tôi hi vọng là vậy. Chúng tôi là một nhóm nhỏ đang cố gắng thêm các tính năng vào một hệ thống quan trọng / được sử dụng khá nhiều và không có đủ quyền kiểm soát các máy chủ để ra lệnh triển khai. Mặc dù có thể sử dụng nó cho nhà phát triển, chúng tôi đã bị hạn chế khá nhiều ở ram 32mb - Tôi cho rằng việc chạy từ hình ảnh docker sẽ có một số chi phí ... nhưng kế hoạch của chúng tôi là di chuyển theo hướng đó.
Bill K

Tôi có nghĩa là cho các máy trạm
Dmitry Kudriavtsev

Thời gian và bộ nhớ - chúng tôi đã phải bỏ các phần để chạy trong các máy trạm 32gb của chúng tôi (các máy chủ 64gb chạy tốt). Chúng tôi đã thử nghiệm một chút mặc dù và có thể thử lại lần sau khi chúng tôi cần xây dựng một máy trạm dev mới.
Bill K

8

Câu hỏi này cũng phù hợp với golang, nơi bạn có thể trích xuất các tệp nhị phân được liên kết tĩnh và chạy chúng ở đâu đó, trái ngược với Python hoặc C ++, nơi bạn thường có một số lượng lớn các thư viện được liên kết dẫn đến mọi người chỉ cần xây dựng một thùng chứa docker môi trương phat triển.

Có hai điểm để trả lời ở đây:

Một: phải có một cách tốt hơn , và đó là: bạn có thể xây dựng các container docker nhỏ hơn (và hiệu quả hơn) chỉ bằng môi trường cài đặt, dẫn đến những lợi thế tương tự như trong trường hợp Golang với môi trường so với Golang-just -Các thùng chứa. Trong trường hợp của Java, bạn có thể xây dựng một bình chứa chất béo hoặc một ứng dụng có thể cài đặt có chứa tất cả các tệp thư viện và tập lệnh shell; trong trường hợp của Python, bạn có thể sử dụng audwheel để xây dựng các bánh xe độc ​​lập độc lập với môi trường xây dựng (và bạn có thể sử dụng C ++ với liên kết tĩnh với hiệu ứng gần như tương tự).

Hai: bạn cần docker để làm gì? Trong vùng đất Java, bạn có thể thực hiện nhiều phân tách giữa các thành phần khác nhau bằng cách sử dụng các trình nạp lớp, nhưng điểm chính là những gì xung quanh ứng dụng Java. Không có ứng dụng Java nào tự chạy - nếu nó không chạy trong docker, nó thường sẽ phải được giám sát bởi giám sát viên hoặc systemd hoặc các lượt thích. Nhập đám mây Kubernetes, Marathon hoặc Docker, sử dụng trừu tượng hóa container để ảo hóa không phải chính máy chủ, nhưng thực sự ảo hóa toàn bộ mạng để bạn có thể triển khai các container và chúng chạy trên một số máy chủ ngẫu nhiên.

Microservice thường chạy trên các đám mây dựa trên docker vì nó cho phép bạn coi các máy chủ docker của mình là gia súc, không phải là vật nuôi và tương tự với các ứng dụng dockerized. Tất nhiên, sự trừu tượng này sẽ bị rò rỉ ngay khi bạn gắn khối lượng máy chủ vào docker và cần chạy các container docker trên chính xác máy chủ có các khối lượng này. Một số người thậm chí nhận được xung quanh đó.


5

Đây là một câu hỏi thực sự hay nhưng sau khi làm việc với Docker, tôi sẽ chuyển nó lại:

Các lợi ích của JVM có bị phủ nhận bởi việc đóng gói (ví dụ Docker) không?

Các container thực sự thách thức rất nhiều giả định mà tôi có về sự phát triển xuất phát từ kinh nghiệm của tôi. Ví dụ: nếu ai đó đã mã hóa đường dẫn đến tệp tài nguyên trong ứng dụng, rất nhiều nhà phát triển có kinh nghiệm sẽ biết rằng điều này có vấn đề và bạn nên đặt cấu hình. Nhưng nếu bạn đang nhắm mục tiêu một container, đây có thực sự là trường hợp? Khi bạn xây dựng container, bạn cho nó biết cấu trúc thư mục là gì. Bạn đang cấu hình đường dẫn đó. Vì vậy, bạn nên cấu hình nó hai lần? Lợi ích là gì? Nếu bạn không làm cho chúng khớp, nó sẽ không hoạt động nên ... KHÔ?

Gần đây tôi đã tạo ra một ứng dụng nguyên mẫu với Java và Docker, về cơ bản đã theo dõi các sự kiện GC và khi phần cũ của heap đạt đến một tỷ lệ phần trăm ngưỡng, nó sẽ tự tắt. Docker (chế độ swarm) sau đó sẽ quay một cái mới. Về cơ bản, nó đã loại bỏ sự cần thiết của các chu trình GC chính trong JVM và để cho docker quản lý chúng. Nó không hoạt động tốt như tôi có thể hy vọng (khách hàng đã thấy một số tác động của việc tắt máy) nhưng nó đủ chức năng để thực hiện bản demo trực tiếp trước đám đông.

Bạn thực sự chỉ nên thử container ra nếu bạn tò mò. Nó thực sự là một công nghệ đột phá và bạn sẽ cần phải nắm bắt nó. Docker là một nơi tuyệt vời để bắt đầu nhưng có ít nhất một sự thay thế khả thi khác tốt cho tất cả mọi người, IMO.


"... nhưng có ít nhất một sự thay thế khả thi khác tốt cho tất cả mọi người" Vậy đó có thể là một sự thay thế khả thi khác không?
Trilarion

@Trilarion rkt (hoặc tên lửa) . Nó hiện được hỗ trợ bởi Kubernetes cùng với Docker.
JimmyJames
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.