왜 Docker야?


Docker가 인코딩 방식을 어떻게 바꾸는지 알아보기
2013년 초 Docker가 출시된 이래로 프로그래머와 시스템 관리자와 사랑과 증오가 교차하고 있다.저와 이야기를 나눴던'경험이 풍부한'개발자들은 컨테이너화에 대해 보편적으로 매우 싫어하지만, 보도에 의하면 이베이, 트위터, Spotify, Lyft를 포함한 많은 대기업들이 생산 환경에서 Docker를 사용하는 이유가 있다고 합니다.

그럼 도커는 도대체 뭘 하는 거예요?


VMware, VirtualBox, Parallels 또는 기타 가상화 소프트웨어를 사용한 적이 있습니까?알겠습니다. Docker는 거의 똑같습니다. (기이한 GUI는 하나도 없지만) 가상 머신을 만들었습니다. 그 중에서 선택한 운영체제가 있습니다. 웹 응용 프로그램과 의존항만 묶여 있습니다.

그런데 가상 머신이 느리지 않나요?


가상화는 클라우드 컴퓨팅 혁명을 추진하는 요소입니다. 저는 Docker를 가상화의 마지막 단계라고 부르는 것을 좋아합니다. 이것은 실제로 당신이 개발한 업무 논리를 집행합니다.

하지만 오른쪽의 전형적인 가상 머신은 속도가 느려서 Docker가 하는 일을 완전히 가상화로 돌릴 수 없습니다.반면 Docker는 사용runc(유지)을 통해 내부 핵이 서로 다른 프로세스 이름 공간, 장치 이름 공간 등을 지원하는 토대에서 추상적인 것을 제공하여 호스트 시스템의 많은 자원을 공유할 수 있도록 한다.Docker 컨테이너와 호스트 코어 사이에 추가 가상화 레이어가 없기 때문에 컨테이너는 호스트에 거의 같은 성능을 제공할 수 있습니다.
완전히 가상화된 시스템은 자신에게 할당된 리소스 그룹을 얻고 최소한의 공유를 하게 됩니다. 그러면 더 많은 격리를 초래하지만 더 무겁습니다. (더 많은 리소스가 필요합니다.) 그러나 Docker가 있으면 격리도는 낮지만 용기는 상당히 가볍습니다. (더 적은 리소스가 필요합니다.)
만약 게임 서버와 같은 확실한 자원과 완전히 격리된 시스템을 실행해야 한다면, KVM이나 OpenVZ를 기반으로 하는 가상 머신은 좋은 선택이 될 수 있습니다.단, 단독 프로세스를 서로 분리하고 크기가 합리적인 호스트에서 프로세스를 실행하고 은행을 파괴하지 않으려면 Docker가 적합합니다.
컨테이너 시스템의 성능에 대한 더 많은 정보를 알고 싶으시면 IBM의 우수한 연구 논문 Open Containers Initiative (2014, Felter et.al) 을 참고하십시오. 이것은 가상 기기와 컨테이너를 잘 비교했습니다.

VM과 Linux 컨테이너의 최신 성능 비교 내 프로그램을 클라우드 서버에 직접 업로드할 수 없습니까?


인프라, 환경 일치성, 확장성, 가용성을 상관하지 않는다면 할 수 있다.
다음 장면을 상상해 보세요. 십여 개의 자바 서비스를 관리하고 우분투와 자바 8을 실행하는 독립 서버에 배치하여 당신의 개발, QA, 임시 저장과 생산 환경에 사용합니다.응용 프로그램이 고도로 사용되지 않더라도 최소한 48대의 서버 (12개의 서비스 x 4개의 환경) 를 관리해야 합니다.
지금 당신의 팀은 앞장서서 조직 변경 정책을 제정하여 실행 시 Java11로 업그레이드할 것을 요구합니다.48대의 서버를 로그인하고 수동으로 업데이트해야 합니다.Chef나 Puppet 같은 도구를 사용하더라도 많은 작업이 필요합니다.

여기에 더 간단한 해결 방안이 하나 있다


Docker를 사용하면 원하는 운영 체제의 스냅샷을 만들고 필요한 종속성만 설치할 수 있습니다.내가 좋아하는 한 가지 측면은 네가 모든 팽창 소프트웨어를 관리할 수 있거나 그렇지 않다는 것이다.최소한의 Linux 설치를 사용할 수 있습니다. (저는 Alpine Linux를 추천하지만 본고의 목적을 위해 Ubuntu를 계속 사용할 것입니다.) 그리고 그 위에만 Java8을 설치합니다.

업데이트가 필요할 때 Java 이미지의 Dockerfile을 편집하여 Java 11을 사용하고 용기 저장소(예를 들어 Docker Hub나 Amazon ECR)로 구축하고 전송한 다음 응용 프로그램 용기의 기본 이미지 표시를 변경하여 새 스냅샷을 인용하고 재배치합니다.
이것은 Ubuntu 18.04 minimal 운영체제 위에 구축된 Docker 컨테이너의 예입니다.
레이블damian을 사용하여 이미지를 구축하고 Docker Hub 계정oracle-jdk-ubuntu-18.04:1.8.0_191으로 전송한 다음 서비스를 실행하기 위해 다른 컨테이너를 구축합니다.
# Instructs Docker to build this container on top of this snapshot
FROM damian/oracle-jdk-ubuntu-18.04:1.8.0_191

# Copys the application JAR to the container
COPY build/hello-world.jar hello-world.jar

