| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- GPT
- Optimization
- ODQA
- 현대자동차
- Transformer
- word2vec
- Attention
- 데이터 시각화
- Data Viz
- pyTorch
- nlp
- AI 경진대회
- 기아
- dataset
- Ai
- Bert
- passage retrieval
- 2023 현대차·기아 CTO AI 경진대회
- Bart
- RNN
- KLUE
- 딥러닝
- N2N
- seaborn
- N21
- 데이터 구축
- matplotlib
- AI Math
- Self-attention
- mrc
- Today
- Total
쉬엄쉬엄블로그
(AI 서비스 개발 기초) Docker 본문
이 색깔은 주석이라 무시하셔도 됩니다.
Part 3. 더 완성된 제품으로 개발하기
Docker 소개
가상화란?
- 개발할 때, 서비스 운영에 사용하는 서버에 직접 들어가서 개발하지 않음
- Local 환경에서 개발하고, 완료되면 Staging 서버, Production 서버에 배포
- 개발을 진행한 Local 환경과 Production 서버 환경이 다른 경우
- 예)
- Local 환경은 윈도우
- 서버 환경은 Linux
- OS가 다르기 때문에 라이브러리, 파이썬 등 설치할 때 다르게 진행해야 함
- 예)
- Local 환경과 서버가 같은 OS를 사용해도, 서버에서 올바르게 작동하지 않을 수 있음
- 예)
- Local의 환경 변수
- Production 서버의 환경 변수(Env)
- Production 서버의 사용자 그룹, Permission
- 예)
- 다양한 설정을 README 등에 기록하고, 항상 실행하도록 하는 방법
- 사람이 진행하는 일이라 Human Error 발생
- 매번 이런 작업을 해야 하는 과정이 귀찮음
- 예)
- Jupyter Notebook 서버를 만들기 위해 클라우드에서 클릭 - 이름 - 클릭 만들기 ⇒ 인스턴스로 접속해서 필요한 패키지 설치하는 과정
- 운영하고 있는 Server가 100대라면?
- 특정 서버 업데이트가 진행되었다면(윈도우, 스마트폰 OS 자동 업데이트 실행) ⇒ 나머지 서버에도 모두 접속해 업데이트 필요
- 이 부분에서 생기는 고민 : 서버 환경까지도 모두 한번에 소프트웨어화 할 수 없을까?
- 밀키트처럼 만들어서 집에서도 사용하고 레스토랑에서도 사용하는 방법은?
- 이런 고민을 해결하기 위해 나온 개념이 “가상화”
- 엄밀하게는 하드웨어 가상화 등 더 넓은 개념이지만, 여기선 소프트웨어 가상화로 한정
- 특정 소프트웨어 환경을 만들고, Local, Production 서버에서 그대로 활용
- 개발(Local)과 운영(Production) 서버의 환경 불일치가 해소
- 어느 환경에서나 동일한 환경으로 프로그램을 실행할 수 있음
- 개발 외에 Research도 동일한 환경을 사용할 수 있음
Docker 등장 전
가상화 기술로 주로 VM(Virtual Machine)을 사용
VM은 호스트 머신이라고 하는 실제 물리적인 컴퓨터 위에, OS를 포함한 가상화 소프트웨어를 두는 방식
예)
호스트 머신은 Windows인데, Windows에서 Linux를 실행
호스트 머신은 Mac인데, Mac에서 Windows를 실행

https://www.vembu.com/blog/containers-vs-virtual-machines-differences-and-advantages/
앞서 사용한 GCP의 Compute Engine 또는 AWS EC2가 이런 개념을 활용
- 클라우드 회사에서 미리 만든 이미지를 바탕으로, Computing 서비스를 통해 사용자에게 동일한 컴퓨팅 환경을 제공
그러나 OS 위에 OS를 하나 더 실행시키는 점에서 VM은 굉장히 리소스를 많이 사용
- 이런 경우를 “무겁다”라고 표현
Container : VM의 무거움을 크게 덜어주면서, 가상화를 좀 더 경량화된 프로세스의 개념으로 만든 기술
- 이 기술의 등장으로 이전보다 빠르고 가볍게 가상화를 구현할 수 있음
Docker 소개
Container 기술을 쉽게 사용할 수 있도록 나온 도구가 바로 Docker

