컨테이너 기술의 발전
- Traditional Deployment:
- Hardware - Operating System - App(Libs & Frameworks)
- 문제점: 서비스가 점점 커지면서 한 서버에서 운영하는 서비스가 여러 개가 되면, 각각의 서비스에 필요한 라이브러리에 대해 의존성 충돌이 생길 수 있다. 관리가 어려워지고 서비스의 확장성이 낮아진다.
- Virtualized Deployment
- Hardware - Operating System - Hypervisor - Virtual Machines (Operating System - App(Libs & Frameworks))
- 운영체제 상의 Hypervisor 컴포넌트를 통해 게스트OS(별도의 CPU, RAM, HDD 등)를 만든다. 하나의 Virtual Machine에 하나의 어플리케이션을 실행한다.
- 장점: 여러 개의 어플리케이션이 서로에게 영향을 주지 않고 독립적으로 실행될 수 있다.
- 문제점: 게스트OS를 만드는 데 큰 오버헤드가 발생한다. 일반 OS에 비하여 게스트OS의 성능이 좋지 않다.
- Container Deployment
- Hardware - Operating System - docker
- 프로세스 단위의 격리 환경을 만든다. 호스트OS의 커널을 공유하여 사용하고, 컨테이너 안에는 어플리케이션을 실행하는 데 필요한 코드만 존재하여 오버헤드가 적고 가상머신보다 성능이 좋다.
- Docker는 이 Container Engine 기술 중 가장 주목받는 기술로 2013년 등장했다.
- Kubernetes Deployment
- Container Orchestration
- 여러 컨테이너들의 배포를 관리한다.
실습 환경
- Docker for Desktop 설치 (docker, docker-compose)
Docker for Desktop 설치하기
도커는 리눅스 컨테이너를 관리하는 기술로, 기본적으로 macOS / Windows에서 네이티브로 사용할 수 없다.
도커의 기능을 완전하게 사용하려면 리눅스에서 사용하는 것이 바람직하다.
도커 데스크탑은 macOS / Windows에서 도커를 사용할 수 있도록 해주는 추가적인 경량 가상화 기술을 사용한 일종의 플랫폼으로, docker와 docker-compose를 포함하며 데스크탑 GUI를 제공한다.
brew intall --cask docker
참고: https://docs.docker.com/desktop/install/mac-install/
도커 구성 요소
- Docker Client
- 도커 명령어가 client 역할을 수행한다고 보면 된다.
- Docker Host
- Docker engine (Docker daemon)
- Containers, Images 관리
- 이미지는 직접 build 하거나, remote에서
pull
명령어로 가져온다.
- Docker engine (Docker daemon)
- Registry
- remote 이미지 저장소
도커 이미지와 컨테이너
이미지와 컨테이너는 1:N 관계이다.
Docker File — (build) —> Docker Image — (run) —> Docker Container
이미지 Image
- 컨테이너를 생성할 때 필요한 요소
- 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어 있다.
- 여러 개의 계층으로 된 바이너리 파일로 존재한다.
- Dockerfile을 이용해 build를 수행하면 이미지가 생성된다.
- 이름 구성: [Repository Name]/[Image Name]:[Image Tag]
- 이미지 pull / push 시에 저장소 이름을 생략하면 기본 저장소인 도커 허브로 인식한다. 태그를 생략하면 latest로 인식한다.
컨테이너 Container
- 호스트와 다른 컨테이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스
- 이미지는 읽기 전용으로 사용하여 변경 사항은 컨테이너 계층에 저장된다. (컨테이너에서 무엇을 하든지 이미지는 영향을 받지 않는다.)
- 이미지에 대해 run을 실행하면 컨테이너가 생성된다.
이미지 저장소 Image Repository
- 도커 이미지를 관리하고 공유하기 위한 서버 어플리케이션
- QUAY, DockerHub, AWS ECR, Docker Registry
도커 컨테이너 라이프 사이클
컨테이너 시작하기
- 컨테이너 생성
docker create [image]
- 컨테이너 시작
docker start [container]
- 컨테이너 생성 및 시작
docker run [image]
이미지가 없을 경우에는 자동으로 pull을 먼저 수행하여 이미지를 다운 받는다.
컨테이너 시작 (docker run 명령어) 주요 옵션
-i
: 호스트의 표준 입력을 컨테이너와 연결 (interactive)-t
: TTY 할당--rm
: 컨테이너 실행 종료 후 자동 삭제-d
: 백그라운드 모드로 실행 (detached)--name hello-world
: 컨테이너 이름 지정-p 80:80
: 호스트 - 컨테이너 간의 포트 바인딩-v /opt/example:/example
: 호스트 - 컨테이너 간의 볼륨 바인딩- 마지막에 입력하는 명령어는 컨테이너 내에서 실행되는 명령어를 가리킨다.
컨테이너 종료하기
- 컨테이너 종료 (SIGTERM 시그널 전달)
- gracefully shut down
docker stop [container]
- 모든 컨테이너 종료
docker stop $(docker ps -a -q)
- 컨테이너 강제 종료 (SIGKILL 시그널 전달)
docker kill [container]
컨테이너 삭제하기
- 컨테이너 삭제 (실행 중인 컨테이너는 삭제 불가)
docker rm [container]
- 컨테이너 강제 실행 종료 후 삭제 (SIGKILL 시그널 전달)
docker rm -f [container]
- 컨테이너 실행 종료 후 자동 삭제 (실행 명령어)
docker run --rm ...
- 중지된 모든 컨테이너 삭제
docker container prune
도커 컨테이너 관리 - EntryPoint와 Command
컨테이너 명령어: [EntryPoint][Command]
엔트리 포인트
도커 컨테이너가 실행될 때 고정적으로 수행되는 스크립트 또는 명령어
생략 가능하며, 생략될 경우에는 커맨드에 지정된 명령어만 수행된다.
커맨드
도커 컨테이너가 실행될 때 수행되는 명령어 또는 엔트리 포인트에 지정된 명령어에 대한 인자값
Dockerfile의 엔트리 포인트와 커맨드
FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
ENTRYPOINT ["docker-entrypoint.sh"] #옵셔널
CMD ["node"] #필수
도커 명령어의 엔트리 포인트와 커맨드
이미지에 지정된 엔트리 포인트와 커맨드를 덮어쓸 수 있다.
docker run --entrypoint sh ubuntu:focal
docker run --entrypoint echo ubuntu:focal hello world
위 명령어에서 ubuntu:focal의 기본 엔트리 포인트는 bash를 실행시키는 것인데, sh가 실행되도록 / echo가 실행되도록 변경했다.
도커 컨테이너 관리 - 환경변수
도커 컨테이너를 실행할 때 환경변수를 주입할 수 있다.
1. --env, -e 옵션 사용
docker run -i -t -e MY_TEXT=helloworld ubuntu:focal bash
2. --env-file 옵션 사용
# my.env
MY_TEXT=helloworld
docker run -i -t --env-file ./my.env ubuntu:focal bash
도커 컨테이너 관리 - 명령어 실행
docker exec
실행 중인 컨테이너에 명령어를 실행한다. 이슈 해결 시 빈번하게 사용되는 명령어.
docker exec [container] [command]
# my-nginx 컨테이너에 bash 셸로 접속하기
docker exec -i -t my-nginx bash
# my-nginx 컨테이너에 환경변수 확인하기
docker exec my-nginx env
도커 컨테이너 관리 - 네트워크
...
기본 명령어
- 도커 버전 확인하기
docker -v
- 실행 중인 컨테이너 목록 확인하기
- -a: 전체 컨테이너 목록 확인하기
docker ps
- 이미지 / 컨테이너의 정보 확인하기
docker inspect [id]
'DevOps' 카테고리의 다른 글
Kubernetes 기초 끝내기 🙊 (0) | 2023.03.01 |
---|---|
[간단실습] AWS 네트워크 설정하기 (VPC, Subnet 등) (0) | 2022.08.06 |
AWS VPC 기본 개념 (0) | 2022.07.18 |
네트워킹의 기본 - IP 주소 (0) | 2022.07.16 |
AWS 계정 MFA 활성화하여 보안 강화하기 (0) | 2022.07.07 |