Docker
- 프로세스 격리 기술들을 사용해서 리눅스 응용 프로그램들을 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트
- 리눅스 컨테이너(LXC)를 기반으로 더욱 효율적인 컨테이너 관련 작업을 하기 위해 만들어진 도구
Linux Container(LXC)
- 운영체제 수준의 가상화 기술로 리눅스 커널을 공유하며 프로세스를 격리된 환경에서 실행하는 기술
- 커널을 공유하는 방식 덕분 속도가 빠르고 성능 상의 손실이 거의 없음
- Docker의 초창기 때 사용
Container
- 개별 소프트웨어 실행에 필요한 환경을 독립적으로 구성해놓은 환경
- 다른 실행환경과의 독립성을 확보해주는 OS 수준의 격리 기능
https://www.44bits.io/ko/keyword/linux-container#%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EB%9E%80
Why Docker?
개발환경과 배포환경의 일치
"A, B프로그램이 C 프로그램에 의존하고 있다"고 가정했을 때,
A와 B가 각각 요구하는 C 프로그램의 버전이 다르다고 생각해보자.
- A -> C 1.0
- B -> C 2.0
하나의 컴퓨터에서 A와 B를 실행시키려면, C 1.0/C 2.0 모두 필요한데, 보통 한 컴퓨터에 여러 버전의 프로그램이 설치되지는 않는다. 이 경우 A와 B 둘 중 한 프로그램은 제대로 된 실행이 보장되지 않는데, 이것을 "의존성이 충돌한다"고 한다.
이 문제를 컨테이너 기술을 통해 해결한다. 프로그램을 컨테이너 내에서 구성하면, 컨테이너에서 실행 중인 프로그램은 어떠한 의존성도 공유하지 않게 되고, 각자의 고유한 의존성을 가지게 된다.
컨테이너는 다음과 같은 리소스들을 격리하고 독립적으로 소유하게 된다.
- 프로세스
- 특정 컨테이너에서 작동하는 프로세스는 기본적으로 크 컨테이너에서만 엑세스 가능
- 특정 컨테이너에서 작동하는 프로세스는 다른 컨테이너에 영향을 줄 수 없음
- 네트워크
- 기본적으로 컨테이너마다 각자의 localhost를 가짐(각자의 IP주소를 가진다)
- 파일 시스템
- 각 컨테이너에서 사용되는 파일시스템은 구획화 되어 있음
Java를 이용해서 웹서비스를 개발하는 개발팀이 있다고 생각해보자.
각각의 팀원은 하나의 애플리케이션을 만들기 위해 개발 환경을 설정해줘야 한다.
필요한 리소스들을 찾아서 설치해야 하고 설치 중 충돌이 발생하는 등의 문제가 생겨 설정 과정이 꽤 오래 걸릴 것이다.
우여곡절 끝에 설정을 마친 팀원들은 이제 개발을 시작하면 된다.
하지만 개발이 많이 진행된 상태에서 새로 투입되는 사람이 있다면??
애플리케이션을 한 번 돌리기 위해 여러 시행착오를 겪어야 할 것이다.
위의 문제를 Docker를 이용해 해결할 수 있다.
Docker의 특성 덕분에 OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있고, 개발을 컨테이너 위에서 진행한다면 모든 개발팀 인원이 동일한 환경에서 개발을 진행할 수 있게 된다.
서비스 배포도 시에도 위와 같이 개발 환경을 일치시키는 것을 적용할 수 있다.
웹 서비스를 배포한다는 것은, 어떤 애플리케이션이 특정 환경에서 실행되고, 이것을 사용자에게 제공한다는 것이다.
이는 개발 환경을 설정하는 것과 비슷한 이야기이고, 단지 로컬 환경에서 작동하느냐 인터넷 상에 공개하느냐의 차이이다.
Docker를 이용하면 서버에 파일을 하나하나 업로드 하는 것이 아니라 컨테이너를 통째로 올릴 수 있게 된다.
이렇게 하면 양쪽 모두 동일한 환경에서 실행되는 것이기에 한 쪽에서만 작동되는 상황이 발생하지 않게 된다.
쉬운 수평 확장 & 쉬운 배포
Google과 같은 웹서비스는 항상 많은 양의 트래픽이 발생하는데, 하나의 컴퓨터로 이 트래픽들을 처리하기엔 무리가 있다. 그래서 서비스 제공자들은 많은 양의 트래픽을 분산하기 위해 프록시 서버를 운영하는데, 프록시 서버는 여러 대의 동일한 서버 중 한 군데를 이용할 수 있게 도와준다.
서버에 가해지는 부하를 분산시켜 주는 장치를 Load Balancer(여기서는 프록시 서버) 라고 한다.
동일한 애플리케이션의 구성(이미지)을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고, Load Balancer에 새로 만들어진 서버를 추가해주면 실행 환경이 일치하는 서버를 만들어서 트래픽을 나눠줄 수 있다.
핵심 키워드
☑️이미지
- Docker에서 서비스 운영에 필요한 것들을 묶어놓은 형태
- 특정 애플리케이션 실행을 위한 모든 파일/설정/환경값 등을 지닌 형태
- 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿
- 이미지를 통해 컨테이너를 생성
- Immutable
- 변하진 않지만 기본 이미지에 새로운 사항들을 추가해서 새로운 이미지를 만들어 낼 수 있음
☑️컨테이너
- 애플리케이션이 의존성/네트워크 환경/파일 시스템과 상관없이 Docker 위에서 실행될 수 있는 애플리케이션 상자
☑️레지스트리
- 이미지가 저장되는 곳
- 이미지로 컨테이너를 생성할 때 host 컴퓨터에 이미지가 없다면 기본 레지스트리에서 이미지를 다운받음
- Docker Hub, Amazon ECR
Docker CLI
https://docs.docker.com/engine/reference/run/
Docker CLI로 Docker 사용
✔️이미지 이름 읽는 법
Docker에서 제공하는 이미지의 이름은 기본적으로 아래와 같은 형태로 구성되어 있다.
Registry_Account/Repository_Name:Tag
Registry(레지스트리)
- Docker 이미지를 관리하는 공간
- 따로 정하지 않을 경우 Docker Hub가 기본 레지스트리로 설정됨
- Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나뉠 수 있다.
Repository(레포지토리)
- 레지스트리 내에 도커 이미지가 저장되는 공간
- 이미지 이름으로 사용되기도 함
- Github의 repository와 비슷..?
Tag(태그)
- 해당 이미지를 설명하는 정보(주로 버전 정보)
- 따로 지정하지 않을 경우 latest 태그가 붙은 이미지를 가져온다.
docker/whalesay:latest
>> Docker Hub 레지스트리에서 whaleway라는 이미지 혹은 레포지토리 중 latest 태그를 가진 것
Docker Example
dockey/whalesay 이미지 불러오기
docker image pull docker/whaleway:latest
이미지 리스트 출력
docker image ls
docker images
받아온 이미지 실행(이미지 > 컨테이너)
#docker container run [OPTIONS] IMAGE [COMMAND] [ARG..]
docker container run --name myCont docker/whalesay cowsay wow!
컨테이너 리스트 출력
docker container ps # -a를 붙이면 정지 중인 컨테이너도 확인 가능
컨테이너 삭제
# docker container rm [Container_Name]
docker container rm myCont
이미지 삭제
# docker image rm [Image_Name]
docker image rm docker/whalesay
하나의 이미지를 받아와서 컨테이너로 실행하고 중지되면 관련된 리소스 모두 제거하기
docker container run --name concon --rm docker/whalesay cowsay hoo~
번외
docker container run -it --rm danielkraic/asciiquarium:latest
'🌩️Cloud' 카테고리의 다른 글
Scale up & Scale out (0) | 2022.12.09 |
---|---|
Forward Proxy & Reverse Proxy (0) | 2022.12.09 |
배포 자동화 with AWS (0) | 2022.12.07 |
AWS를 통한 애플리케이션 배포 - 튜토리얼 (0) | 2022.12.05 |
AWS 학습을 위한 기본 학습 (0) | 2022.12.02 |