Docker

-·2022년 1월 15일
0

강의정리 - MLOps

목록 보기
12/18
post-custom-banner

목차

  • Docker소개
    -- 가상화란?
    -- Docker 등장하기 전
    -- Docker 소개
    -- Docker로 할 수 있는 일

  • Docker 실습하며 배워보기
    -- 설치하고 실행하기
    -- Docker Image 만들기
    -- Registry에 Docker Image Push

  • Docker 이미지로 배포하기
    -- Serverless Cloud 서비스(Cloud Run)
    -- Compute Engine에 Docker Image배포하기 (Streamlit)
    -- Docker Compose

Docker 소개

가상화란?

개발할 때, 서비스 운영에 사용하는 서버에 직접 들어가서 개발하지 않음
Local환경에서 개발하고, 완료되면 Staging서버, Production서버에 배포

개발을 진행한 Local환경과 Production서버 환경이 다른 경우
예)
Local환경은 윈도우
서버 환경은 Linux

OS가 다르기 때문에 라이브러리, 파이썬 등 설치할 때 다르게 진행해야 함.

Local환경과 서버가 같은 OS를 사용해도, 서버에서 올바르게 작동하지 않을 수 있음
예)
Local의 환경 변수
Production서버의 환경 변수(Env)
Production 서버의 사용자 그룹, Permission

  • 다양한 설정을 README 등에 기록하고, 항상 실행하도록 하는 방법
    -- 사람이 진행하는 일이라 Human Error발생
    -- 매번 이런 작업을 해야 하는 과정이 귀찮음

예)
Jupyter Notebook 서버를 만들기 위해 클라우드에서 클릭-이름-클릭 만들기 => 인스턴스로 접속해서 필요한 패키지 설치하는 과정

운영하고 있는 Server가 100대라면?

  • 특정 서버 업데이트가 진행되었다면(윈도우, 스마트폰 OS 자동 업데이트 실행) => 나머지 서버에도 모두 접속해 업데이트 필요할 것이다.

이부분에서 생기는 고민: 서버 환경까지도 모두 한번에 소프트웨어화 할 수 없을까?
밀키트처럼 만들어서 집에서도 사용하고 레스토랑에서도 사용하는 방법은?
이런 고민을 해결하기 위해 나온 개념이 가상화
(엄밀하게는 하드웨어 가상화 등 더 넓은 개념이지만, 여기선 소프트웨어 가상화로 한정)

Research/Production 환경에서 공통적으로 사용하는 일종의 템플릿

특정 소프트웨어 환경을 만들고, Local, Production 서버에서 그대로 활용

  • 개발(Local)과 운영(Production)서버의 환경 불일치가 해소
  • 어느 환경에서나 동일한 환경으로 프로그램을 실행할 수 있음
  • 개발 외에 Research도 동일한 환경을 사용할 수 있음

Docker 등장 전

가상화 기술로 주로 VM(Virtual Machine)을 사용

  • VM은 호스트 머신이라고 하는 실제 물리적인 컴퓨터 위에, OS를 포함한 가상화 소프트웨어를 두는 방식

예)
호스트머신은 Window인데 Window에서 Linux를 실행
호스트머신은 Mac인데, Mac에서 Window를 실행

GCP의 Compute Engine 또는 AWS EC2가 이런 개념을 활용

  • 클라우드 회사에서 미리 만든 이미지를 바탕으로, Computing서비스를 통해 사용자에게 동일한 컴퓨팅 환경 제공

그러나 OS위에 OS를 하나 더 실행시키는 점에서 VM은 굉장히 리소스를 많이 사용

  • 이런 경우 "무겁다"라고 표현

Container: VM의 무거움을 크게 덜어주면서, 가상화를 좀 더 경량화된 프로세스의 개념으로 만든 기술

  • 이 기술의 등장으로 이전보다 빠르고 가볍게 가상화를 구현할 수 있음

Container 기술을 쉽게 사용할 수 있도록 나온 도구가 바로 Docker

  • 2013년에 오픈소스로 등장
  • 컨테이너에 기반한 개발과 운영을 매우 빠르게 확장

도커 Image

  • 컨테이너를 실행할 때 사용할 수 있는 "템플릿"
  • Read Only
    도커 Container
  • Docker Image를 활용해 실행된 인스턴스
  • Write가능

