오늘도 개발

도커(Docker) 본문

웹 프로그래밍/웹의 이해

도커(Docker)

Sueeeeeee 2022. 8. 9. 11:46

가상화란?

한 컴퓨터를 여러 개의 컴퓨터처럼 쓰는 것.

한 컴퓨터에 가상의 os를 추가해서 사용하거나(Hyperivsor 가상화),

한 컴퓨터에 가상의 작업 공간을 추가해서 사용하는 것(Container 가상화)

 

가상화를 사용하는 이유는?

컴퓨터를 효율적으로 사용하기 위해서이다.

컴퓨터 성능도 좋은데 컴퓨터 한 대에 한 가지 일만 시키면 아깝다.

 

또 개발 환경이 바뀔 때마다 컴퓨터를 살 필요가 없기 때문에 비용을 절약할 수 있다.

예를 들면 윈도우 컴퓨터를 쓰는 작업자가 리눅스에서 배포를 해야 한다고 가정했을 때,

가상화 기술이 있기 때문에 리눅스 컴퓨터를 살 필요가 없다.

 

Hypervisor 가상화 VS Container 가상화

Hypervisor 가상화

한 컴퓨터에서 여러 os를 사용하는 것.

호스트 os 위에 게스트 os를 띄우는 방식.

 

맥 os에서 vscode를 사용하듯,

맥os가 켜져 있는 상태에서 다른 os를 사용할 수 있다.

 

예) 하이퍼바이저

출처 - 위코드 도커 세션

컨테이너 가상화

게스트 os에서 필요한 것만 가져와서 호스트 os에서 실행하는 방식.

예를 들면 맥 os에서 리눅스 전체를 사용하는 것이 아니라,

리눅스에서 필요한 앱만 가져와서 가상화하는 것.

 

컨테이너 가상화는 일반 가상화보다 가볍다.

일반 가상화는 전체 os를 가져오는 반면, 컨테이너 가상화는 필요한 것만 가져오기 때문이다.

 

컨테이너 가상화를 사용하면 어느 컴퓨터를 사용하든 항상 같은 환경에서

빠르고 안정적이게 개발하고 배포할 수 있다.

 

하지만 hypervisor 가상화와 달리 OS를 완전히 가져오는 것은 아니기 때문에

호스트와 게스트 OS가 너무 다르면 가상화할 수 없다.

(예를 들어 호스트가 리눅스인데 Windows OS를 가상화할 수는 없다.) 

출처 - 위코드 도커 세션



Docker란?

컨테이너 가상화 기술이자 회사명.

보통 리눅스로 서버를 배포할 때 사용한다.

 

개념

- 도커 : 가상환경을 실행해주는 도구

- 도커 이미지 : 가상환경 생성에 필요한 재료 + 가상환경에서 실행할 것

- 컨테이너 : 가상환경 

- 기본 저장소(Docker Registry) : 도커 이미지를 저장하는 곳

 

도커는 가상환경(=컨테이너)를 실행해주는 도구이다.

도커에 도커 이미지를 넣고 컨테이너를 만들면 도커 이미지를 실행할 수 있다.

어떤 컴퓨터이든 도커가 설치되어 있으면 도커 이미지를 넣어 똑같은 컨테이너를 만들 수 있다.

 

도커 이미지는 기본 저장소에 저장할 수 있다.

기본 저장소에 있는 도커 이미지는 나중에 다른 컴퓨터에서 또 쓸 수 있다.

 

또 카세트의 끝부분으로 가면 음악이 종료되는데 도커도 마찬가지이다.

컨테이너는 단일 프로세스로 동작하고, 프로세스가 종료되면 컨테이너도 종료된다.

 

활용 예시

프로젝트를 EC2에서 배포하려면 git clone, git pull, pip로 패키지 설치 등의 과정이 필요하다.

도커를 사용하지 않고 100대의 EC2에 서버를 배포했다고 가정해보자.

만약 배포 이후 코드를 수정하면 100대의 EC2에서 모두 git clone, git pull 등을 해줘야 한다.



도커를 사용하면 git clone, git pull.. 과 같은 과정을 하나로 묶어서 이미지로 만들 수 있다.

그런 다음 EC2에 도커가 설치되었다고 가정하고 바로 이미지를 넣으면 컨테이너가 생성되며 위 과정이 자동 실행된다. 

