인프라
Docker란
newwisdom
2021. 8. 14. 15:58
반응형
2021-07-11글
도커란?
- 컨테이너 기반의 오픈소스 가상화 플랫폼
- 다양한 프로그램, 실행환경을 컨테이너로 추상화한, 동일한 인터페이스를 제공해 프로그램의 배포 및 관리를 단순화하게 해줌
- 어디에서든 실행 가능하도록 해줌(조립컴, AWS, Google Cloud)
특징
확장성
- 이미지만 만들어 놓으면 컨테이너는 그냥 띄우면 됨
- 서버에 서비스 하나 더 띄울라면
run
명령어로 간단하게 해결
표준성
- 도커를 사용하지 않는 경우 ruby, nodejs, go, php로 만든 서비스들의 배포 방식은 각각 다름
- 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포과정이 동일
이미지
- 이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정이 필요
- 이미지를 저장할 곳이 필요
설정
- 보통 환경변수로 제어
- 하나의 이미지가 환경변수에 따라 동적으로 설정파일을 생성하도록 만들어져야함
컨테이너
- 격리된 공간에서 프로세스가 동작하는 기술
- 가상화 기술의 하나
BUT. 기존의 방식과는 차이가 있음
- 기존 가상화 방식은 주로 OS를 가상화 한 것
- 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식
- 이 방식은 어쨌든 성능상 문제가 있다고...
- 때문에 프로세스를 격리하는 방식 등장
- 리눅스에서는 프로세스만 격리시키는 리눅스 컨테이너 존재
- 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행 가능
- 실행중인 컨테이너에 접속래 명령어 입력 가능
- 패키지 설치 가능
- 사용자 추가 가능
- 여러개의 프로세스를 백그라운드로 실행 가능
이미지
- 컨테이너 실행에 필요한 모든 파일과 설정 값등을 포함
- 상태값을 가지지 않고 변하지 않음
- 컨테이너는 이미지를 실행한 상태
- 추가되거나 변하는 값은 컨테이너에 저장됨
- 같은 이미지에서 여러개 컨테이너를 생성할 수 있고, 컨테이너가 수정/삭제되어도 이미지는 변하지 않음
- ex) MySQL이미지는 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있음
- 도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있음
모든 정보를 가지고 있다면 용량이 엄청 클텐데...
- 이런 문제를 해결하기 위해 레이어 라는 개념 도입
레이어
- 여러개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해줌
- 이미지는 여러개의 읽기전용 레이어로 구성
- 파일이 추가되거나 수정되면 새로운 레이어가 생성됨
- 어떤 이미지를 베이스로 새로운 이미지를 다운받는면 추가되는 레이어만 다운받으면 됨
- 컨테이너를 생성할 때도 기존 이미지 레이어 위에 읽기, 쓰기 레이어를 추가하는데, 컨테이너가 실행중에 생성하는 파일, 변경 내용은 해당 레이어에만 저장되어 최소한의 용량만 사용
이미지 경로
- 이미지는 URL 방식으로 관리하며 태그를 붙일 수 있음
Dockerfile
- 이미지를 만들기 위해 DSL을 통해 이미지 생성 과정을 적음
도커 설치 & 컨테이너 실행
리눅스에 도커 설치하기
curl -fsSL https://get.docker.com/ | sudo sh
sudo 없이 사용하기
- 도커는 기본적으로 root 권한이 필요
- 루트가 아닌 사용자가 sudo 없이 사용하기 위해 다음 명령어를 통해 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
컨테이너 실행
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
docker run --help
명령어를 통해 다양한 옵션을 알아보자- 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드
pull
를 한 후 컨테이너를 생성create
하고 시작start
도커 기본 명령어
컨테이너 목록 확인하기 (ps)
- 컨테이너 목록을 확인
docker ps [OPTIONS]
컨테이너 중지하기 (stop)
- 실행중인 컨테이너 중지
docker stop [OPTIONS] CONTAINER [CONTAINER...]
컨테이너 제거하기 (rm)
docker rm [OPTIONS] CONTAINER [CONTAINER...]
이미지 다운로드하기 (pull)
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
이미지 삭제하기 (rmi)
docker rmi [OPTIONS] IMAGE [IMAGE...]
실행중인 컨테이너에 명령어 실행 (exec)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
도커 이미지 만들기
- 도커는 이미지를 만들기 위해 컨테이너의 상태를 그대로 이미지로 저장함
- ex) 어떤 애플리케이션을 이미지로 만든다면, 리눅스만 설치된 컨테이너에 애플리케이션을 설치하고 이 상태를 그대로 이미지로 저장
- 가상머신의 스냅샷과 비슷한 방식
- 이미지를 만들기 위해서는
Dockerfile
이라는 이미지 빌드용 DSLDomain Specific Language 파일 작성
이미지 빌드
docker build [OPTIONS] PATH | URL | -
- 생성할 이미지 이름을 지정하기 위한
-t(--tag)
옵션만 알면 빌드가 가능
도커 이미지 저장소
- 도커는 빌드한 이미지를 서버에 배포하기 위해 직접 파일을 복사하는 방법 대신 도커 레지스트리(Docker Registry)라는 이미지 저장소를 사용
- 이미지를 레지스트리에 푸시push하고 다른 서버에서 풀pull받아 사용하는 구조 (like. git)
도커 허브 사용
- 기본 이미지 저장소로 ubuntu, centos, debian등의 베이스 이미지와 ruby, golang, java, python 등의 공식 이미지가 저장되어 있음
- 사용법은 참고 자료를 참고하자
배포하기
- 기존 애플리케이션은 사용하는 언어, 프레임워크, 웹(or WAS)서버, 리눅스 배포판, 개발자의 취향에 따라 각각 다른 방식을 사용
- 새로운 서버를 셋팅하고 한 번에 배포를 성공한다는 건 굉장히 힘든 일
- 또한 의존성 라이브러리가 제대로 설치되었는지 검증하기도 매우 어려웠음
- 컨테이너를 사용하면 어떤 언어, 어떤 프레임워크를 쓰든 상관없이 배포 방식이 동일해지고 과정 또한 굉장히 단순해짐
- 이미지를 다운받고 컨테이너를 실행하면 끝
참고자료
반응형