Docker로 할 수 있는 일

  • 다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있음
    -- MySQL을 Docker로 실행
    -- Jupyter Notebook을 Docker로 실행

  • 다른 사람이 만든 소프트웨어 : Docker Image
    -- OS, 설정을 포함한 실행 환경
    -- Linux, Window, Mac 어디에서나 동일하게 실행할 수 있음

  • 자신만의 이미지를 만들면 다른 사람에게 공유할 수 있음
    -- 원격저장소에 저장하면 어디서나 사용할 수 있음

  • 원격 저장소 : Contatiner Registry
    -- 회사에서 서비스를 배포할 때는 원격 저장소에 이미지를 업로드하고, 서버에서 받아서 실행하는 식으로 진행

Docker 실습하며 배워보기

도커 설치

도커 공식 홈페이지에서 자신의 운영체제에 맞는 Docker Desktop

설치 후, 터미널에서 Docker 커맨드가 동작하는지 확인

docker pull "이미지 이름:태그"
docker pull mysql:8로 mysql 8 버전의 이미지를 다운

docker images
다운받은 이미지 확인

docker run "이미지 이름:태그"

  • 다운받은 MySQL 이미지 기반으로 Docker Container를 만들고 실행
    docker run --name mysql-tutorial -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8

  • name mysql-tutorial :
    -- 컨테이너 이름 : 지정하지 않으면 랜덤으로 생성, 나중에 확인하기 위해 이름 꼭 붙이기

  • -e MYSQL_ROOT_PASSWORD=1234 :
    -- 환경변수 설정 : 사용하는 이미지에 따라 설정이 다름
    -- MySQL: 환경변수를 통해 root계정의 비밀번호를 설정

  • -d : 데몬(백그라운드)모드
    -- 컨테이너를 백그라운드 형태로 실행
    -- 이 설정을 하지 않으면, 현재 실행하는 셀 위에서 컨테이너가 실행
    -- 컨테이너의 로그를 바로 볼 수 있으나, 컨테이너를 나가면 실행 종료

  • -p 3306:3306 포트 지정
    -- 로컬 호스트 포트: 컨테이너 포트 형태로, 로컬포트 3306으로 접근 시 컨테이너 포트 3306으로 연결되도록 설정
    -- mysql은 기본적으로 3306 포트를 통해 통신
    -- 로컬호스트: 우리의 컴퓨터
    -- 컨테이너 : 컨테이너 이미지 내부

  • mysql:8 아까 pull해온 mysql:8을 가져오겠다

Docker 실행하기 - MySQL실행하기

실행한 컨테이너는 docker ps 명령어로 확인할 수 있음

docker exec -it "컨테이너 이름(혹은 ID)" /bin/bash

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

mysql -u root -p
MySQL 프로세스로 들어가면 MySQL쉘 화면이 보임 -> MySQL이 실행됨 !

작동을 멈춘 컨테이너는 docker ps -a 명령어로만 확인할 수 있음
(docker ps는 실행중인 컨테이너 목록만 보여줌)

docker rm "컨테이너 이름(ID)"
멈춘 컨테이너를 삭제
(멈춘 컨테이너만 삭제할 수 있지만 docker rm "컨테이너 이름(ID)" -f 로 실행중인 컨테이너도 삭제 가능)

기본 명령어 정리

  • docker pull "이미지이름:태그" => 필요한 이미지 다운
  • docker images => 다운 받은 이미지 목록 확인
  • 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:/homejovyan/workspace/jupyter/minimal-notebook

Dockerhub에 공개된 모든 이미지를 다운받을 수 있음
MySQL도 Dockerhub에서 다운로드
Dockerhub에 왠만한 오픈소스들이 공개되어 있고, 우리는 필요한 이미지를 찾아 실행

Docker Image 만들기

이미지를 다운받아 사용하는 법을 알았으니, 이제 직접 Docker Image 만들기
간단한 FastAPI 애플리케이션을 실행하는 서버를 Docker Image 생성

프로젝트 세팅

먼저 폴더를 하나 만들고, 여기에 가상환경 세팅과 FastAPI패키지를 설치

FastAPI코드 작성