일일이 100대의 EC2에 git clone, git pull..을 해줄 필요가 없다.

따라서 도커는 자동화에 적합하며 CI/CD(테스트, 배포 자동화)에 유용하다.

 

출처 - 위코드 도커 세션

 

Docker 사용하기

1. 도커 이미지 만들기

이미지 생성에 필요한 스크립트(dockerfile) 작성하기

(gunicorn을 사용할 예정이라면 스크립트 작성 전 requirements.txt에 gunicorn도 넣어야 한다.

안 넣으면 docker run할 때 gunicorn이 없다는 오류가 뜬다.)

# 컨테이너 제작 동시에 컨테이너에서 서버를 켜는 스크립트

# 기반이 될 os 선택
# FROM ubuntu:20.04
FROM python:3 # 파이썬3이 설치된 os를 선택하겠다는 뜻

# 작업 디렉터리(default) 설정
# 명령어가 실행되는 위치 - 즉, 소스코드가 있는 위치(ex. manage.py가 있는 곳)
WORKDIR /Users/sue/Desktop/wecode/nhouse 

# 필요한 패키지 정보 가져오기(현재 설치된 패키지 정보를 도커 이미지에 복사)
COPY requirements.txt

# 패키지 설치
RUN pip install -r requirements.txt

# 현재 경로에 존재하는 모든 소스파일을 이미지에 복사
# 첫번째 점 : 모든 소스파일을 그다음 점에 복사하겠다는 뜻
# 두번째 점 : 작업 디렉터리
COPY . .

# 8000번 포트로 서버 오픈
EXPOSE 8000

# python runserver로 서버 실행하는 경우
# CMD ["python", "manage.py", "runserver", "0:8000"]
# gunicorn 사용해서 서버 실행
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "nhouse.wsgi:application"]

 

2. 스크립트 실행해서 image build하기

- m1인 경우

docker buildx build --platform=linux/amd64 -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path'
# 예 docker buildx build --platform=linux/amd64 -t wecode/wecodeproject:0.1.0 .

- m1이 아닌 경우

docker build -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path'
ex) docker build -t wecode/wecodeproject:0.1.0 .

- 빌드한 도커 이미지 확인하기

docker images

 

3. DockerHub에 docker image push하기

(DockerHub은 docker registry가 있는 곳. Github같은 공간)

1) 도커 로그인하기

docker login

2) 도커 이미지 push하기

docker push <Dockerhub 계정명>/<도커파일명>:<버전>

# 예 : docker push sue/dockerfile:0.1.0

 

4. EC2에 배포하기

1) EC2 접속 후 도커 설치

# EC2 접속
ssh -i second-project.pem ubuntu@EC2ip주소

# get-docker.sh 다운로드
curl -fsSL https://get.docker.com -o get-docker.sh

# 현재 디렉토리에 get-docker.sh 있는지 확인하기
ll

# get-docker.sh 실행해서 도커 설치
sh get-docker.sh

 

2) 도커 이미지 pull(컨테이너 바로 실행하려면 생략 가능)

docker pull <Dockerhub 계정명>/<도커파일명>:<버전>

# 예 : docker pull sue/dockerfile:0.1.0

 

3) 도커 로그인(DockerHub repo가 private인 경우)

docker login

 

3) 도커 컨테이너 실행(만약 pull 안했으면 local에서 이미지 찾아본 뒤 dockerhub에서 찾아봄)

- 일반 실행

docker run --name api -p 8000:8000 <Dockerhub 계정명>/<도커파일명>:<버전>

- 백그라운드 실행(-d 옵션 추가)

docker run --name api -d -p 8000:8000 <Dockerhub 계정명>/<도커파일명>:<버전>

- 실행중인 컨테이너 보기

docker ps
# (실행중인 컨테이너를 보여주는 커맨드) 
    
docker ps -a
# (실행이 종료된 것을 포함해서 모든 컨테이너를 보는 커맨드 및 옵션)
    
docker images
# (생성된 혹은 다운로드 된 이미지를 보여주는 커맨드)
    
docker images -a
# (모든 이미지를 보여주는 커맨드 및 옵션)

- 컨테이너 실행 후 바로 종료되는 경우 : 빌드된 이미지에 문제가 있다는 뜻. 문제 확인해보기

docker run -it <Dockerhub 계정명>/<도커파일명>:<버전> /bin/bash