블록체인
블록체인

도커 구조

목차

도커

애플리케이션 실행 환경을 작성 및 관리하기 위한 오픈 플랫폼
아래 기능을 제공
Build : 도커 이미지 만들기
Ship : 도커 이미지 공유
Run : 도커 컨테이너 작동
가상화라기보다 리눅스 컨테이너 격리기술 사용

도커 에디션

community Edition(CE)

로컬 환경 및 상용 지원이 불필요한 환경에 적합
확장성
이미지만 만들어 놓으면 컨테이너만 관리
서비스 이전이나 신규 서버에 서비스 추가 시 docker run 명령어로 처리
개발 서버나 테스트 서버 운용 간편
표준성
도커를 사용하지 않는 경우 ruby, node.js, go, php로 만든 서비스들의 배포 방식은 제각각
컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포 과정이 동일

도커 컨테이너

1.
도커를 이용해 애플리케이션을 패키징하면 전개와 런타임 문제를 애플리케이션 외부에서 제어 가능
애플리케이션을 네트워크에 노출하는 방식, 애플리케이션의 스토리지, 메모리, I/O 이용을 관리하는 방식, 접근 권한을 통제하는 방식
2.
컨테이너는 기저의 운영체계로부터, 다른 컨테이너로부터 단일 애플리케이션과 의존성 다시말해 앱 실행에 필수적인 외부 소프트웨어 라이브러리 전체를 격리
컨테이너화된 앱은 하나의 공통 운영 체계를 공유
3.
시스템 자원을 좀 더 효율적으로 이용 가능
컨테이너에 담긴 앱은 가상 머신보다 훨씬 더 적은 메모리를 사용하며, 더 신속하게 시작하고 중지하며, 호스트 하드웨어에서 훨씬 더 밀도 있게 배치 가능
컨테이너는 훨씬 가볍고 운영체제 커널을 공유하며 시동이 훨씬 빠르고 운영체제 전체 부팅보다 메모리를 훨씬 적게 차지
4.
도커는 소프트웨어 전달 주기를 가속화
기업용 소프트웨어는 변화하는 환경에 신속히 대응해야 함
수요에 맞춰 스케일링을 간단히 할 수 있고 비즈니스가 요구하는 신기능을 추가하는 업데이트를 간단히 할 수 있음
5.
도커는 애플리케이션 이동을 가능하게 함
엔터프라이즈 애플리케이션을 어디서 실행하는가는 중요함
가까이에 안전한 상태로 두기 위해서는 방화벽 뒤에서 이를 실행해야 할 것이고, 간편한 퍼블릭 접근과 자원의 높은 탄력성을 원한다면 퍼블릭 클라우드에서 이를 실행
도커 컨테이너는 애플리케이션이 실행해야 하는 모든 것을 캡슐화하기 때문에 애플리케이션이 환경들 사이에서 손쉽게 이동할 수 있음
애플리케이션을 호스트 운영체제와 연결할 필요 없이 컨테이너 런타임 환경을 지원하는 모든 장치에서 실행
6.
컨테이너에 의해 좀더 용이해지는 소프트웨어 패턴의 하나는 마이크로서비스
애플리케이션은 다수의 느슨히 결합된 컴포넌트로부터 구성
전통적인 ‘모놀리틱’ 애플리케이션을 부분적 서비스들로 해체함으로써 마이크로서비스는 비즈니스 요구에 따라 별개의 팀에 의해 별개의 스케줄 상에서 LOB 앱(a Line-Of Business App)의 부분들이 개별적으로 확장, 수정, 서비스되도록 할 수 있음
7.
결합성을 제공
대부분의 비즈니스 애플리케이션은 웹 서버, 데이터베이스, 인-메모리 캐시 등 하나의 스택으로 구성되는 별개의 여러 구성요소로 구성됨
컨테이너는 이런 구성 요소들을 쉽게 변경할 수 있는 부품으로 구성된 기능 유닛으로 결합
여러 컨테이너가 각 조각들을 제공하며 독립적으로 유지, 업데이트, 교체, 수정 가능
8.
오케스트레이션과 스케일링이 쉬움
가볍고, 오버헤드가 거의 없기 때문에 특정 시스템에서 더 많이 실행시킬 수 있음
여러 시스템에서의 애플리케이션 스케일링, 수요 증가와 리소스 보존을 위한 서비스 증가 및 다운에도 컨테이너를 사용 가능
컨테이너 기반을 이용하여 단순한 저장공간 컨테이너(볼륨)을 만들어 저장공간을 container끼리 연결할 수 있으며 실행한 호스트의 저장공간에도 접근 가능함
하나의 리눅스 커널을 여러 개의 컨테이너에서 공유
컨테이너 안에서 작동하는 프로세스를 하나의 그룹으로 관리하고 그룹마다 각각 파일 시스템이나 호스트명, 네트워크 등을 할당
그룹이 다르면 프로세스나 파일에 대한 액세스를 할 수 없음
이러한 구조를 사용하여 컨테이너를 독립된 공간으로 관리 ← 이를 실행하기 위해 리눅스 커널기능(namespace, cgroups 등) 기술이 사용
도커는 게스트 OS를 설치하지 않음
단지 이미지에 서버 운영을 위한 프로그램과 라이브러리만 격리해서 설치하기 때문에 이미지 용량이 크게 줄어듬
도커의 컨테이너는 OS를 설치하지 않기 때문에 호스트와 OS자원을 직접 사용
도커는 하드웨어 가상화 계층이 존재하지 않기 때문에 메모리 접근, 파일 접근 등 관련한 기능에서 직접 접근하기 때문에 가상화보다 빠른 성능
도커 프로그램에서 다양한 API를 제공하기 때문에 원하는 만큼 자동화 가능