GET /hello로 요청하면 메시지를 전달하는 간단한 코드를 작성

사용한 라이브러리 명시

pip freeze: 설치한 라이브러리를 모두 보여줌
또는 pip list --not-required --format=freeze : 의존성에 따라 설치된 라이브러리는 보이지 않음

pip로 설치한 라이브러리를 모두 requirements.txt에 저장

pip freeze > requirements.txt

Dockerfile 작성

Dockerfile라는 파일을 만들어 아래처럼 작성 (Docker Image를 빌드하기 위한 정보가 담김)

FROM python:3.8.7-slim-buster : FROM 이미지 이름:태그

  • 이미지 빌드에 사용할 베이스 이미지를 지정
  • 베이스 이미지는 이미 만들어진 이미지
  • 보통 처음부터 만들지 않고, 이미 공개된 이미지를 기반으로 새로운 설정을 추가
  • python 3.8.7-slim-buster를 사용(이 이미지는 Dockerhub에 존재)

COPY . /app

  • COPY "로컬디렉토리(파일)" "컨테이너 내 디렉토리(파일)"
  • 컨테이너는 자체적인 파일 시스템과 디렉토리를 가짐
  • COPY 명령어는 Dockerfile이 존재하는 경로 기준 로컬 디렉토리를 컨테이너내부의(자체 파일 시스템을 가진)디렉토리로 복사
  • 해당 코드는 프로젝트 최상위에 존재하는 모든 파일을 컨테이너 내부 /app디렉토리로 복사
  • 파일을 컨테이너에서 사용하려면 COPY 명령어로 반드시 복사해야함

WORKDIR /app

  • WORKDIR "컨테이너 내 디렉토리" (=CD)
  • Dockerfile의 RUN, CMD, ENTRYPOINT 등의 명령어를 실행할 컨테이너 경로 지정
  • 이 라인 뒤에 등장하는 RUN, CMD는 컨테이너 내부의 /app 에서 실행

ENV PYTHONPATH = /app
ENV PYTHONBUFFERED=1

  • ENV "환경변수 이름=값"
  • 컨테이너 내 환경변수를 지정
  • 파이썬 애플리케이션의 경우 통상 위 두 값을 지정

RUN pip install pip==21.2.4 &&\ pip install -r requirements.txt

  • RUN "실행할 리눅스 명령어"
  • 컨테이너 내에서 리눅스 명령어를 실행
  • 위의 경우 pip install pip와 -r requirements.txt 두 명령어를 실행. 한 번에 실행할 명령어가 여러개인 경우 *&&* 로 이어줌
  • 이전 라인에서 COPY와 WORKDIR이 실행되었기 때문에 컨테이너 내에 requirements.txt이 존재하고, 이를 pip install -r 명령어로 실행시킬 수 있음
  • 명령어 RUN, WORKDIR,..,은 하나하나 레이어가 되기 때문에 하나로 묶을 수 있으면 묶는것이 좋음
    -- 레이어가 하나더 추가되면 레이어가 추가될 때마다 이미지 빌드하는 시간이나 변경이되면 다시 실행됨.

CMD ["python", "main.py"]

  • docker run으로 이 이미지를 기반으로 컨테이너를 만들 때, 실행할 명령어
  • 이 이미지는 실행되는 즉시 python main.py를 실행하며 CMD는 띄어쓰기를 사용하지 않음

RUN vs CMD
차이점분석 (feat. ENTRYPOINT)

RUN

  • RUN 명령어는 도커파일로부터 도커 이미지를 빌드하는 순간에 실행이 되는 명령어입니다.
    그래서, RUN 명령어는 라이브러리 설치를 하는 부분에서 주로 활용이 됩니다.

CMD

  • CMD 명령어는 RUN 명령어가 이미지를 빌드할 때 실행되는 것과 달리, 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행됩니다

Docker Image Build

docker build "Dockerfile이 위치한 경로"
docker bult . -t my-fastapi -app

  • 이미지 생성 (빌드라고 표현)
  • 아래 이미지에서 . 는 현재 폴더에 Dockerfile이 있음을 의미
  • -t "이미지 이름: 태그" 옵션으로 이미지 이름과 태그 지정할 수 있음
    -- 태그는 미 지정시"latest"로 채워짐

