1. 도커의 필요성
- 한 운영체제에서 어플리케이션을 실행하기 위해서는 여러 기반 소프트웨어들을 설치해야한다. 예컨대, Node.js, DB 등 말이다.
- 이 떄, 기반 소프트웨어들(실행 환경)은 운영체제마다 실행되는 맥락이 달라, 설치하는 데 번거로움이 존재할 수 있다.
- 도커는 다른 OS를 가진 호스트(어플리케이션을 실행할 머신)들 간에 실행 환경을 편리하게 설치하고 사용하기 위한 니즈에서 탄생한 서비스다.
- 요약해서, 도커는 어플리케이션을 실행하는 데 필요한 모든 실행환경을 하나의 묶음, 패키지로 묶을 수 있는 서비스이다.
- 도커를 통해, 여러 OS에 어플리케이션을 안정적으로 배포하고 실행할 수 있는 이득을 취할 수 있다.
2. 기반
- 컨테이너 기술은 근본적으로 리눅스 운영체제의 기술이다.
- 도커는 그런 컨테이너 기술에 기반한 것이다.
- 컨테이너 기술과 유사한 것은 VM(가상 머신)을 이용해서, OS 위에 개별적인 OS를 설치하는 것인데, 이것은 host에 많은 메모리 부담을 안겨준다.
- 도커는 그런 VM을 경량화한 서비스라고 볼 수 있다. VM에서 각 환경마다 OS를 설치하는 것과 달리, 도커는 컨테이너 엔진을 통해 host의 OS에 접근함으로써, 해당 OS 위에서 어플리케이션의 실행 환경이 안정적으로 동작할 수 있도록 한다.
* 생활 코딩의 도커 설명
- 컨테이너 기술을 이용하려면, 리눅스 운영체제가 필요한데, 도커는 리눅스 OS가 아닌 다른 OS에서도 사용할 수 있다. 왜냐하면, 도커가 자체적으로 가상머신을 생성하고, 그 안에 리눅스 OS를 설치해주기 때문이다.
- 이에, 다른 OS에서 도커를 사용하는 것은 다른 OS에서 가상머신과 리눅스 OS를 사용하는 것이기 떄문에, 속도에서 손해가 발생하는 행위이다. 그럼에도 불구하고, 도커는 여러 방면에서 편리하기 떄문에, 도커가 많이 사용된다.
3. 도커의 주요 개념
- 어플리케이션을 실행하기 위해 필요한 모든 실행 환경을 패키징한 것을 "컨테이너"라고 한다.
- 도커를 이용한 어플리케이션 실행은 이 컨테이너를 배포 받아서 실행하는 것이다.
- 컨테이너를 생성하기 위해서는 도커파일과 이미지가 필요하다.
1) 도커 파일
- 도커 파일은 컨테이너를 생성하기 위해 필요한 제반사항들, 명령어들의 모음이라고 할 수 있다.
- 도커 파일에는 다음과 같은 내용들이 포함된다.
- 이미지는 도커 파일을 통해서 생성된다.
1. 컨테이너에 포함되어야 하는 모든 파일
2. npm과 같은 외부 라이브러리 의존성 주입
3. 환경 변수에 대한 설정
4. 어플리케이션 실행을 위한 스크립트
2) 이미지
- 도커 파일을 통해 생성된 것으로 어플리케이션이 안정적으로 실행되기 위한 실행환경을 담은 것이라 할 수 있다.
- 이 때, 이미지는 불변의 상태를 가지고 있다.
- 컨테이너는 이 이미지를 이용해서 어플리케이션을 실행한다.
- 하나의 이미지는 여러 컨테이너를 가질 수 있다.
3) 컨테이너
- 어플리케이션 실행에 필요한 환경요소들을 담은 이미지를 독립적인 환경에 패키징한 것이다.
- 어플리케이션의 실행은 컨테이너를 실행하는 것과 같다.
- 실행된 컨테이너는 가상의 컴퓨터 하나에서 어플리케이션을 실행한 것과 동일하다. 즉, 컨테이너는 host와 독립적인 port를 가진다.
- 컨테이너 내에서 실행할 이미지에 대한 포트는 이미지 생성 시 지정해줄 수 있다.
- 컨테이너는 개별적으로 수정이 가능하다.
- 요컨대, 이미지는 class, 컨테이너는 이미지에 기반을 둔 instance라고 비유할 수 있겠다.
4. 도커 실습
1) 도커 파일 생성
- 이미지를 생성하기 위한 기반인 도커 파일은 다음과 같이 루트 경로에 생성한다.
- 아래 예시는 nestjs를 기준으로 작성했다.
# 이미지를 구성할 기본 환경 이미지
FROM node:16-alpine
# 컨테이너에 폴더 생성
WORKDIR /app
# 현재 소스코드에서 특정 파일을 컨테이너 디렉토리에 복사
COPY . ./
# 명령어 실행
RUN npm ci
RUN npm run build
# 도커 컨테이너에서 실행할 최종 명령어
ENTRYPOINT [ "node", "dist/main.js" ]
# 이미지를 실행할 컨테이너 내 포트 설정
EXPOSE 3000
2) 도커 이미지 생성
- 도커 이미지 생성은 터미널에서 명령어로 실행한다. 명령어는 다음과 같다.
# 도커 파일을 바탕으로 이미지 생성
docker build -f <dockerfile 명> -t <이미지 레포지토리 이름> .
# 이미지 확인
docker images
# 이미지 태그 및 레포지토리 변경
docker tag <기존 레포지토리명>:<기존태그명> <변경할 레포지토리명>:<변경할 태그명>
# 이미지 삭제
docker rmi <이미지 이름>
3) 이미지를 컨테이너로 실행
- 도커 컨테이너 실행은 다음 명령어로 실행한다.
# 이미지를 컨테이너로 실행
docker run -d -p 8080:8080 <이미지 태그명>
파라미터 설명
- d: 이미지를 컨테이너의 백그라운드에서 실행
- p: 컨테이너에서 어플리케이션이 실행중인 port와 host의 port를 연결
- name: 실행할 컨테이너에 별칭 부여
# 실행 중인 컨테이너 확인
docker ps
파라미터 설명
-a : 현재 도커에 있는 모든 컨테이너 조회(종료된 것도)
# 컨테이너 종료
docker stop <컨테이너 ID/이름>
# 컨테이너 재실행
docker start <컨테이너 ID/이름>
# 컨테이너 로그 실행
docker logs -f(지속 실행) <컨테이너 ID/이름>
# 컨테이너 삭제
docker rm <컨테이너 ID/이름>
# 컨테이너 내부 CLI에서 명령어 실행
docker exec <컨테이너 ID/이름> <cli에서 실행하고픈 명령어>
# 컨테이너 내부 CLI에 지속적으로 접속
docker exec -it <컨테이너 ID/이름> /bin/sh (shell 이용을 의미/ bash를 쓸 수도 있음)
# host의 파일 시스템과 컨테이너의 파일 시스템 연결
docker run -v <연결시킬 host의 파일시스템 경로> <이미지 이름/태그>
5. 참고자료
https://docs.docker.com/reference/
'Docker' 카테고리의 다른 글
Docker compose (0) | 2023.04.06 |
---|