8 minute read

Docker

Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼으로써, 컨테이너라는 표준화된 유닛으로 패키징하여 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는데 모든 것을 포함 할 수 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장 할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.

Docker VM Virtual machine은 Guest OS를 이용해 서버 하드웨어를 가상화 하지만, Docker는 서버 운영 체제를 가상화 한다.

Docker Image

  • 컨테이너를 실행할 때 사용할 수 있는 “템플릿”
  • Read Only

Docker Container

  • Docker Image를 활용해 실행된 인스턴스
  • Write 가능

도커로 할 수 있는 일

  • 다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있음 - 예) MySQL을 Docker로 실행
    • 예) Jupyter Notebook을 Docker로 실행
  • 다른 사람이 만든 소프트웨어 : Docker Image
    • OS, 설정을 포함한 실행 환경
    • Linux, Window, Mac 어디에서나 동일하게 실행할 수 있음
  • 자신만의 이미지를 만들면 다른 사람에게 공유할 수 있음
    • 원격 저장소에 저장하면 어디서나 사용할 수 있음
  • 원격 저장소 : Container Registry
    • 회사에서 서비스를 배포할 때는 원격 저장소에 이미지를 업로드하고, 서버에서 받아서 실행하는 식으로 진행

도커 실습

도커 설치하기

아래의 사이트에서 도커를 운영체제에 맞게 설치 할 수 있다.

도커 설치 사이트

도커 실행하기

도커 설치 후 터미널에서 docker를 입력하여 잘 설치되었는지 확인 할 수 있다. Check Docker

도커에서 MySQL 실행하기

docker pull “이미지 이름:태그”

docker pull mysql:8을 입력하여 mysql 8버전의 이미지를 다운할 수 있다.

아래의 그림처럼 docker mysql image를 다운한다. Check Docker

docker images

다운받은 이미지를 확인 할 수 있다. Docker images

docker run “이미지 이름:태그”

다운받은 도커 이미지를 Docker Container를 만들고 실행한다.

Docker run

  • docker run이란 명령어 도커 Container를 만들고 실행한다.
  • –name mysql-test : 컨테이너 이름을 mysql-test로 지정한다.(default random)
  • -e MYSQL_ROOT_PASSWORD=1234 환경 변수를 설정한다.(비밀번호 설정)
  • -d demon(백그라운드) 모드로 컨테이너를 백그라운드 형태로 실행(쉘이 꺼지면 컨테이너가 삭제되는 것을 방지)
  • -p 포트지정 3306:3306포트로 지정
    • local host(컴퓨터) : 컨테이너(컨테이너 이미지 내부)
  • mysql:8 mysql:8 이미지 뜻함.

docker ps

Docker ps

  • docker ps 명령어로 실행한 컨테이너의 상태를 확인 가능하다.

docker exec -it “컨테이너 이름” /bin/bash

Docker exec

  • MySQL이 실행되고 있는지 확인하기 위해 컨테이너에 진입
  • Compute Engine에서 SSH와 접속하는 것과 유사

mysql -u root -p

Docker mysql

  • 명령어를 입력하고 앞서 설정한 비밀번호를 입력하면 컨테이너 진입 후 mysql 프로세스로 들어간다.

docker ps -a

Docker ps -a

작동이 멈춘 컨테이너를 확인 할 수 있다.

docker rm “컨테이너 이름(ID)”

  • 멈춘 컨테이너를 삭제
  • -f 옵션으로 실행중인 컨테이너도 강제로 삭제 가능.

Docker mysql

위의 명령어로 도커의 실행을 중지하고 삭제 할 수 있다.

도커 기본 명령어 정리

  • docker pull “이미지 이름:태그” : 필요한 이미지 다운
  • docker images :다운받은 이미지 목록 확인
  • docker run “이미지 이름:태그” : 이미지를 기반으로 컨테이너 생성
  • docker ps : 실행중인 컨테이너 목록 확인
  • docker exec -it “컨테이너 이름(ID)” /bin/bash : 컨테이너에 진입
  • docker stop “컨테이너 이름(ID)” : 실행중인 컨테이너를 중지
  • docker rm “컨테이너 이름(ID)” : 중지된 컨테이너 삭제

