Docker

Docker

차가운에스프레소 2023. 4. 4. 17:54

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/

 

Reference documentation

 

docs.docker.com

 

'Docker' 카테고리의 다른 글

Docker compose  (0) 2023.04.06