기본 콘텐츠로 건너뛰기

[Docker] Docker 이론

원본링크: https://sddev.tistory.com/118

위 링크 내용을 가져와서 내용 습득을 위해 다시 한번 정리한 것입니다.


[Docker] Docker 이론



# Docker란?


Linux Container 기반의 가상화 플랫폼이다.

Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. 


Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. 


Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.



# Docker의 작동 방식


Docker는 코드를 실행하는 표준 방식을 제공합니다. 

Docker는 컨테이너를 위한 운영 체제입니다. 


가상 머신[VM]이 서버 하드웨어를 가상화하는 방식과 비슷하게(직접 관리해야 하는 필요성 제거)  컨테이너[Container]는 서버 운영 체제를 가상화합니다.

Docker는 각 서버에 설치되며 컨테이너를 구축, 시작 또는 중단하는 데 사용할 수 있는 간단한 명령을 제공합니다.



# Docker를 사용하는 이유


Docker를 사용하지 않고, 개별 local에 Redis, Mysql과 같은 프로그램을 설치하려면, 

환경별로 설치 중에 다양한 에러가 발생한다.

Docker를 설치하면, Docker Engine 상에서 어느 환경에서나 명령어 하나만으로 동일한 서비스를 설치하고, 쉽게 접근이 가능하다.



# Docker Container와 기존 VmWare VM 기술의 공통점 & 차이점


둘 다 격리된 리소스를 가진 실행 환경을 제공하지만,


VM은 HostOS와 별개인 GuestOS를 설치하여 동작하여 무겁고,

Docker Container는 별도의 OS 없이 HostOS의 커널을 공유하므로 실행이 가볍다.


Docker: 어플리케이션을 실행할 때는 컨테이너 방식에서는 Host OS 위에 애플리케이션의 실행 패키지인 이미지를 배포하기만 하면 됩니다.


VM: VM은 어플리케이션을 실행 하기 위해서 VM을 띄우고 자원을 할당한 다음, 

게스트 OS를 부팅하여 어플리케이션을 실행 해야 해서 훨씬 무겁고 복잡하게 실행해야 합니다.


공통점: 도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법입니다.

차이점: 가장 큰 차이점은 격리된 환경을 얼마나 격리를 시키는지의 차이


Docker Container는 커널은 공유하고 나머지 CPU, 메모리, 하드디스크는 컨테이너 안에 다 격리되어 있습니다.



# Docker Container의 격리 구현 원리


Docker 클라이언트와 Docker 서버는 Linux로 되어 있습니다.

Linux OS Kernel에서 제공하는 CGroup과 네임스페이스(Namespaces)을 활용하여 구현된다.

이것들은 Container와 호스트에서 실행되는 프로세스 사이에 벽을 만드는 리눅스 커널 기능들입니다.



# Linux Kernel의 C Group & 네임스페이스


C Group: CPU, 메모리, Network, HD I/O 등 프로세스 그룹의 시스템 리소스 사용량을 관리

어떤 애플리케이션 사용량이 너무 많다면 그 어플리케이션 같은 것을 C Group에 집어 넣어서 

CPU와 메모리 사용 제한 가능 (필요한 만큼만 할당해 줌)

네임스페이스: 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술

(별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술)



# Docker Container란?


Docker 컨테이너는 Docker 이미지의 인스턴스로써,

어플리케이션이 동작하기 위해서 필요한 요소(실행 파일, 어플리케이션 엔진 등)을 패키지화하고 격리하는 기술이다.


컨테이너란 호스트 OS상에 논리적인 구획(컨테이너)을 만들고, 어플리케이션을 작동시키기 위해 필요한 라이브러리나 

어플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것이다.

 


# Docker Image란?


Docker 컨테이너를 만들기 위해 필요한 설정이나 종속성들을 갖고 있는 소프트웨어 패키지이다.

Docker 이미지는 Dockerhub에 다른 사람들이 만들어놓은 이미지를 다운받아 사용할 수도 있고 

직접 이미지를 만들어 사용할 수도 있음


Docker 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있다.

응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있습니다.

- 컨테이너가 시작 될 때 실행되는 명령어 (Dockerfile로 관리)

- 파일 스냅샷 (ex: 카카오톡이라면 카카오톡을 실행하는데 필요한 파일) - 디렉토리나 파일을 압축시킨 스냅샷

 


# Docker Layer란?


기존 Docker Image 에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌

해당 변경 내용만을 추가하기 위한 개념이다.


도커의 이미지가 변할때마다 새롭게 다운받는다면 이미지의 용량이 크기에 비효율적이다. 

이를 해결하기 위해 Layer라는 개념을 이용한다.


