다른 언어와 비교하여 Java를 사용할 때 Docker를 사용하면 Unix 바이너리에 더 가까운 개발 이점이 무시됩니까?


53

나는 친구에게 말했다 :

도커 는 훌륭합니다. 이를 사용 하여 로컬 시스템에서 프로덕션 및 모든 문제를 복제 할 수 있습니다 . 그럼 당신은 모든 준비 작업 흐름은 슈퍼 스트레이트를 통해 해당 인스턴스 배포 할 수 있습니다 빠른을 .

개발자가 Ruby, PHP 또는 Go를 작성 하는 경우 운영 체제에 방향 바이너리 링크가있는 경우에는 이것이 사실 입니다.

그러나 Java 를 사용 하는 경우 운영 체제와 언어 사이에 가상 계층 이 이미 존재 하므로 기본 운영 체제와 상관없이 운영 일관성이 유지됩니다.

이 경우 로컬에서 개발자가 프로덕션 환경을 복제 할 수 있도록 Docker를 실행하면 얻을 수있는 이점은 무시 될 수 있습니다. (Ruby, PHP 또는 Go와 비교).

나는 이것에 대해 토론하기에 개방적이며 반대 증거를 듣고 싶어합니다 (증거 포함).

다른 언어와 비교하여 Java를 사용할 때 Docker를 사용하면 Unix 바이너리에 더 가까운 개발 이점이 무시됩니까?


34
왜 루비와 PHP가 바이너리라고 생각합니까? Ruby와 php는 기술적으로 Java보다 훨씬 더 가상적입니다. Java에서는 먼저 컴파일 한 다음 가상 머신에서 프로그램을 실행해야합니다. Ruby와 PHP에서는 소스 코드를 제공하고 가상 머신은 소스를 직접 읽습니다.
slebetman

12
"하지만 Java를 사용하는 경우 운영 체제와 언어 사이에 이미 가상 계층이있어 기본 운영 체제와 상관없이 운영 일관성이 유지됩니다."LOL. Java는 "한 번 작성하고 모든 곳에서 테스트"를 발명했습니다.
Andy

2
자바는 움직이는 목표이다. 간혹 문제를 해결하는 기능 (몇 년 전의 보안 강화가 주요한 예)이 도입되거나 특정 버전을 사용해야하는 버그가 발생하는 경우가 있습니다. 호스트 컴퓨터의 기본 패키징 시스템을 사용하는 것보다 docker에서 이것을 제어하는 ​​것이 훨씬 쉽습니다.
Thorbjørn Ravn Andersen

1
"기본 운영 체제와 상관없이 운영 일관성 유지"언어 런타임이 일관되게 작동한다고해서 여전히 일부 외부 종속성이 있다는 사실을 부정하지는 않습니다. 로그에 특정 파일 경로를 사용하는 것처럼 간단 할 수 있습니다.
jpmc26

답변:


86

전혀.

개발 시스템과 서버 모두에서 Java 버전 1.8.0을 실행한다고 가정하십시오. 그건 그렇고, Java를 사용하는 두 프로젝트에서 동시에 작업하고 있습니다.

어느 날 JVM에서 버그가 발견되었으며 작업중인 첫 번째 프로젝트를 실행하는 서버가 1.8.1로 마이그레이션되었습니다. 그건 그렇고, 두 번째 프로젝트를 실행하는 서버는 버그의 영향을받지 않으며 다른 시스템 관리자 팀이 관리하며 1.8.1로 기꺼이 업데이트하지 않을 수 있습니다.

최소한 프로젝트 중 하나에 대해 다른 버전의 Java를 실행하고 있습니다.

이것은 너무 귀찮게하지 않을 수도 있지만 (한 서버는 1.9로 마이그레이션하고 다른 서버는 이전 버전을 유지할 때까지) 로컬 시스템에서 더 이상 프로덕션 환경을 복제하지 않으므로 소규모로 가능합니다. 버그가 발생했습니다.

파일 시스템, 종속성, 보안 설정, 로컬 구성 및 Linux 버전 자체가 프로덕션과 다르다고 생각하는 경우 프로덕션에 실패 할 코드를 작성할 위험이 있습니다. 이 위험을 감수하는 대신 생산성 손실이 거의 없거나 전혀없는 가상화 또는 Docker를 사용할 수 있습니다.