그외 docker run 할때 파일을 공유하는 방법

  • Volume Mount
    • Docker Container 내부는 특별한 설정이 없으면 컨테이너를 삭제할 때 파일이 사라짐
    • (=Host와 Container와 파일 공유가 되지 않음)
    • 만약 파일을 유지하고 싶다면 Host(우리의 컴퓨터)와 Container의 저장소를 공유해야 함
    • Volume Mount를 진행하면 Host와 Container의 폴더가 공유됨
    • -v 옵션을 사용하며, -p(Port)처럼 사용함. -v Host_Folder:Container_Folder
docker run -it -p 8888:8888 -v /some/host/folder/for/work:/home/jovyan/workspace jupyter/minimal-notebook

Docker Hub

https://hub.docker.com

위의 도커허브 사이트에서 실습에서 한 mysql과 같은 이미지를 다운 받을 수 있다.

  • 위 사이트로 들어가 검색창에 mysql 을 입력하면 아래와 같은 창이 나온다.

Docker mysql

  • mysql 로 들어가 이미지 정보와 사용방법들이 간단하게 나온다.

도커 이미지 만들기

FastAPI가 설치되어 있는 Python 환경과, main.py를 포함하는 도커 이미지를 만들어보자.\

커맨드 창에 다음과 같은 명령어를 입력하여 이미지 환경 세팅을 완료한다.

python3 -V                      // python3 버전 확인
python3 -m venv .venv           // venv를 이용하여 .venv이름의 가상환경을 구축
source .venv/bin/activate       // 가상환경 활성화
pip install pip --upgrade       // pip를 최신버전으로 업그레이드
pip install "fastapi[all]"      // fastapi 설치
pip freeze > requirements.txt   // requirements.txt 파일에 pip list를 저장

FastAPI를 이용하여 GET /hello 로 요청하면, 메시지를 전달하는 간단한 파이썬 코드

from fastapi import FastAPI
import uvicorn

app = FastAPI()

## /hello 를 입력하면 world!를 출력한다.
@app.get("/hello")
def hello():
    return {
        "message": "world!"
    }

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

도커파일

FROM python:3.10.2-slim-buster  // 이미지 빌드에 사용될 베이스 이미지 저장(dockerhub에 존재)

COPY . /app                     // 현재 디렉토리의 모든 파일을 /app(컨테이너 내 디렉토리) 로 복사한다.
WORKDIR /app                    // WORKDIR "컨테이너 내 디렉토리"
ENV PYTHONPATH=/app             // 컨ㅌ테이너 내 환경변수를 지정
ENV PYTHONUNBUFFERED=1          // 파이썬 애플리케이션의 경우 통상 두 값을 지정

// 컨테이너 내에서 다음과 같은 명령어를 실행한다.
RUN pip install pip==22.0.3 && pip install -r requirements.txt

// 컨테이너를 만들 때, 실행할 명령어
// CMD는 띄어쓰기를 하지않는다.
CMD ["python", "main.py"]

Docker image build

  • docker build “Dockerfile path”
  • -t 옵션으로 이름과 태그 지정 가능.(tag default latest)
// . -> 현재 디렉토리
// -t -> my-fastapi-app의 이름으로 만들겠다.
docker build . -t api-test

위 명령어를 입력하면 docker images 명령어로 아래와 같은 빌드된 이미지 확인. api test

docker run 명령어를 통해 컨테이너를 실행 시킨다. api test

다른 터미널 curl 명령어로 /hello를 보내고 world 메시지를 받는 것을 확인할 수 있다. api test

Docker Image 만들기 - 정리

  • 파이썬 환경 및 애플리케이션 코드를 작성
  • Dockerfile 작성
    • FROM으로 베이스 이미지를 지정
    • COPY로 로컬 내 디렉토리 및 파일을 컨테이너 내부로 복사
    • WORKDIR로 RUN, CMD 등을 실행할 컨테이너 내 디렉토리 지정
    • RUN으로 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행
    • CMD로 이미지 실행 시 바로 실행할 명령어를 지정
  • docker build “Dockerfile이 위치한 경로” -t “이미지 이름:태그” 으로 이미지 빌드 - docker run “이미지 이름:태그”로 빌드한 이미지를 실행

그 외에 Dockerfile에서 사용하는 것

  • EXPOSE : 컨테이너 외부에 노출할 포트 지정
  • ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드

Tags:

Categories:

Updated:

Comments