빌드된 이미지 확인

  • 빌드를 마치면 docker images 명령어로 방금 빌드한 이미지를 확인할 수 있음

컨테이너 실행

docker run "이미지 이름:태그"

  • 방금 만든 이미지를 실행
    -- 태그가 "latest"인 경우 생략 가능

  • 다른 터미널을 열어 curl로 애플리케이션이 잘 작동하는지 확인할 수 있음

정리 !!

  • 파이썬 환경 및 애플리케이션 코드를 작성

  • Dockerfile 작성
    -- FROM으로 베이스 이미지를 지정
    -- COPY로 로컬 내 디렉토리 및 파일을 컨테이너 내부로 복사
    -- WORKDIR로 RUN, CMD등을 실행할 컨테이너 내 디렉토리 지정
    -- RUN으로 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행
    -- CMD로 이미지 실행 시 바로 실행할 명령어를 지정

  • docker build "Dockerfile이 위치한 경로" -t "이미지 이름:태그" 으로 이미지 빌드

  • docker run "이미지 이름 : 태그" 로 빌드한 이미지를 실행

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

Registry에 Docker Image Push

이제 우리가 만든 이미지를 인터넷에 업로드하기

이를 위해 이미지 저장소인 Container Registry에 Docker Image Push

Container Registry : Dockerhub, GCP GCR, AWS ECR 등
별도로 지정하지 않으면 기본적으로 Dockerhub를 사용. 우리는 GCP의 GCR을 사용

보통 어떤 클라우드 서비스로 배포할 지에 따라 어떤 레지스트리 서비스를 사용할지 결정 
(ex. GCP에서 배포한다면 레지스트리도 역시 GCP서비스인 GCR을 사용하는 식) 

GCR 설정하기
1. GCP웹 콘솔에서 GCR 확인 (= Container Registry )
2. (처음이라면) GCR화면에 들어가 API 활성화
3. Registry에 아무것도 존재하지 않음
4. 로컬에서 GCR로 이미지를 Push할 준비
먼저 gcloud를 로그인하고, 프로젝트 세팅
(gcloud: 구글 클라우드 플랫폼 제품을 CLI로 쉽게 사용할 수 있도록 만든 도구)
Cloud SDK Install에서 OS를 확인한 후 다운로드 및 실행

gcloud설정
gcloud auth login
gcloud config set project <PROJECT_ID>

gcloud auth configure-docker
(docker 설정)

Tag 설정
docker tag "기존 이미지:태그" "새 이미지 이름:태그"
gcr에 올릴 이미지 이름은 gcr.io/GCP 프로젝트 이름/ 이미지 이름형태여야 함

docker push "이미지 이름:태그"
기다리면 Push

Registry 확인
이미지 이름은 Repository로 태그는 이름 형태로 저장
푸시를 여러번하면 여러가지 파일이 저장됨.
버전1,버전2 처럼 github의 hashing과 유사하다.

Docker Image Pull
Push한 이미지는 "docker pull" 명령어로 어디서든 받을 수 있음

Docker이미지 배포하기

Serverless Cloud 서비스

도커 이미지를 서버에 배포하는 가장 간단한 방법: Cloud 서비스 활용

  • GCP: Cloud Run
  • AWS: ECS

Cloud RUN

  • GCP Cloud Run을 사용하는 경우, 다음처럼 GCR에 올린 이미지 경로만 입력하면 끝 !

  • Cloud Run 인스턴스가 만들어지면, 다음처럼 URL이 자동으로 생성

  • 이 URL로 요청을 날리면 서버가 잘 작동하는 것을 알 수 있음

Compute Engine에 Docker 이미지 배포하기

다른 방식으로 Docker Image 배포

  • Compute Engine을 띄우고, 해당 인스턴스 실행될 때 Docker Image를 가지고 실행하도록 설정
  • Github Action을 사용해 Docker Image Push 자동화!
  • Part2 -CI/CD에서 진행한 Streamlit파일을 기반으로 실행

환경설정

서비스계정 생성- 서비스계정 대시보드
IAM 및 관리자- 서비스계정
IAM(Identity Access Management)

  • 클라우드 서비스에 접근 권한을 관리하는 서비스