20
또한 이런 종류의 일은 대기업에서 항상 발생합니다. 단지 이론적 인 것이 아닙니다.
enderland

5
Docker에서 버그를 발견하면 어떻게합니까?
Owen

또한 Java 9는 문제를 일으킬 것입니다. 약간의 노력이 필요할 것입니다.
Thorbjørn Ravn Andersen

8
@Owen Java에서 버그를 발견했을 때와 같은 작업. 또는 {Linux, Windows}에서. 또는 CPU에서 .
Kroltan

1
@Trilarion : 예. 대부분 회사 개발자의 블로그 게시물 형태입니다. 즉, docker.com/customers 의 "자세히 알아보기"링크는 도커를 사용하여 이러한 문제를 해결하는 대기업의 예를 제공합니다. 즉, 일반적으로 그러한 회사는 생산과 개발 사이의 완벽한 조화가 필요하다는 점을 당연한 것으로 생각하고 VM으로이를 달성했습니다. 나중에 그들은 Docker가 VM이 더 빠르게 실행되고 배치 일관성을 유지하는 데 사용될 수 있다는 점을 제외하고 VM과 동일한 문제를 해결한다는 것을 깨달았습니다.
Brian

35

"Java App"을 배포하는 경우는 거의 없습니다. 당신의 자바 어플리케이션은 많은 다른 지원 프로그램을 가지고 있습니다. 우리는 메시징을 위해 Apache HTTPD, Apache Tomcat, ActiveMQ, FTP Deamon, MySQL 및 Java와 직접 작동하지 않는 프로그램과 통합하기위한 소수의 사용자 정의 서비스를 사용합니다.

이것은 일식, 개미, 어도비 플렉스, 그루비, 파이어 폭스 및 서브 버전과 함께 제공되는 개발 소프트웨어에는 적용되지 않습니다 (나는 몇 가지를 건너 뜁니다)

새 워크 스테이션을 설치하는 데 하루 종일이 소요됩니다.이 문제를 단순화하기 위해 Docker로 전환하는 것에 대해 논의했습니다. 몇 시간 안에 새 워크 스테이션을 안정적으로 출시 할 수 있다면 정말 놀랍습니다.

배포 할 때 서버를 20 대 이상 유지해야한다는 사실은 말할 것도 없습니다. Docker는 꽤 좋은 거래처럼 보이기 시작합니다!

(20는 한 번에 하나의 서버에서만 실행되는 앱에는 꽤 고통스러워 보입니다 ...하지만 한 서버에 클러스터 (x2), 테스트 / 스테이징 / prod (x3), 내부 / 외부 (x2) 및 기본 사이트를 곱하십시오 / backup site (x2) 그리고 당신은 꽤 빨리 거기에 도착합니다)


왜 이미지를 만들지 않습니까?
Dmitry Kudriavtsev

우리는 희망합니다. 우리는 매우 많이 사용 / 중요한 시스템에 기능을 추가하려고하는 소규모 팀이며 배포를 지시 할 서버를 충분히 제어 할 수 없습니다. 그래도 dev 용으로 사용할 수 있지만, 우리는 이미 32MB 램으로 꽤 제한되어 있습니다 .- docker 이미지에서 실행하면 약간의 오버 헤드가 있다고 가정하지만 계획은 그 방향으로 진행하는 것입니다.
Bill K

워크 스테이션을위한 것
Dmitry Kudriavtsev

시간과 메모리-우리는 이미 32GB 워크 스테이션에서 실행하기 위해 조각을 남겨 두어야합니다 (64GB 서버는 모두 잘 작동합니다). 우리는 조금 실험 해 보았고 다음에 새로운 개발 워크 스테이션을 구축해야 할 때 시도해 볼 수 있습니다.
Bill K

8

이 질문은 또한 golang과 관련이 있습니다. 일반적으로 많은 수의 링크 된 라이브러리가있는 Python 또는 C ++과 달리 정적으로 링크 된 바이너리를 추출하여 어딘가에서 실행할 수 있습니다. 개발 환경.

