Concepts
애플리케이션의 개발, 배포, 실행을 컨테이너를 통해 가능하게 해주는 플랫폼.
컨테이너란 개념은 새로운 것이 아니며, 이전과 달리 새로운 것은 어플리케이션을 쉽게 컨테이너를 통해서 배포하게 해줌.
Container? Image?
컨테이너는 실행되고 있는 이미지에 의해 launch 된다.
Image
런타임, 라이브러리, 환경 변수, 설정 등 즉 어플리케이션을 실행하기 위한 모든 것을 포함하는 실행 가능한 패키지
Container
실제로 이미지 위에서 실행되고 있는 런타임 인스턴스
Container VS VM
VM의 경우 각각 자신만의 OS를 갖고있음
컨테이너는 기존의 OS 위에서 구동됨
Dockerfile?
Container의 환경을 정의하는 파일
# syntax=docker/dockerfile:1
FROM python:3.7-alpine # 설치할 이미지
WORKDIR /code # 작업 디렉토리 설정
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt # 컨테이너 종속성 설치
EXPOSE 5000 # 외부 호스트와 컨테이너를 노출 시킬 포트 설정
COPY . . # 현재 디렉토리의 모든 파일을 애플리케이션 이미지로 복사
CMD ["flask", "run"]# 컨테이너 실행시 커맨드 입력
*AWS ec2에 배포할 경우, Inbound EXPOSE한 포트 번호의 규칙을 추가해야 할 수 있음
관련 명령어
docker 이미지 실행
docker run -p {외부 연결 요청 포트}:{연결할 이미지 포트} {image name}
docker container ls 컨테이너 목록
docker container stop {컨테이너 id}
docker push {username}/{repository}:{tag} remote 레포지토리에 배포
자세한 내용
https://docs.docker.com/engine/reference/commandline/cli/
Services
어플리케이션을 구성하는 조각들로 봄
ex) 비디오 공유 사이트의 경우 애플리케이션을 저장하는 db 컨테이너, 프론트엔드 컨테이너, 비디오 트랜스코딩하는 컨테이너 등등등이 필요함
여러 컨테이너가 하나의 서비스를 위해 정의를 하게됨
docker-compose.yml
services:
web:
build: . # 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드
ports:
- "8000:5000" # 외부 호스트에서 8000번 포트로 들어오면 내부 컨테이너 포트 5000번으로 연결
redis:
image: "redis:alpine" # Redis의 alpine 버전 이미지를 사용, 이미지는 docker hub에서 가져옴
Docker swarm
node(물리적인 또는 가상 머신)들의 집합인데, docker 클러스터 관리와 orchestration 기능들을 제공함
docekr-compose 파일에 설정
Docker는 하나의 호스트 또는 swarm 모드에서 실행 가능함
관련 명령어
docker swarm init # swarm 모드 클러스터가 생성
docker swarm join --token {token} {ip:port} # 머신이 스웜 클러스터에 조인되어 클러스터의 일부가 됨,이 때 머신의 포트 오픈 필요
docker node ls # 현재 swarm 클러스터에 속한 모든 노드의 목록을 확인
docker swarm leave # 해당 노드가 클러스터에서 제거
하나의 물리적 머신이 5개의 컨테이너만 돌릴 수 있을때,
100개의 컨테이너를 돌리고 싶으면 여러 머신에서 Docker Swarm을 사용하여
하나의 호스트를 사용하는 것 처럼 그룹화 하고 자동으로 부하 관리를 함 (Orchestration)
Docker Stack
여러 개의 서비스가 각각 연관되어 실행되도록 함
swarm이 머신 단위라면 stack은 서비스 단위
docker-compose.yml 파일로 설정
docker stack deploy -c docker-compose.yml {서비스이름} 서비스에 이름 부여
관련 명령어
docker service ls # 실행중인 서비스 목록 확인
docker service ps {서비스 이름} # 각 태스크의 상태, 할당된 노드, 현재 상태 등을 표시
docker stack ps {서비스 이름} # Docker 스택 내에서 실행 중인 특정 서비스의 태스크 목록을 확인
docker stack rm {서비스 이름} # Docker 스택 내에서 실행 중인 서비스와 관련된 모든 컨테이너와 리소스를 제거
docker swarm leave --force # swarm 모드 종료
docker compose
Docker 애플리케이션의 여러 컨테이너를 정의하고 구동시키기 위한 툴
사용을 위한 과정
1. 애플리케이션 환경 설정 (Dockerfile)
2. docker-compose.yml로 서비스 설정
3. docker-compose 실행
서비스 실행 명령어
docker compose up
Bind mount를 위한 docker-compose.yml 수정
services:
web:
build: .
ports:
- "8000:5000"
volumes: # 추가된 부분
- .:/code
environment: #추가된 부분
FLASK_DEBUG: "true"
redis:
image: "redis:alpine"
volumes: 해당 디렉토리에 mount하여 이미지를 다시 빌드하지 않아도 코드를 실시간으로 수정 가능하게 함
environment: 위 코드의 경우 flask의 debug 모드로 Dockerfile에서 CMD를 실행
참고 자료
https://docs.docker.com/compose/gettingstarted/
https://codeblog.dotsandbrackets.com/docker-stack/
'Development > Tip' 카테고리의 다른 글
인스타그램이 오직 3명의 엔지니어로 1400만 사용자를 확보한 방법 (0) | 2023.09.19 |
---|---|
무엇이 개발자를 생산적으로 만드는가 (0) | 2023.09.14 |
[특강] 기술 전환점에서의 오픈소스와 개발자 - 래블업 신정규 대표님 (0) | 2023.05.16 |
[특강]개발자는 코딩하는 사람이 아니다 (0) | 2023.05.13 |
[무료]Launcher - 아이폰 잠금화면에 인스타그램 넣는법 (0) | 2023.04.11 |