Docker에 대하여 알아보자
Docker
Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼으로써, 컨테이너라는 표준화된 유닛으로 패키징하여 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는데 모든 것을 포함 할 수 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장 할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.
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를 입력하여 잘 설치되었는지 확인 할 수 있다.
도커에서 MySQL 실행하기
docker pull “이미지 이름:태그”
docker pull mysql:8을 입력하여 mysql 8버전의 이미지를 다운할 수 있다.
아래의 그림처럼 docker mysql image를 다운한다.
docker images
다운받은 이미지를 확인 할 수 있다.
docker run “이미지 이름:태그”
다운받은 도커 이미지를 Docker Container를 만들고 실행한다.
- 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 exec -it “컨테이너 이름” /bin/bash
- MySQL이 실행되고 있는지 확인하기 위해 컨테이너에 진입
- Compute Engine에서 SSH와 접속하는 것과 유사
mysql -u root -p
- 명령어를 입력하고 앞서 설정한 비밀번호를 입력하면 컨테이너 진입 후 mysql 프로세스로 들어간다.
docker ps -a
작동이 멈춘 컨테이너를 확인 할 수 있다.
docker rm “컨테이너 이름(ID)”
- 멈춘 컨테이너를 삭제
- -f 옵션으로 실행중인 컨테이너도 강제로 삭제 가능.
위의 명령어로 도커의 실행을 중지하고 삭제 할 수 있다.
도커 기본 명령어 정리
- 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
위의 도커허브 사이트에서 실습에서 한 mysql과 같은 이미지를 다운 받을 수 있다.
- 위 사이트로 들어가 검색창에 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 명령어로 아래와 같은 빌드된 이미지 확인.
docker run 명령어를 통해 컨테이너를 실행 시킨다.
다른 터미널 curl 명령어로 /hello를 보내고 world 메시지를 받는 것을 확인할 수 있다.
Docker Image 만들기 - 정리
- 파이썬 환경 및 애플리케이션 코드를 작성
- Dockerfile 작성
- FROM으로 베이스 이미지를 지정
- COPY로 로컬 내 디렉토리 및 파일을 컨테이너 내부로 복사
- WORKDIR로 RUN, CMD 등을 실행할 컨테이너 내 디렉토리 지정
- RUN으로 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행
- CMD로 이미지 실행 시 바로 실행할 명령어를 지정
- docker build “Dockerfile이 위치한 경로” -t “이미지 이름:태그” 으로 이미지 빌드 - docker run “이미지 이름:태그”로 빌드한 이미지를 실행
그 외에 Dockerfile에서 사용하는 것
- EXPOSE : 컨테이너 외부에 노출할 포트 지정
- ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드
Comments