여기에 대답해야 할 두 가지 사항이 있습니다.

하나 : 더 좋은 방법 이 있어야합니다. 설치 환경 만 사용하여 더 작고 (더 효율적인) 도커 컨테이너를 만들 수 있습니다. 바이너리 컨테이너. Java의 경우 모든 라이브러리 jar 및 쉘 스크립트를 포함하는 팻 jar 또는 설치 가능한 앱을 빌드 할 수 있습니다. Python의 경우 auditwheel을 사용하여 빌드 환경과 독립적 인 독립형 휠을 빌드 할 수 있습니다 (그리고 거의 동일한 효과에 정적 링크를 사용하여 C ++을 사용할 수 있음).

둘째 :도 커가 필요한 것은 무엇입니까? Java 랜드에서는 클래스 로더를 사용하여 서로 다른 구성 요소를 많이 분리 할 수 ​​있지만, 요점은 Java 응용 프로그램과 관련이 있습니다. Java 응용 프로그램 자체는 실행되지 않습니다. Docker에서 실행되지 않는 경우 일반적으로 감독자 또는 시스템 관리자 등이 감독해야합니다. 컨테이너 추상화를 사용하여 호스트 자체를 가상화하는 것이 아니라 실제로 컨테이너를 배포하고 임의의 임의 호스트에서 실행될 수 있도록 전체 네트워크를 가상화하는 Kubernetes, Marathon 또는 Docker 클라우드를 입력하십시오.

마이크로 서비스는 일반적으로 도커 기반 클라우드에서 실행되므로 도커 호스트를 애완 동물이 아닌 소로,도 커화 된 응용 프로그램과 비슷하게 처리 할 수 ​​있습니다. 물론, 호스트 볼륨을 도커에 마운트하고이 볼륨이있는 호스트에서 도커 컨테이너를 실행해야하는 즉시이 추상화가 누출됩니다. 어떤 사람들은 그 주변을 둘러 봅니다.


5

이것은 정말 좋은 질문이지만 Docker로 작업 한 후에는 되돌릴 것입니다.

컨테이너화 (예 : Docker)에 의해 JVM의 이점이 무효화됩니까?

컨테이너는 실제로 내 경험에서 비롯된 개발에 대한 많은 가정에 도전합니다. 예를 들어, 누군가 응용 프로그램에서 리소스 파일의 경로를 하드 코딩해야한다면 많은 숙련 된 개발자가 이것이 문제가 있다는 것을 알고 구성 할 수 있어야합니다. 그러나 컨테이너를 타겟팅하는 경우 실제로 해당됩니까? 컨테이너를 빌드 할 때 디렉토리 구조가 무엇인지 알려줍니다. 경로를 구성하고 있습니다. 두 번 구성해야합니까? 장점은 무엇입니까? 일치하지 않으면 작동하지 않습니다 ... DRY?

최근에 Java 및 Docker를 사용하여 기본적으로 GC 이벤트를 관찰하고 힙의 이전 부분이 임계 값 백분율에 도달하면 자체 종료되는 프로토 타입 응용 프로그램을 만들었습니다. 그런 다음 Docker (스웜 모드)는 새로운 것을 회전시킵니다. 기본적으로 JVM에서 주요 GC주기가 필요하지 않아도 커가이를 관리 할 수 ​​있습니다. 내가 기대했던 것처럼 작동하지 않았지만 (클라이언트가 종료의 영향을 보았지만) 군중에게 라이브 데모를 할 수있을 정도로 기능적이었습니다.

궁금한 점이 있다면 컨테이너를 사용해보십시오. 실제로는 파괴적인 기술이므로이를 잘 이해해야합니다. Docker는 시작하기에 좋은 곳이지만 IMO라는 다른 모든 가능한 대안이 있습니다.


"...하지만 모든 사람에게 적합한 다른 가능한 대안이 하나 이상 있습니다"그렇다면 이것이 다른 가능한 대안이 될 수있는 것은 무엇입니까?
Trilarion

@Trilarion rkt (또는 로켓) . 현재 Docker와 함께 Kubernetes에서 지원됩니다.
JimmyJames
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.