서비스 계정(Service Account)

  • 사용자가 아닌 애플리케이션, VM인스턴스에서 사용하는 임의의 계정
  • 프로젝트의 관리자가 서비스 계정에 권한을 부여할 수 있음
  1. 서비스 계정 만들기 클릭
  • 서비스 계정 이름 만들기 : 사용자와 구분하기 위해 service-account라는 suffix를 붙이는 편
  • 액세스 권한을 부여할 수 있지만, 진행하지 않고 계속 버튼 누르기
  1. 생성된 serving-service-account계정
  • 6433156~ 이 계정은 Compute Engine을 실행할 때 Default로 만드는 서비스 계정
  • 생성한 서비스 계정 클릭
  1. 서비스 계정은 Key를 생성할 수 있으며, 이 Key를 사용해 이 서비스 계정의 권한을 사용할 수 있음
  • 키 - 새 키 만들기 클릭
  • 단, 이 Key가 노출되면 자신의 프로젝트가 해킹당할 수 있으니 절대 github Repo에 업로드 금지 (회사에서도 이 Key는 별도로 관리)
  1. JSON으로 선택하기
  • 만들기 클릭하면 JSON파일 저장됨
  1. 파일을 확인하면 private_key_id, private_key등 확인가능
  • 마찬가지로 이 값은 노출 금지

6.IAM에서 방금 생성한 서비스 계정에 권한 부여

  • IAM및 관리자 - IAM으로 이동
  • 추가 버튼 클릭
  1. 권한은 편집자
  • 회사에선 굉장히 Strict하게 권한 관리하지만, 개인프로젝트에선 서비스계정에 "편집자"(꽤 높은 권한)을 주는 경우도 존재
  • 필요한 권한만 주는 것을 추천
  1. IAM에서 생성한 서비스 계정을 확인할 수 있음

참고 : 서비스 계정을 Python 스크립트에서 사용할 경우
from google.cloud import storage

storage_client = strage.Client.from_service_account_json('service_account.json')

서비스 계정 없이 실행하면 서비스 계정을 명시적으로 입력하거나, 환경 변수를 등록하라는 메시지가 출력

-> 서비스 계정의 Key값 복사
-> Github Repository의 Secret에 추가(띄어쓰기, 오타 조심) - SERVICE_ACCOUNT_KEY
-> Github Repository의 Secret에 추가(띄어쓰기, 오타 조심) - GCP_PROJECT_ID
->-> GCP대시보드에서 프로젝트 ID복사해서 추가 (프로젝트 정보/프로젝트 ID)
-> Github Repository의 Secret에 추가(띄어쓰기, 오타 조심) - GCE_INSTANCE
->-> 생성한 인스턴스의 이름
-> Github Repository의 Secret에 추가(띄어쓰기, 오타 조심) - GCE_INSTANCE_ZONE
->-> 생성한 인스턴스의 ZONE

GCR Push

github repo Boostcamp-AI-Tech-Product-Serving의 part2/04-cicd로 이동

Dockerfile

FROM python:3.8.7-slim-buster
COPY requirements.txt ./requirements.txt
RUN pip install -r ./requirements.txt

COPY . /app 
WORKDIR /app 

EXPOSE 8501 
ENTRYPOINT ["streamlit","run","app.py","--server.port","8501"]

프로젝트 구조상 assets의 모델파일을 복사해야 해서 copy_asset.sh를 실행

bash copy_asset.sh

먼저 Local에서 Docker Image Build

docker build . -t "streamlit"

해당 이미지가 존재하는지 확인

docker images | grep "streamlit"

Tag 설정

docker tag streamlit gcr.io/{각자 project id}/streamlit

GCR에 Push

docker push gcr.io/{각자 project id}/streamlit

시간이 소요되고 영겁의 기다림

  • 왜이렇게 느릴까?
  • 더 빠르게 하려면 어떻게 해야할까?
    -- 이미지가 어떤부분에서 병목이 있을까. 느리게 짜여진걸까?
    -- 현재 오래 걸리는 구간은 어디인가? => 현재 4gb용량을 차지하는데 이 이미지를 더 작은것으로 변경하면?=>속도개선
    -- efficient pytorch 설치가 오래 소요 => "무거운 라이브러리가 이런 경우 이슈가 있구나!!!"