# Executes this command when the container starts
CMD java -jar hello-world.jar
현재 Java 11에 서비스를 업데이트해야 한다면 JRE를 호환하는 Java 스냅샷이 설치된 새 버전을 발표하고 서비스 용기의 FROM 선언에 표시된 태그를 업데이트하여 용기에 새 기본 이미지를 사용하도록 지시하는 것이 필요합니다.봐라, 당신의 다음 배치에서, 당신의 모든 서비스는 Ubuntu와 자바의 최신 업데이트와 동기화될 것이다.

요지 그러나 개발 과정에서 이것은 어떻게 나를 도울 것인가?


좋은 질문.
나는 최근에 단원 테스트에서 Docker를 사용하기 시작했다.상상해 보세요. 수천 개의 테스트 용례(만약 당신이 이렇게 한다면, 나를 믿어라. 나는 당신의 고통을 느낀다)가 하나의 데이터베이스에 연결되어 있습니다. 그 중에서 모든 테스트 클래스는 데이터베이스의 새로운 사본을 필요로 하고, 모든 테스트 용례는 데이터에 대해 CRUD 조작을 실행할 것입니다.일반적인 경우, 매번 테스트 후 Redgate가 제공하는 데이터베이스를 리셋하지만, 이것은 당신의 테스트가 반드시 순서대로 실행되어야 하며, 많은 시간이 걸린다는 것을 의미합니다. (이런 단원 테스트 세트는 20분이 걸려야 완성하는 것을 본 적이 있습니다.)
Docker를 사용하면 데이터베이스 이미지를 쉽게 만들 수 있습니다 Flyway. 용기에 있는 테스트 클래스마다 데이터베이스 실례를 실행하고 전체 테스트 세트를 병행할 수 있습니다.모든 테스트 클래스가 병렬로 실행되고 단독 데이터베이스에 연결되어 있기 때문에 같은 호스트에서 동시에 실행되고 플래시 메모리에서 완성할 수 있습니다. CPU가 처리할 수 있다고 가정하십시오.
나는 내가 Docker를 사용하는 또 다른 곳이 Golang에서 인코딩할 때 (Golang의 설정과 의존 관계 관리가 혼란스럽다는 것을 발견했다) - 나는 내 개발 기기에 직접 Go를 설치하지 않고 TestContainers와 유사한 방법을 따라 Go 설치에서 Dockerfile+를 라이브로 설정하는 의존 관계를 유지하고 원본 파일을 변경할 때 나의 프로젝트를 다시 불러온다.
이렇게, 프로젝트와 Dockerfile 버전을 제어했기 때문에, 만약 내가 개발 기계를 변경하거나 다시 포맷해야 한다면, 내가 해야 할 일은 Docker를 다시 설치하고, 내가 떠난 곳에서 계속하는 것뿐이다.

콘스탄틴 다루트 킹 요컨대


만약 당신이 신기술 창고에 어떻게 동력을 제공할 것인지를 결정하지 못한 초창기 회사나 오래된 서비스 제공 업체라면, 당신의 제품과 비봉 환경을 컨테이너화하는 것을 고려하고 있지만, 테스트를 거치지 않은 수역에서 항행하는 것이 두렵다면, 아래의 몇 가지를 고려해 보세요.

일관성


당신은 전체 업계에서 가장 좋은 개발자를 가질 수 있지만, 다양한 운영체제가 존재하기 때문에 모든 사람들이 자신의 설정을 좋아합니다.Docker로 로컬 환경을 올바르게 설정했다면 새 개발자가 해야 할 일은 그것을 설치하고 응용 프로그램에 용기를 생성한 다음 시작하는 것입니다.

디버깅


팀 내의 환경 문제를 쉽게 격리하고 제거할 수 있으며 시스템 설정에 대한 이해가 필요하지 않습니다.좋은 예는 ntpd에서 Chrony로 이전함으로써 서버의 시간 동기화 문제를 해결해야 한다는 것이다. 우리가 하는 일은 우리의 기초 이미지를 업데이트하는 것일 뿐, 우리의 개발자는 조금도 모른다.

자동화


Jenkins, CircleCI, TravisCI 등을 포함한 대부분의 CI/CD 도구는 현재 Docker와 완전히 통합되어 환경 사이에서 변경 사항을 쉽게 전파할 수 있습니다.

클라우드 지원


한 클라우드 모니터링 회사가 Docker에서 용기는 모니터링이 필요하다고 말했다. 그렇지 않으면 서버와 DataDog에서 실행되는 것이 무엇인지 알 수 없을 것이다.

Containers’ short lifetimes and increased density have significant implications for infrastructure monitoring. They represent an order-of-magnitude increase in the number of things that need to be individually monitored.


이 같은 노력의 해결 방안은 자체 관리의 클라우드 편성 도구(예를 들어 Docker Swarm에서 얻을 수 있고, 공급업체가 관리하는 도구(예를 들어 AWS의 KubernetesElastic Container Service에서 얻을 수 있으며, 이러한 도구는 용기 집단과 스케줄링을 감시하고 관리할 수 있다.
Docker의 광범위한 사용과 AWS와 Google Cloud 등 클라우드 서비스 공급업체와의 긴밀한 통합에 따라 새로운 응용 프로그램이나 기존의 응용 프로그램을 Docker화하는 것은 곧 고려할 필요가 없는 일이 될 것이다.

좋은 웹페이지 즐겨찾기