도커 작동 구조

도커는 리눅스 커널의 기술이 베이스로 되어 있음

namespace : 컨테이너를 구획화

글로벌 리소스에 대한 프로세스 수준의 격리 제공
도커 컨테이너 간 독립된 프로세스 공간과 독립된 네트워크 스택 등을 제공
6가지 네임스페이스를 지원
Linux 커널의 namepsace는 Linux의 오브트에 이름을 붙여 6개의 독립된 환경을 구축
도커는 namespace 장치를 사용하여 호스트 상에서 컨테이너를 가상으로 격리

cgroups : 릴리스 장치 관리

각종 시스템 리소스(호스트 OS의 CPU나 메모리 등의 자원)에 대한 접근제어와 리소스 제약 담당
각 리소스는 subsytem이라고 부름
/sys/fs/cgroup 디렉터리에서 각 subsystem 확인 가능

chroot

프로세스의 root 디렉터리 변경
LXC(Linux Containers) 란? (위키페디아)
단일 컨트롤 호스트 상에서 여러 개의 고립된 리눅스 시스템(컨터이너) 들을 실행하기 위한 운영 시스템 레벨 가상화 방법
리눅스 커널은 Cgroups를 절충하여 가상화 머신 시작 필요 없이 자원할 당 (CPU, Memory, 블록 I/O, 네트워크 등)
Cgroups와 namespace isolation을 결합하여 애플리케이션을 위한 고립 된 환경 제공

도커 컴포넌트

도커는 컴포넌트로 구성되어 Docker Engine을 중심으로 컴포넌트를 조합하여 애플리케이션 실행 환경을 구축

Docker Engine : 도커의 핵심 기능

도커 명령 실행 및 도커파일에 의한 이미지 생성

Docker Registry : 이미지 공개 및 공유

이미지를 공개 및 공유하기 위한 레지스트리 기능

Docker Compose : 컨테이너 일원 관리

여러 개의 컨테이너 구성 정보를 코드로 정의하고 명령을 실행하여 애플리케이션의 실행 환경을 구성하는 컨테이너들을 일원 관리하기 위한 툴

Docker Swarm : 클러스터 관리

도커 호스트를 클러스터화하기 위한 툴
Manager : 클러스터를 관리하거나 API를 제공
Node : 도커 컨테이너를 실행하는 역할

도커 볼륨과 데이터 관리

도커는 데이터를 안전하게 존속시킬 수 있는 방식으로 volume, bind mouts,. tmpfs의 3가지 방식을 제공
3가지 유형의 가장 큰 차이점은 데이터가 도커 Host 내 어디에 존재하는지의 차이
어떤 유형의 마운트를 사용하든 데이터는 컨테이너 내에서 동일하게 보이며 파일시스템의 폴더나 개별적인 파일들로 표시

Volume

도커(리눅스에서는 /var/lib/docker/volume/)가 관리하는 Host File System의 일부에 데이터가 저장
마운트할 때 이름을 명시적으로 지정하거나 익명으로 사용 가능하며 이름이 지정된 방식과는 상관없이 볼륨은 동일한 방식으로 작동
원격 호스트와 클라우드 프로바이더가 데이터를 저장할 수 있는 볼륨 드라이버 사용을 지원

Bind mount에 비한 장점

백업 및 마이그레이션이 더 쉬움
도커 CLI 명령이나 도커 API를 사용 가능
리눅스 컨테이너와 윈도우 컨테이너 모두에서 작동
여러 컨테이너 사이에서 더 안전하게 공유
원격 호스트나 클라우드 프로바이더에게 볼륨을 저장하거나 볼륨의 내용을 암호화, 다른 기능을 추가 가능
컨테이너에 의해 그 내용물을 미리 채울 수 있음

Bind mount

데이터가 Host System의 어디에든지 저장 가능
호스트 시스템의 파일 또는 디렉터리가 컨테이너에 마운트(경로가 호스트에 존재하지 않는다면 자동 생성됨)
볼륨에 비해 기능이 제한
호스트 시스템의 파일 시스템 디렉터리 구조에 의존적
도커 CLI 명령어로 관리할 수 없음