이미지는 여러 개의 읽기 전용(read only) layer로 구성되고, 파일이 추가되면 새로운 Layer가 생성됨. 

그리고 도커는 여러 개의 Layer를 묶어서 하나의 파일시스템으로 사용할 수 있게 해준다. 

DockerHub 및 개인 저장소에서 이미지를 공유할 때는 바뀐 부분(Layer = image)만 주고받기 가능하다.

 


# Dockerfile이란?


Docker Image를 만들기 위한 설정 파일이다.

컨테이너가 어떻게 행동해야 하는지에 대한 설정들을 정의하는 파일이다.


도커이미지 생성 과정에 대해 기술.

- 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하는 간단한 구문

- Dockerfile의 각 명령어는 이미지에 레이어를 만듭니다. 

Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어 만 다시 빌드된다



# Docker Volume이란?


Container를 삭제하더라도, 로컬 Host PC 디렉토리에 파일이 남아있도록,

컨테이너 디렉토리가 로컬 디렉토리를 참조할 수 있도록 매핑해주는 기능이다.

컨테이너를 삭제하면, MySQL 컨테이너에 존재하던 데이터들이 다 삭제가 됩니다.

이렇게 데이터가 삭제되면 나중에 문제가 될 수 있기 때문에 컨테이너가 중지되더라도 데이터를 보존하는 것이 필요합니다. 

이럴 때 사용하는 것이 Volume 입니다.



# Docker Compose란?


멀티 Container 상황에서, 별도의 설정 없이 컨테이너간 네트워크 연결을 용이하게 해주고

멀티 컨테이너를 복합 관리할 수 있는 기능이다.


Docker Compose를 사용하지 않고, NodeJS, Redis 컨테이너를 만들어서 컨테이너간 통신을 시도할 경우, 

개별로 생성된 컨테이너간 통신을 할 때, 아무런 설정을 해주지 않으면 상호 접근이 불가능하므로 에러가 발생


CLI 명령어에서 --link와 같은 것들을 이용할 수도 있으나, 

멀티 컨테이너 상황에서 쉽게 네트워크를 연결시켜주기 위해서는 Docker Compose를 이용하는 것이 좋다.


Docker Compose를 사용하면 위와 같이 두 개의 컨테이너를 Service를 통해서 연결시켜줘서 

컨테이너 간의 통신을 할 수 있게 된다.


Docker 명령어를 하나하나 입력하는 것보다는 yml 파일에서 docker-compose를 이용해서 사용하는 것이 더 편리하다는 장점이 있습니다.


Docker compose를 별도로 설치가 필요하고, docker-compose.yml 파일에서, dockerfile을 참조하여 build할 수도 있다.

 


# 가상화 VM 기술 설명


- 가상화 기술 나오기 전, 한대의 서버를 하나의 용도로만 사용, 남는 서버 공간 그대로 방치,

하나의 서버에 하나의 OS, 하나의 프로그램만을 운영, 안정적일 수 있지만 비효율적


- 하이퍼 바이저 기반의 가상화 등장, 논리적으로 공간을 분할하여 VM이라는 독립적인 가상 환경의 서버 이용 가능

하이퍼 바이저는 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있는 소프트웨어,

하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자

하이퍼바이저 아래에 기존 OS가 존재하고 그 위에 Guest OS가 존재하는 것을 볼 수 있습니다.


- 하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원을 할당 받음

논리적으로 분리 되어 있어서 한 VM에 오류가 발생해도 다른 VM으로 퍼지지 않는다는 장점이 있음


VMWare의 개별 VM들이 하이퍼 바이저 기반에서 동작하듯이, Docker의 Docker Container들은 Docker Engine 기반에서 동작한다.



# Docker의 구성요소와 아키텍처


Docker의 아키텍처란?

Docker는 Docker Client와 Docker Deamon(Server) 간의 Rest API를 통해 통신하며, 

Docker Resistry (Docker Hub)를 통해, 다양한 Docker Image를 쉽게 다운로드할 수 있도록 지원한다.

Docker는 클라이언트-서버 아키텍처이다. 도커 클라이언트와 도커 데몬이RestApi를 사용하여 통신한다.



# Docker 데몬


Docker Api 요청수신, 이미지,컨테이너,네트워크와 같은 도커 객체 및 도커 서비스 관리

Docker 클라이언트

Docker 사용자가 Docker와 상호작용하기 위한 방법. 기본적인 도커명령어를 통해서 Docker 데몬과 통신



# Docker 레지스트리


Docker 이미지를 저장, Docker hub이라는 공용 레지스트리와 개인private한 레지스트리가 있다. 

