목차
도커
•
애플리케이션 실행 환경을 작성 및 관리하기 위한 오픈 플랫폼
•
아래 기능을 제공
◦
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 서버로 작동하는 것을 확인