Docker란?
- 개념
- 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트
- 컨테이너
- 경량의 독립적인 소프트웨어 실행 패키지를 일컫는 말. 어플리케이션을 구동하기 위해 필요한 요소들을 담고있다.
- 호스트 OS와는 독립된 환경에서 동작한다.
- 컨테이너
- 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트
- vs Virtual Machine
- VM이 각자의 완전한 OS를 갖는 반면 컨테이너는 host OS를 공유한다.
- 컨테이너도 자신만의 OS가 존재한다.
- 하지만 필요한 요소를 다 갖춘 OS는 아니다.(ex. Alpine Linux)
- 도커 이미지에 있는 것들만 구동하기 위한 최소한의 OS
- vs Virtual Machine
Docker compose
- 개념
- 멀티 컨테이너 도커 앱들을 정의하고 구동하는 도구
docker compose
로 사용- 다음의 순서로 진행된다.
- Dockfile 정의
docker-compose.yml
작성docker compose up
수행
- 종류
docker compose up
docker-compose.yml
파일에 정의된 컨테이너를 생성하고 구동시킨다.docker run
이 하나의 컨테이너를 생성하는데 사용되는 반면 다중 컨테이너에 주로 사용된다.
- 컨테이너가 build되지 않았다면 먼저 build를 진행해준다.
- 컨테이너 빌드 : Dockerfile로부터 Docker image를 생성하는 과정.
- 컨테이너 생성 : 이미지의 새 인스턴스를 만드는 과정. 도커는 이미지를 새롭게 인스턴스화 해서 새 컨테이서에서 실행시킨다.
docker compose down
up
으로 생성된 컨테이너를 중지하고 제거한다.- 컨테이너를 위해 만들어진 네트워크와 볼륨들도 함께 제거해준다.
docker compose stop
- 현재 동작중인 컨테이너를 제거하지 않고 중단만 시킨다.
docker compose start
stop
으로 중단된 컨테이너를 다시 시작시킨다.
docker compose restart
- 현재 동작중인 컨테이너를 재시작한다.
stop
입력 후start
를 입력한 것과 동일
docker-compose와의 차이
- 기존에 Python으로 진행되던 v1 버전의 레포지토리에서 사용하던 명령어가
docker-compose
이다. - Go로 마이그레이션한 v2에서는 명령어가
docker compose
로 변경되었다. - 현재 v1의
docker-compose
는 deprecated 되었다.
Dockerfile
- 개념
- Docker image를 빌드하기 위한 설명서를 담은 스크립트
- 베이스 이미지, 포함할 애플리케이션 코드, 의존성, 세부 설정 등을 담고있다.
- 레이어 별로 나눠서 자주 쓰는 순서대로 작성한다.
- 작성 순서
- 기반 이미지(base image)를 선택한다. (
FROM
) - 이미지의 메타 데이터를 정의한다. (
LABEL
) - 의존성(dependency)을 설치한다. (
RUN
) - 어플리케이션 코드를 복사한다.(
COPY
) - 포트를 expose한다.(
EXPOSE
)- 컨테이너가 해당 포트를 listen한다는 것을 의미
- 컨테이너의 entrypoint를 정의한다.(
ENTRYPOINT
)- entrypoint : 컨테이너가 이미지로부터 시작되자마자 처음 실행될 명령어
- 기반 이미지(base image)를 선택한다. (
예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# Choose a base image FROM node:14-alpine # Define image metadata LABEL maintainer="yourname" LABEL version="1.0" LABEL description="My Node.js application" # Install dependencies RUN apk add --no-cache git WORKDIR /app COPY package*.json ./ RUN npm install # Copy application code COPY . . # Expose port EXPOSE 3000 # Define container entrypoint CMD ["npm", "start"]
Docker network
- 개념
- 컨테이너가 다른 컨테이너나 다른 네트워크 또는 호스트 시스템과 소통을 가능하게 해주는 가상 네트워크
- 특징
- 기본적으로 각 컨테이너는 브릿지 네트워크로 연결되어 있다.
- 이를 통해 컨테이너 사이에 독립적이로 안전한 통신 채널을 만들 수 있다.
- 복잡하고 초소형인 서비스의 아키텍처를 구성할 때 유용하다.
- 종류
- bridge
- 호스트에 private 네트워크를 만든다.
- 각 컨테이너들이 IP 주소를 사용해 서로 소통한다.
- 컨테이너와 외부 네트워크의 연결은 간접적으로만 가능하다.
- host
- 컨테이너 자체적인 네트워크 스택을 갖는 것이 아닌, 호스트의 네트워크 스택을 이용한다.
- 네트워크 스택 : 네트워킹을 가능하게 해주는 프로토콜, 소프트웨어, 유틸리티를 통틀어 부르는 말.
- 컨테이너는 호스트의 어느 포트로든 바인드할 수 있다.
- 호스트의 IP 주로를 사용해 컨테이너에 접속할 수도 있다.
- 컨테이너 자체적인 네트워크 스택을 갖는 것이 아닌, 호스트의 네트워크 스택을 이용한다.
- overlay
- macvlan
- 컨테이너가 고유한 MAC 주소를 갖게 한다.
- ipvlan
- none
- 네트워크 접근이 불가능한 컨테이너를 생성한다.
- 네트워크로부터 고립된 컨테이너를 만들 때 유용하다.
- bridge
Service
- 개념
- 동일한 작업을 수행하는 컨테이너 그룹을 일컫는 말
- 여러 컨테이너의 배포와 관리를 조정(orchestrate)하는 것을 추상화한 것.
컨테이너 오케스트레이션 (Container Orchestration)
- 개념
- 컨테이너의 배포, 스케일링, 관리, 네트워킹을 자동화하는 과정
- 대규모 컨테이너화된 어플리케이션을 의 관리와 배포를 단순화해준다.
- 이를 통해 복잡성을 줄이고 확장성을 개선하며 가용성과 안정성을 높인다.
- 관련 플랫폼
도커 스웜(Docker Swarm)
- 도커 컨테이너 토종(native)의 클러스터링 및 스케줄링 도구
- 스웜(swarm, 도커 노드들의 묶음)을 만들고 관리할 수 있도록 해준다.
- 설치와 사용이 간단하다.
쿠버네티스(Kubernetes)
- 구글에서 개발한 오픈 소스 툴이다.
- 복잡하지만 강력하고 유연하다.
차이점 (주로 Kubernetes가 추가적인 기능을 제공)
- 아키텍처
- Swarm : 도커 엔진으로 만들어짐.
- Kubernetes : master 노드, worker 노드로 이루어진 더욱 복잡한 아키텍처를 가짐.
- 클러스터 관리
- Swarm : 소규모 어플리케이션을 구성하고 관리하는 것이 쉽다.
- Kubernetes : 대규모의 복잡한 어플리케이션에 잘맞는다. 고급 기능을 제공한다.
- 스케일링(scaling)
- 둘 모두 서비스의 automatic 스케일링을 제공한다.
- Kubernetes에만 있는 기능 : horizontal scaling, individual contatiners
- 네트워킹
- Kubernetes에만 있는 기능 : 멀티 네트워크 공급자, 고급 네트워크 정책
- 스토리지
- Kubernetes에만 있는 기능 : 멀티 스터리지 백엔드, 스토리지 리소스의 동적 프로비저닝
- 프로비저닝(provisioning) : 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것
- Kubernetes에만 있는 기능 : 멀티 스터리지 백엔드, 스토리지 리소스의 동적 프로비저닝
- 서비스 디스커버리 (service discovery, 서비스를 구성하는 개별 인스턴스를 찾는 프로세스)
- Kubernetes에만 있는 기능 : DNS-기반 서비스 디스커버리, DNS-기반 로드 밸런싱
- 어플리케이션 배포
- Kubernetes에만 있는 기능 : blue-green 배포, canary 배포
- 아키텍처
Bind mount vs Volume
도커에서 컨테이너의 수명을 넘어서까지 데이터를 유지하기 위해 사용하는 방법
Bind mount
- 개념
- 호스트 머신의 파일 또는 디렉토리가 컨테이너에 마운트되는 방식
- 마운트 : 저장 장치에 접근할 수 있는 경로를 디렉터리 구조에 편입시키는 작업
- 호스트 머신의 파일 또는 디렉토리가 컨테이너에 마운트되는 방식
- 특징
- 데이터가 호스트 머신에 존재하며 런타임에 컨테이너에 마운트된다.
- 컨테이너 내의 데이터가 변경되면 호스트 머신의 데이터 또한 변경된다.(반대도 마찬가지)
- 컨테이너를 실행할 때
-v
나--mount
옵션을 통해 생성한다.
Volume
- 개념
- 도커에 의해 생성되고 유지되는 파일 시스템.
- 특징
- 컨테이너 간에 데이터를 유지하기 위해 사용되며 호스트 머신의 파일시스템과는 독립되어있다.
- 볼륨 내에서의 변경이 호스트 머신에 반영되지는 않는다. (반대도 마찬가지)
docker volume create
을 통해 생성되며-v
또는--mount
옵션을 사용하여 컨테이너에 마운트할 수 있다.- 주로
/var/lib/docker/volumes
에 위치한다.- 이 위치는 Docker에 의해 관리되고 추상화된다.
- 호스트 시스템이나 사용자의 직접적인 접근 불가
- 장점
- 볼륨을 컨테이너와 독립적으로 관리할 수 있다.
- 컨테이너 간 데이터를 공유 가능
- 데이터 백업 및 복원 가능
- 컨테이너를 다른 호스트로 마이그레이션 가능
- 대규모로 배포시에 성능과 확장성 면에서 우수하다.
- 도커의 스토리지 드라이버로 관리할 수 있기 때문
- 볼륨을 컨테이너와 독립적으로 관리할 수 있다.
Docker 실습
Image 생성
컨테이너 이미지 생성 (-f : 사용할 도커파일, -t : 생성할 이미지파일명)
1
docker build -f Dockerfile -t <Image name> .
생성한 이미지를 확인
1
docker images
Container 실행
컨테이너 실행
1
docker run -d -p 8080:8080 <Image name>
컨테이너 목록 확인
1
docker ps
로컬에서 8080 포트로 접속.
컨테이너의 로그 확인 가능 (터미널에 로그 출력)
1
docker logs <Container ID>
컨테이너의 셸인 sh를 실행
1
docker exec -it <Container ID> sh
-i
(interactive) : 컨테이너와 detach된 이후에도 상호작용할 수 있도록 STDIN을 계속 열어준다.-t
(pseudo-tty) : pseuto-TTY를 할당하여 터미널을 통해 컨테이너와 상호작용할 수 있게 해줌.컨테이너의 bash에서 다음 명령어 입력하여 패키지 검색(alpine 기준)
1
apk search <package name>
Container 삭제
컨테이너 목록 확인 (stop 된 컨테이너도 확인가능)
1
docker ps -a
컨테이너 중지
1
docker stop <Container ID>
컨테이너 삭제
1
docker rm <Container ID>
이미지 삭제
1
docker rmi <Image ID>
Ref.
- contents
- images