일반적으로 공용 레지스트리에서 실행

    (cf) docker pull, docker run: 사용하면  필수이미지 가져온다.

    (cf) docker push: 레지스트리에 저장


# Docker 객체


도커 이미지: 도커 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있다.

컨테이너 : 컨테이너는 도커 이미지의 실행 가능한 인스턴스입니다.

 


# 출처

- https://aws.amazon.com/ko/docker/

- https://devlog-wjdrbs96.tistory.com/278

댓글

이 블로그의 인기 게시물

이클립스 실행 오류와 eclipse.ini 수정

1. 실행시 Java was started but returned exit code=13 에러가 날때 --> Win7 64bit를 사용중인데, 이 오류가 발생하고 있었습니다. 제가 자바도 이클립스용도 32비트 버젼을 사용중이었는데, 자바만 64비트용으로 설치를 했더니, 생긴 문제였습니다. 이클립스 64비트를 설치하시면 해결됩니다. 2.이클립스 폴더내 eclipse.ini 기본값(보통 아래 처럼 되어 있습니다.) -startup plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810 -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m 3.실행하자 마자 javaw.exe 찾기 실패시  --> jdk가 설치된 경로(javaw.exe가 있는 경로)를 추가해준다. 맨 아래쪽에 삽입하니 안되더군요.(왜죠?) -vmargs 윗부분에 삽입했습니다. 다른 블로그님 들 글에선 open 위쪽에 쓰니 괜찮다는 글도 있으니 참고하세요. -vm c:\Program Files\java\jre6\bin\javaw.exe 4.이클립스 속도 향상을 위한 추가값 출처:  http://blog.naver.com/sungback/90097516641 검색도중 이클립스 속도 향상 정보를 발

[c#.net] WPF 사용 중 xaml관련 실행시 오류 와 대처 방법

wpf 사용 중 xaml관련 실행시 오류 가 발생해서 자그마치 2일을 소비 했다..--;; 오류 내용은 아래와 같다. ================================== 'System.Windows.Markup.XamlParseException' 형식의 첫째 예외가 PresentationFrameWork.dll에서 발생했습니다. 추가 정보: '지정된 바인딩 제약 조건과 일치하는 'PapaZone.MainWindow' 형식에 대한 생성자 호출에서 예외가 throw 되었습니다.' 줄 번호 '21' 및 줄 위치 '9' 이 예외에 대한 처리기가 있으면 프로그램을 안전하게 계속할 수 있습니다. [] 이 예외 형식이 throw되면 중단 ================================== 위 Xaml 오류 메세지만으로는 내용 추적 불가하여, 도대체 뭔가 했다. 검색해도 뚜렷한 답변은 없었지만, 여러가지 의견을 종합해 보면 아래와 같다. 1. xmlns 관련 파일 과 관련된 파일 로딩 실패 이거나, 2. 신규로 추가된 namespace 에 속한 태그 사용시 오류로 판단되어 태그 하나씩 삽입하며 테스트 해봐야 한다고 함. 해결한 지금에 원인을 보면, xaml 에서 clr-namespace 로 추가된 항목들이 로딩에 실패해서 발생한 것이며, 추가된 항목은 있었으나, 이것과 연결된 파일이 없어서 로딩되지 않는 것이 문제였다. 오늘도 즐거운 하루~~

[MSSQL] SQL Server 에 원격 접속을 못하는 경우 조치 방법

[MSSQL] SQL Server 에 원격 접속을 못하는 경우 조치 방법 내부 오류 추적 결과 다음과 같이 나옴. [Microsoft][ODBC Driver 13 for SQL Server]TCP Provider: 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다. SqlState : 08001, NativeError : 10061 오류 원인과 처리 1.SQL 서버 로그인 계정 틀린 경우 -> A.SQL Managerment Studio에서 사용할 DB 접속 '로그인' 사용할 계정의 아이디/암호 확인 2.TCP/IP 접속 권한이 없는 경우 -> A.SQL Server 구성 관리자를 실행에서 TCP/IP 허용 되어 있는지 확인 B. 서비스 포트 값이 (보통 1433) 맞는지 확인 C. 외부에서 접속하는 경우에는 방화벽 허용 되엉 있는지 확인 C. 서비스 재시작 3.Windows 인증 모드만 허용 인 경우 -> A.SQL Managerment Studio에서 사용할 DB 접속하고, 우클릭 하여 속성 정보 확인해서 B.연결에서 인증모드 '로그인' 사용할 계정의 아이디/암호 확인 4.'exec Sp_ReadErrorLog' 명령어를 사용해서, 로그인 실패 로그를 확인해서 원인을 분석한다.