- 2013년에 오픈소스로 등장
- 컨테이너에 기반한 개발과 운영을 매우 빠르게 확장
Docker와 비슷한 느낌
- PC방에서 특정 게임만 설치하고, 고객이 특정 프로그램을 깔아도 재부팅할 때 항상 PC방에서 저장해둔 형태로 다시 복구
- = Docker Image로 만들어두고, 재부팅하면 Docker Image의 상태로 실행
Docker Image
- 컨테이너를 실행할 때 사용할 수 있는 “템플릿”
- Read Only
Docker Container
Docker Image를 활용해 실행된 인스턴스
Write 가능

https://low-orbit.net/docker-container-vs-image
Docker로 할 수 있는 일
- 다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있음
- 예) MySQL을 Docker로 실행
- 예) Jupyter Notebook을 Docker로 실행
- 다른 사람이 만든 소프트웨어 : Docker Image
- OS, 설정을 포함한 실행 환경
- Linux, Windows, Mac 어디에서나 동일하게 실행할 수 있음
- 자신만의 이미지를 만들면 다른 사람에게 공유할 수 있음
- 원격 저장소에 저장하면 어디서나 사용할 수 있음
- 원격 저장소 : Container Registry
- 회사에서 서비스를 배포할 때는 원격 저장소에 이미지를 업로드하고, 서버에서 받아서 실행하는 식으로 진행
Docker 실습하며 배워보기
Docker 설치하기
- 도커 공식 홈페이지에서 자신의 운영체제에 맞는 Docker Desktop 설치
Docker 실행하기
설치 후, 터미널에서 docker 커맨더가 동작하는지 확인
MySQL 실행하기
docker pull “이미지 이름:태그”
docker pull mysql:8로 mysql 8 버전의 이미지를 다운

다운받은 이미지 확인 : docker images

docker run “이미지 이름:태그”
다운받은 MySQL 이미지 기반으로 Docker Container를 만들고 실행




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

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

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

- MySQL 프로세스에 들어가면 MySQL 쉘 화면이 보임
작동을 멈춘 컨테이너는 docker ps -a 명령어로만 확인할 수 있음

- docker ps는 실행중인 컨테이너 목록만 보여줌
docker rm “컨테이너 이름(ID)”

- 멈춘 컨테이너를 삭제
- 멈춘 컨테이너만 삭제할 수 있지만 docker rm “컨테이너 이름(ID)” -f로 실행중인 컨테이너도 삭제 가능
기본 명령어 정리
- docker pull “이미지 이름:태그” : 필요한 이미지 다운
- docker images : 다운받은 이미지 목록 확인
- docker run “이미지 이름:태그” : 이미지를 기반으로 컨테이너 생성
- docker ps : 실행중인 컨테이너 목록 확인
- docker exec -it “컨테이너 이름(ID)” /bin/bash : 컨테이너에 진입
- docker container “컨테이너 이름(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 Container 내부는 특별한 설정이 없으면 컨테이너를 삭제할 때 파일이 사라짐
- Volume Mount
- docker run 할 때 파일을 공유하는 방법
- Dockerhub에 공개된 모든 이미지를 받을 수 있음
- MySQL도 Dockerhub에서 다운로드
- Dockerhub에 왠만한 오픈소스들이 공개되어 있고, 우리는 필요한 이미지를 찾아 실행!
Docker Image 만들기
간단한 FastAPI 애플리케이션을 실행하는 서버를 Docker Image 생성
프로젝트 셋팅
- 폴더를 하나 만들고, 여기에 가상환경 세팅과 FastAPI 패키지를 설치
FastAPI 코드 작성
사용한 라이브러리 명시
- pip freeze : 설치한 라이브러리를 모두 보여줌
- 또는 pip list --not-required --format=freeze : 의존성에 따라 설치된 라이브러리는 보이지 않음
Dockerfile 작성
Dockerfile라는 파일을 만들어 다음처럼 작성(Docker Image를 빌드하기 위한 정보가 담김)







Docker Image Build
docker build “Dockerfile이 위치한 경로”
이미지 생성(빌드라고 표현)
아래 이미지에서 . 는 현재 폴더에 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 : 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드
출처: 부스트캠프 AI Tech 4기(NAVER Connect Foundation)
'부스트캠프 AI Tech 4기' 카테고리의 다른 글
| (KLUE) 인공지능과 자연어 처리 (0) | 2023.08.11 |
|---|---|
| (AI 서비스 개발 기초) MLflow (0) | 2023.08.10 |
| (AI 서비스 개발 기초) Linux & Shell Command (0) | 2023.08.08 |
| (AI 서비스 개발 기초) 웹 서비스 형태 - Streamlit (0) | 2023.08.07 |
| (AI 서비스 개발 기초) Notebook 베이스 - Voila (0) | 2023.08.04 |