tmpfs mount

Host System의 메모리에만데이터가 저장
도커 호스트 또는 컨테이너 내의 디스크에서 데이터가 유지되지 않음
비영구적인 상태 정보나 민감정보와 같이 컨테이너의 생명주기와 맞춰서 데이터를 보존하고자 할 때 사용 가능 Ex) Swarm Service는 내부적으로 tmpfs mount를 사용하여 Secret 정보를 Service의 컨테이너에 마운트하여 사용

도커 설치(Docker for Windows) 및 실행

Docker for Windows는 Hyper-V를 사용하여 동작

도커 설치

아래 사이트에서 다운로드 및 설치
다음 세가지 조건을 만족시켜야 Docker for Windows 이용 가능(만족하지 않을 경우 Docker Toolbox 설치)
Windows 10 Pro 또는 Enterprise(64bit)
VirtualBox와 같은 서드파티 제품 가상화 환경 미설치(설치되어 있다면 삭제) ⇒ 최근에는 삭제 안해두 돌아간다고 함
Hyper-V 유효화 : 제어판 > 프로그램 및 기능 > Windows 기능 켜기/끄기 > Hyper-V 항목 체크

Windows Subsystem for Linux(WSL)에서 docker 사용

WSL 구조
2.
Settings > General에서 Use the WSL 2 based engine 체크
3.
Ubuntu 활성화
[참고] 클라이언트 PC와 파일 공유
Settings > Shared Drives

Hello World 출력

도커 컨테이너를 작성 및 실행할 때는 docker container run 명령 사용
이미지:latest는 최신 버전의 이미지를 취득한다는 뜻
docker container run <Docker 이미지명> <컨테이너 내에서 실행할 명령> C:\>docker container run ubuntu:latest /bin/echo 'Hello world!' Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 08c01a0ec47e: Pull complete Digest: sha256:669e010b58baf5beb2836b253c1fd5768333f0d1dbcb834f7c07a4dc93f474be Status: Downloaded newer image for ubuntu:latest 'Hello world!' C:\>docker container run ubuntu:latest /bin/echo 'Hello world!' 'Hello world!' C:\>docker container run ubuntu:latest /bin/echo 'Hello world!' 'Hello world!'
PowerShell
복사
docker container run 명령 실행 시 해당 이미지가 로컬환경에 있는지 확인 후 없다면 도커 리포지토리에서 도커 이미지를 다운로드
첫 번재 명령어 실행 시 도커 이미지 다운로드에 시간이 소요되지만, 두 번째부터는 로컬 환경에 다운로드(로컬 캐시)된 도커 이미지를 바탕으로 도커 컨테이너를 시작

docker 기본 명령어_1

도커는 클라이언트/서버 아키텍처를 채탁하고 있어서 도커 클라이언트와 도커 서버가 Remote API를 경유하여 연결되어 있음
도커 명령은 서버로 보내져 처리됨
docker version : 도커 버전 확인
docker system info : 도커 실행환경의 상세 설정 표시(컨테이너 수, 스토리지 드라이버 종류 등)
docker system df -v : 도커가 사용하고 있는 디스크의 이용 상황 표시

docker 기본 명령어_2 : Nginx 실행

1.
이미지 다운로드
docker pull <도커 이미지명>
C:\>docker pull nginx Using default tag: latest latest: Pulling from library/nginx 5eb5b503b376: Pull complete 1ae07ab881bd: Pull complete 78091884b7be: Pull complete 091c283c6a66: Pull complete 55de5851019b: Pull complete b559bad762be: Pull complete Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest
PowerShell
복사
2.
이미지 확인
docker image ls
C:\>docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE docker101tutorial latest bbd7bd738e6b 2 hours ago 28.8MB ubuntu latest 54c9d81cbb44 9 days ago 72.8MB nginx latest c316d5a335a5 2 weeks ago 142MB alpine/git latest c6b70534b534 2 months ago 27.4MB
PowerShell
복사
3.
컨테이너 작동(Nginx 작동)
docker container run --name <컨테이너 이름> -d -p <포트:포트> <도커이미지>
C:\>docker container run --name webserver -d -p 80:80 nginx 5189780d052a1a1b1f460bbd9f11f08553b1e08245000f2ea0c80a0a5c03b6fb
PowerShell
복사
nginx 이미지를 사용하여 webserver라는 이름의 도커 컨테이너를 기동
브라우저에서 HTTP에 대한 액세스를 허가하기 위해 -p 옵션을 붙여 컨테이너가 보내는 전송을 허가
명령 실행 시 컨테이너 ID 확인 가능
4.
컨테이너 작동 확인(Nginx 작동 확인)
http://localhost:80으로 접근하여 사용하고 있는 PC가 Nginx 서버로 작동하는 것을 확인