이미지를 작게쓰려고 성능을 버릴순 없다 타협점을 잘 찾자 :)

GCR에서 Docker Image 확인

수동 실행

Compute Engine - 인스턴스 만들기 (부팅 디스크 용량 50GB !)

아까 GCR Push한 컨테이너 이미지 지정하고 확인

gcr.io/{각자 project id}/streamlit:latest

최신 이미지를 사용!

이번엔 네트워크 태그를 바로 추가하며 인스턴스 생성
인스턴스가 생성되면 외부 IP로 접근

문제 발생시

만약 IP주소에 접근할 수 없는 경우, 원인 파악 하나씩 (실무에서도 문제는 매번 발생 )

  • 방화벽 설정 잘 되어있는가?
  • 도커 이미지 잘 Push되어 있는가?
  • Compute Engine 실행하면서 Docker 잘 실행했는가?
    -- 확인하기 위해 SSH로 인스턴스 접속
    -- docker images를 진행하고 각자 GCR Image 있는지 확인 -> 없다면 컨테이너 실행 로그 확인

Compute Engine에 SSH 접속 후

sudo journalctl -u konlet-startup

입력하면 Container 실행하는 로그가 나옴 -> 로그 메세지 확인하며 다시 문제 해결

Github Action

이제 Github Action Workflow 생성하기
작업흐름 - gitflow
1. Feature/xxx Branch에서 작업
2. Main Branch로 Pull Request
3. Review 후 Merge <- gitflow

  1. Merge된 파일에서 Docker Image Build
  2. Docker Image Push
  3. Compute Engine에 Docker Image 업데이트 요청
Boostcamp-AI-Tech-Product-Serving/.github/workflows

github 위의 파일로 이동

코드 읽어보기
deploy_docker.yml

Pull Request - Merge !!
(5분~10분정도 걸림...)

Docker Compose

앞서 진행한 내용: Docker Image

  • 하나의 Docker Image가 아니라 여러 Docker Image를 동시에 실행하고 싶다면?
  • 혹은 A Image로 Container를 띄우고, 그 이후에 B Container를 실행해야 하는 경우
    -- (A는 Database고 B는 웹 서비스인 경우)
    -- docker run할 때 옵션이 너무 다양하고, Volume Mount를 하지 않았다면 데이터가 모두 날라감

이런 경우 활용할 수 있는 것이 Docker Compose!!

  • 여러 컨테이너를 한번에 실행할 수 있음
  • 여러 컨테이너의 실행 순서, 의존도를 관리할 수 있음
  • docker-compose.yml파일에 작성

단일이미지가 아닌 여러이미지를 띄우려면 Docker Compose !

  • docker-compose는 docker-compose.yml파일에 특정 문법으로 작성

Docker Image 일괄 실행

docker-compose up
  • docker-compose.yml파일을 파싱하여 Container 실행
    -- 이 때 필요한 이미지가 로컬에 없다면 해당 이미지를 pull하거나 build하는 등의 과정도 포함
docekr-compose up -d: 백그라운드에서 실행하기 ( docker run -d와 동일 )
docekr-compose down: 서비스 중단(컨테이너, 볼륨 등 삭제)
docekr-compose logs <서비스명>: 로그 확인

docker-compose.yml파일을 수정하고 docker-compose up을 하면 컨테이너를 재생성하고, 서비스를 재시작함.

docker-compose up이 완료되면 다음처럼 docker ps 명령어나 docker-compose ps 명령어로 현재 실행되고 있는 컨테이너를 확인할 수 있음

이제 curl로 요청을 보내면 잘 작동하는지 확인할 수 있음

앞에 도커 커맨드에 대한 공부를 많이 하다보면 컴포즈를 써야되는 시점이 온다.

Special Mission

  1. Docker 설치해서 MySQL설치하기
  2. Docker를 사용해 JupyterNotebook 설치하기
  3. Jupyter Notebook Compute Engine에 배포하기
  4. Voila, Streamlit에서 진행한 내용 Docker Image로 말아서 배포하기 <- 꼭 해보기 ;)
  5. Docker Compose로 Jupyter Notebook 설치하기
profile
-
post-custom-banner

0개의 댓글