Product Serving : Docker
가상화
- 개발 환경에서는 서버에 직접 들어가서 개발을 하지 않음
- local개발 $\rightarrow$ staging 서버 $\rightarrow$ production 서버 배포 과정을 거침
- local 환경과 production 서버 환경이 다른 경우 배포시 제대로 동작하지 않을 수도 있음
- 실제 환경에서는 운영하는 서버가 1대가 아니라 수십, 수백대인 경우도 존재
- 서버 환경 자체를 소프트웨어화하는 방법을 위해 가상화환경이 등장
Virtual Machine
- docker 이전에는 가상화 환경으로는 주로 VM(Virtual Machine)을 활용
- 기본적인 원리가 Host OS 위에 Virtual OS를 구동시키는 방식이라 리소스 소모도 크고 성능 자체를 완전하게 발휘하기 어려움
- 로컬에서 VM을 동작하는 것이 부담되므로 AWS, GCP와 같은 클라우드 컴퓨팅 기반의 원격 서버가 등장
- 하지만 기본적으로 VM은 리소스 소모가 많기 때문에 이를 해결하고자 container 기술이 등장하고 이를 기반하여 docker가 개발됨
Docker
- container 기술을 기반에 둔 오픈소스 프로그램
- Docker image를 활용하여 동일한 환경을 공유할 수 있음
Docker 원리
- 도커는 Docker file $\rightarrow$ Docker Image $\rightarrow$ Docker Contatiner 순서로 동작함
- Docker Image
- 컨테이너를 실행할 때 사용할 수 있는 템플릿
- 여러가지 setting을 설치한 일종의 set
- Read Only
- Docker Container
- Docker Image를 활용해 실행된 인스턴스
- Write 가능
- 서버 실행 방식은 docker hub, GCR, ECR 등 Container Registry에 도커 이미지를 업로드하고 서버에서 받아서 실행하는 방식
Docker 설치
- Docker Install에 접속해서 설치가 가능
1
docker
실행시 커맨드가 정상적으로 동작하면 설치완료
docker 실행하기
1
docker pull [image info]
pull 명령어를 사용하면 docker 이미지를 다운받을 수 있습니다. 보통 docker desktop을 쓰는 경우라면 실행해주시고 명령어를 실행하셔야 합니다. pull
을 통해 이미지가 다운되었으면 아래처럼 이미지가 등록된 것을 볼 수 있습니다.
1
docker images
위 명령어를 실행해도 다운받아진 이미지들 목록을 확인할 수 있습니다.
1
docker run --name [container name] -e [environment] -d -p [local port:container port] image
docker run을 통해 도커를 실행하면 해당 환경이 실행이 됩니다. 여러가지 옵션을 넣어서 실행할 수 있는데, -d
는 컨테이너의 실행을 백그라운드로 실행하는 것을 의미합니다. 그렇다면 실행된 환경을 확인해봐야겠죠?
1
docker exec -it [container name/ID] /bin/bash
실행중인 container에 진입하려면 exec
명령어를 사용하면 됩니다. 다른 AWS나 GCP에 접속하는 방식이랑 유사합니다.
docker image 만들고 배포
docker image를 만드는 연습을 하고자 간단한 FastAPI
코드를 활용한 도커 이미지 생성 해보겠습니다. 우선 특정 폴더를 만들고 터미널에서 아래의 virtual environment를 설정해줍니다.
1
2
3
4
python -m venv .venv
source ./venv/bin/activate
pip install pip --upgrade
pip install "fastapi[all]"
그 후 간단한 API를 작성해봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pip import main
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/hello")
def hello():
return {
"message": "This is hello world!"
}
if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=8001)
localhost:8001/hello로 접속하면 This is hello world
를 json 형태로 전달해주는 간단한 코드입니다. 동일한 파이썬 라이브러리 세팅을 위해 터미널에서 pip freeze > requirements.txt
를 입력해서 파일로 저장해줍시다. 그 후 Dockerfile
을 만들어서 docker 세팅을 해줍시다. 파일이름을 Dockerfile
로 하면 자동적으로 인식을 해줍니다.
1
2
3
4
5
6
7
8
9
10
11
FROM python:3.8.7-slim-buster
COPY . /app
WORKDIR /app
ENV PYTHONPATH=/app
ENV PYTHONUNBUFFERED=1
RUN pip install pip==21.2.4 && \
pip install -r requirements.txt
CMD ["python", "main.py"]
이렇게 도커 이미지를 만들고 터미널에서 아래처럼 입력해주면 도커 이미지가 만들어집니다.
1
docker build . -t [image name:tag]
.
은 Dockerfile
이 위치한 경로를 지정해주면 되는데, 보통 같은 폴더내에서 동작하기도 하고, 이름도 Dockerfile
로 많이 짓다보니 .
을 많이 적습니다.
이렇게 하면 도커 이미지가 생성되고 앞서 수행한 방법처럼 이미지를 빌드하면 동일하게 수행이 가능합니다!
Comments powered by Disqus.