Series 〉 Docker starts
도커, 제대로 알고 써보자 … 
도커(Docker)란?
도커(Docker)는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다.
도커는 프로그램을 외부 환경과 격리시켜 구동할 수 있게 해주는 소프트웨어입니다.
컨테이너(Container)란?
컨테이너란 OS 상에 논리적인 영역(컨테이너)을 구축하고, 애플리케이션이 작동하는데 필요한 요소들을 모아 별도의 서버처럼 동작하는 것을 말합니다.
필요한 요소만으로 구성되어 있기 때문에 상대적으로 오버헤트가 적습니다.
도커 컨테이너의 장점
모듈성
컨테이너화에 대한 Docker 접근 방식은 전체 애플리케이션을 분해하지 않고도 업데이트 또는 복구를 위해 애플리케이션의 일부를 분해하는 기능에 중점을 둡니다. 이러한 마이크로서비스 기반 접근 방식 외에도 서비스 지향 아키텍처(SOA)와 거의 같은 방식으로 멀티플 애플리케이션 간에 프로세스를 공유할 수 있습니다.
롤백
계층화의 가장 큰 장점은 아마 롤백 기능일 것입니다. 모든 이미지에는 계층이 있습니다. 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백하면 됩니다. 이 기능은 애자일 개발 접근 방식을 지원하며 툴 관점에서 실제로 지속적 통합 및 배포(CI/CD)를 수행하는 데 도움을 줍니다.
계층 및 이미지 버전 제어
각 Docker 이미지 파일은 일련의 계층으로 구성되며 이러한 계층들은 단일 이미지로 결합됩니다. 계층은 이미지가 변경될 때 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성됩니다.
Docker는 이러한 계층을 재사용하여 새 컨테이너를 구축하는데, 이때 구축 프로세스 속도가 빨라집니다. 중간 변경 사항은 이미지 간에 공유되므로 속도와 크기, 효율성이 더욱 향상됩니다. 또한 계층화에는 버전 제어가 내재되어 있습니다. 새로운 변경 사항이 있을 때마다 변경 로그가 기본 제공되므로 컨테이너 이미지를 완벽하게 제어할 수 있습니다.
신속한 배포
이전에는 새로운 하드웨어를 확보, 실행, 프로비저닝, 제공하는 데 며칠이 걸렸으며, 이를 위한 작업 및 오버헤드 부담도 상당했습니다. Docker 기반 컨테이너는 배포 시간을 몇 초로 줄일 수 있습니다. 각 프로세스에 대한 컨테이너를 생성하면 해당 프로세스를 새 애플리케이션과 빠르게 공유할 수 있습니다. 또한 컨테이너를 추가하거나 이동하기 위해 운영 체제를 부팅할 필요가 없으므로 배포 시간이 상당히 단축됩니다. 배포 시간이 단축되면 컨테이너에서 생성한 데이터를 쉽고 비용 효율적으로 생성하고 제거할 수 있습니다.
따라서 Docker 기술은 효율성을 더욱 중요시하며 더욱 세분화되고 제어 가능한 마이크로서비스 기반 접근 방식입니다.
도커 컨테이너 구조
도커 컨테이너는 컨테이너 레이어(Container Layer)와 이미지 레이어(Image Layer)로 구성되어 있습니다.
컨테이너 레이어
읽기/쓰기 모두 가능한 계층(R/W layer)으로 최상단 레이어에 추가됩니다. 컨테이너를 실행하고 진행되는 변경사항은 이 계층에 저장됩니다.
이미지 레이어
읽기 전용 계층(R/O layer)으로 다른 컨테이너와 공유할 수 있는 레이어입니다.
컨테이너 레이어와 이미지 레이어 차이점
컨테이너와 이미지의 주요 차이점은 최상단 레이어의 쓰기 가능한 레이어입니다. 새로운 데이터를 추가하거나 기존 데이터를 수정하는 컨테이너에 대한 모든 쓰기 작업은 이 쓰기 가능한 레이어에 저장됩니다. 컨테이너가 삭제되면 쓰기 가능한 레이어 또한 삭제도비니다. 그러다 기본 이미지는 변경되지 않습니다.
각 컨테이너에는 쓰기 가능한 자체 컨테이너 레이어가 있고 모든 변경 사항이 이 컨테이너 레이어에 저장되므로 여러 컨테이너가 동일한 기본 이미지 액세스를 공유하면서도 자체 데이터 상태를 가질 수 있습니다.
아래 다이아그램 이미지는 Ubuntu 15.04 이미지를 공유하는 여러 컨테이너를 보여줍니다.
도커 컨테이너 구조의 장점
위에서 설명했듯이 도커 컨테이너 구조는 컨테이너가 이미지를 공유하는 구조이기 때문에 여러 컨테이너를 만들어도 불필요한 용량을 줄이고 동일한 성능을 낼 수 있습니다.
도커 명령어 구조
도커의 모든 명령은 docker로 시작하며 어떤 대상에게 명령어를 실행할 것인지 구분하며 작성하면 쉽습니다.
명령어 구조
$ docker [대상] [커맨드] [옵션] [인자]
대상
•
container
docker container
Bash
복사
•
image
docker image
Bash
복사
•
volume
docker volume
Bash
복사
•
network
docker network
Bash
복사
커맨드
•
도커에서 사용할 수 있는 커맨드 목록은 아래와 같이 확인 할 수 있습니다.
docker [대상] --help
Bash
복사
위와 같은 방법으로 커맨드 수준을 높이고 뒤에 --help를 입력하여 커맨드 목록을 확인 할 수 있습니다.
컨테이너 관련 명령어
$ docker container [커매드]
커맨드 | 설명 | 주요 옵션 |
start | 컨테이너 실행 | -i |
stop | 컨테이너 정지 | |
create | 컨테이너 생성 | --name -e -p -v |
run | 이미지를 내려받고 컨테이너를 생성 및 실행 | —-name -e -p -v -d -i -t |
rm | 컨테이너 삭제 | -f -v |
exec | 컨테이너에서 프로그램 실행 | -i -t |
ls | 컨테이너 목록 출력 | -a |
cp | 컨테이너와 호스트 간 파일 복사 | |
commit | 커넽이너를 이미지로 변환 |
이미지 관련 명령어
$ docker image [커매드]
커맨드 | 설명 | 주요 옵션 |
pull | 이미지를 내려받음 | |
rm | 이미지 삭제 | |
ls | 가지고 있는 이미지 목록 출력 | |
build | 이미지 생성 | -t |
주요 옵션 설명
주로 사용되는 옵션에 대한 설명입니다.
•
--name : 컨테이너 이름 지정
•
-p : 포트 번호 지정
•
-v : 볼륨 설정
•
-e : 환경 변수 설정
•
-d : 백그라운드 실행
•
-i : 컨테이너에 터미널 연결
•
-t : 특수 키를 사용 가능하게 설정
도커 컨테이너와 통신하기
도커 컨테이너는 기본적으로 독립적인 환경에서 실행되기 때문에 컨테이너 밖에서 접근할 수 없습니다.
따라서, 컨테이너와 통신하기 위해서는 컨테이너를 가동시키면서 p 옵션을 사용하여 도커 컨테이너의 포트 포워딩 설정을 해줘야 합니다. (-p ${호스트 포트}:${컨테이너 포트})
# e.g.
# Apache 이미지인 httpd 이미지로 컨테이너를 생성하고,
# 호스트 포트 8080을 컨테이너 포트 80에 매핑
docker run --name web-container -d -p 8080:80 httpd
Bash
복사
이 설정을 사용하기 위해서는 호스트(서버 또는 PC)에서 사용 중인 포트가 겹치치 않는지 확인하여 여분의 포트를 사용하여 컨테이너의 포트를 설정해야 합니다.
포트 포워딩이란?
포트포워딩(port forwarding)은 컴퓨터 네트워크 상에서 패킷이 방화벽이나 라우터 같은 네트워크 게이트를 지날 때 IP 주소와 포트 번호 결합의 통신 요청을 다른 곳으로 넘겨주는 네트워크 주소 변환의 응용이라고 볼 수 있습니다.
쉽게 말해서, 포트포워딩(Port forwarding)은 간단히 말해서 포트(Port)를 전달(Forwarding)해 주는 거라고 생각하시면 됩니다. 특정한 포트로 들어오는 데이터 패킷을 다른 포트로 바꿔서 다시 전송해주는 작업인 것이죠.
More posts like this
Search