[Docker] Docker 실습

yoonseok choi·2022년 8월 31일
0

AWS

목록 보기
11/11

Docker 생성 및 배포 실습 (feat.error)

From ubuntu 
# 이미지 생성

Run apt-get update && apt-get install -y python3 python3-pip


WORKDIR /app

COPY . /app
# 해당 디렉터리에 위치한 모든 파일(main.py,requirements.txt)을 app에 복사

Run pip3 install -r requirements.txt
# API 설치

#Run python3 main.py
#-> build x
# image는 서버를 실행할 준비를 하는 것이지 실행하는 것은 아니다.

CMD ["python3", "main.py"]
# CMD에서 python으로 main.py를 실행

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def hello_world():
    return {"message": "Hello World"}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
    # 서버 접속 port를 지정
    # docker에서 접속하려면 포트포워딩을 통해서 포트 번호를 맞춰주어야한다.
# requirements.txt에는 api들이 들어가게 된다.
fastapi
uvicorn
docker build -f Dockerfile .
# 해당 코드를 입력하게 되면 image id와 tag가 none인 상태로 할당된다.


IMAGE ID / TAG 할당

image id 할당하기

docker build -t yoon/docker_tuto .
# tag를 할당하지 않을 경우에는 자동으로 latest로 할당된다.
docker build -t yoon/docker_tuto:tag1 -t yoon/docker_tuto:tag2 . 
# 2개의 IMAGE와 TAGING 가능      


SIZE 경량화

From python:3-alpine
#ubuntu는 무거운 tool이기에 위와 같은 방법으로 경량화 작업을 할 수 있다
#python3 설치할 필요가 없다.

WORKDIR /app

COPY . /app
# 해당 디렉터리에 위치한 모든 파일(main.py,requirements.txt)을 app에 복사

Run pip install -r requirements.txt
# API 설치

CMD ["python", "main.py"]
# CMD에서 python으로 main.py를 실행

python:3-alpine 으로 size 경량화가 가능하다.

같은 코드로 이루어진 IMAGE이지만 alpine 코드로 SIZE를 경량화 할 수 있는 것을 확인 할 수 있다.


Docker push

Github에서 local에서 file을 add->commit->push 하는 것 처럼
Docker도 이와 유사하게 local에서 image를 build->push 해야 docker hub's repo에 등록이 된다

docker push yooon/lesson1-docker-tuto-alpine
#생성한 image를 push

위와 같이 dockerhub -> repo에 등록 된 것을 확인 할 수 있다.


Change ENV

flask를 이용한 프로젝트를 진행 했을 때, 수정된 코드가 잘 적용이 되었는지 확인하기 위해서
포트를 종료하고 다시 실행시켰던 경험이 있었다.

docker에는 이러한 불편함을 해소 시켜줄 수 있는 ENV 기능이 크게 2가지로 존재한다.

  • main.py에서 ENV PORT number를 지정해주는 방법
  • terminal에서 --env PORT = number -p number:number 간편하게 포트포워딩 해주는 방법

import os

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def hello_world():
    return {"message": "Hello World"}


if __name__ == "__main__":
    import uvicorn
    #uvicorn.run(app, host="0.0.0.0", port=8000)
    uvicorn.run(app, host="0.0.0.0", port=int(os.environ["PORT"]))
    # Env 설정을 통해 port 번호를 입력하지 않고 os에서 불러와서 동작하도록 한다.

From python:3-alpine
# ubuntu는 무거운 tool이기에 위와 같은 방법으로 경량화 작업을 할 수 있다
#python3 설치할 필요가 없다.

ENV PORT 8080

WORKDIR /app

COPY . /app
# 해당 디렉터리에 위치한 모든 파일(main.py,requirements.txt)을 app에 복사

Run pip install -r requirements.txt
# API 설치



CMD ["python", "main.py"]
# CMD에서 python으로 main.py를 실행

 docker run -it --env PORT=7777 -p 7777:7777 yooon/lesson2-fastapi       
 #위와 같은 방식으로 코드를 수정하지않고 환경변수를 코드를 추가하여 바로바로 수정된 포트번호로 접속할 수 있다.
 

Docker file CI/CD

lint & unittest 중 error가 발생 할 때는 오류 코드를 확인하고 해결하자

CI

LINT

  • black, flake8 error가 발생 할 경우
    -> black linter! : black main.py를 실행
    -> flake8 linter!: 쓸 때 없는 주석 처리를 제거

UNITTEST

  • test file을 check할 때 위의 환경변수 version으로 인한 error가 많이 발생했었다.
    workflows 내의 error code를 잘 확인해서 해결하도록 한다.

CD

CD = Continuous Delivery or Deployment 
즉, 지속적인 제공 및 배포를 의미한다.
그래서 당연하게도 앞선 과정에서 작성한 files을 docker hub에 push를 해야하는데 
그게 바로 CD이다.

docker hub에 우리의 files를 push하기 위해서는 당연하게도 docker site에 자동으로 로그인을 하는 과정이 필요하고 그 과정에서 DOCKER_USERNAME,DOCKER_PASSWORD가 필요하다.

하지만, 해당 정보는 코드로 공개할 수 없는 개인정보이기 때문에 Token을 암호화하여 사용하는 것과 같이 ID,Password도 암호화하여 사용해야한다.

이를 위해서는 Github -> 해당 Repo -> setting -> secrets -> Actions 에서 추가해주면 된다.
여기에서 주의할 점은 DOCKER_USERNAME은 email이 아닌 username으로 사용해야한다는 것이다.
당연하게도 접속할 때 사용하는 email이라고 생각했는데 오류가 발생했었다...ㅎ

추가적으로 앞선 CI/CD과정 중 cd.yml에는 우리가 docker push라는 명령어를 통해서 yooon/lesson1-docker-tuto-alpine을 추가한 것과 같이 docker image를 push하는 명령어가 포함 되어있다. cd.yml에 push 명령어가 추가되어 있기 때문에 terminal에서 push를 따로 하지 않아도 되는 편리함도 있다.



Docker hub

결국 우리가 하고자 하는 것은 우리가 코드를 작성할 때, 
해당 코드가 올바르게 작성된 코드인지 아닌지 테스트를 하고 docker hub repo에 지속적으로 통합하는 것

위의 이미지 중 yooon/lesson2-fastapi는 코드를 새롭게 수정하고 반영할 때 마다 자동으로 테스트 과정을 거친 뒤 docker hub repo에 저장된 것을 확인 할 수 있다.

profile
Concilio et Labore ( 지혜와 노력으로 )

0개의 댓글