Docker
등장배경
- 개발 서버 ≠ 서비스 운영에 사용하는 서버 (Local 환경에서 개발. 완료되면 Staging 서버, Production 서버에 배포)
- 개발을 진행한 local 환경(윈도우)와 production 서버 환경(리눅스)가 다른 경우 OS가 다르기 때문에 라이브러리, 파이썬 등을 설치할 때 다르게 진행해야 함.
- 혹은 로컬 환경과 서버가 같은 OS여도 서버에서 올바르게 작동하지 않을 수 있다. (로컬의 환경변수, production 서버의 환경변수, production 서버의 사용자 그룹, Permission)
- (해결책) 다양한 설정을 README에 기록하고 항상 실행하도록 하는 방법이 있다.
(문제점) 사람이 진행하는 일이라 Human Error / 귀찮음 / - (문제점) 운영하는 서버가 무수히 많은 경우 / 특정 서버 업데이트가 되면 나머지 서버 모두 접속해 업데이트 필요
(해결 방안) 서버 환경 까지도 한번에 소프트웨어화 하면 되지 않을까? → (소프트웨어) 가상화 개념 등장
가상화
- 특정 소프트웨어 환경을 만들고 Local, Production 서버에서 그대로 활용
- 어느 환경에서나 동일한 환경으로 프로그램 실행 가능
초기 가상화 기술
- VM(Virtual Machine)
호스트 머신(실제 물리적인 컴퓨터, Windows) 위에 OS를 포함한 가상화 소프트웨어(Linux)를 두는 방식
OS위에 OS를 또 실행시킨다는 점에서 굉장히 많은 리소스를 사용 ("무겁다"라고 표현)(좌) Container / (우) Virtual Machine - Container
무거운 VM에 비해 경량화된 기술
Docker
- Container 기술을 쉽게 사용할 수 있도록 도와주는 도구
- 피시방에서 게임 설치해도 재부팅하면 항상 초기 설정으로 돌아가는 것과 비슷한 개념
(Docker image로 만들면 재부팅하면 Docker image 상태로 재실행) - Docker Image : 컨테이너를 실행할 때 사용할 수 있는 템플릿. Read Only
- Docker Container : docker image를 활용해 실행된 인스턴스. Write 가능
- 다른 사람이 만든 소프트웨어(docker image)를 가져와서 바로 사용가능
- OS, 설정을 포함한 실행 환경
- Linux, Windows, Mac 어디든 동일하게 실행 가능 https://low-orbit.net - Docker image를 만들어 공유 가능 - 원격 저장소(Container Registry)에 저장하면 어디서나 사용 가능
Docker 커맨드
- docker pull [image name:tag] : image 다운
- docker images : 다운받은 image 확인
- docker run [image name:tag] : 다운받은 이미지 기반으로 컨테이너 만들고 실행
(ex) docker run --name mysql-tutorial -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8
--name [container name] : 컨테이너 이름 지정. 지정하지 않으면 랜덤 생성
-e [환경변수] : 환경변수 설정. image에 따라 설정 다름.
-d : 데몬(백그라운드)모드. 컨테이너를 백그라운드 형태로 실행.
데몬 설정하지 않으면 현재 실행하는 셀 위에서 컨테이너 실행. 컨테이너를 나가면 실행 종료
-p [로컬 호스트 포트:컨테이너 포트] : 로컬포트**로 접근시 컨테이너 포트**로 연결되도록 설정
로컬 호스트 : 우리 컴퓨터 / 컨테이너 : 컨테이너 이미지 내부 - docker ps : 실행 중인 컨테이너 확인 가능
docker ps -a : 작동 여부 상관없이 컨테이너 확인 가능 - docker exec -it [컨테이너 이름/ID] /bin/bash : 컨테이너에 진입
mysql의 경우 mysql -u root -p → password 입력 → MySQL 쉘 화면 등장 - docker stop [컨테이너 이름(ID)] : 실행 중인 컨테이너를 중지
- docker rm [컨테이너 이름(ID)] : '멈춘' 컨테이너를 삭제
docker rm [컨테이너 이름(ID)] -f : 실행 중인 컨테이너도 삭제 가능 - docker run 할 때 파일 공유하는 법
docker container 내부는 특별한 설정이 없으면 컨테이너를 삭제할 때 파일이 사라진다.
(Host와 Container간 파일 공유가 되지 않는다.)
파일을 유지하고 싶으면 Volume Mount를 통해 Host(우리 컴퓨터)와 Container의 저장소를 공유해야 함.
-v [Host_Folder:Container_Folder]
(ex) docker run -it -p 8888:8888 -v /some/host/folder/for/work:/home/jovyan/workspace jupyter/notebook - Dockerhub에서 공개된 이미지 다운받아보자
Docker Image 만들기
- Dockerfile (Docker Image를 빌드하기 위한 정보가 담겨있음)
⊙ FROM [image name:tag] : 이미지 빌드에 사용할 베이스 이미지를 지정. 보통 밑바닥부터 만들지 않고 공개된 이미지를 기반으로 새로운 설정을 추가함
(ex) FROM python:3.8.7-slim-buster
⊙ COPY [로컬 디렉토리(파일)] [컨테이너 내 디렉토리(파일)] : Dockerfile이 존재하는 경로 기준 로컬 디렉토리를 컨테이너 내부의 디렉토리로 복사.
(ex) COPY . /app : 프로젝트 최상위 모든 파일을 컨테이너 /app 디렉토리로 복사
⊙ WORKDIR [컨테이너 내 디렉토리] : Dockerfile의 RUN, CMD, ENTRYPOINT 등의 명령어를 실행한 컨테이너 내 경로 지정. (ex) WORKDIR /app : 이 뒤의 명령어는 /app 에서 실행
⊙ ENV [환경변수 이름=값] : 컨테이너 내 환경변수를 지정
(ex) ENV PYTHONPATH=/app ENV PYTHONBUFFERED=1 파이썬 앱의 경우 통상 이 두 값 지정
⊙ RUN [실행할 리눅스 명령어] : 컨테이너 내에서 리눅스 명령어를 실행
(ex) RUN pip install pip=[version] RUN pip install -r requirements.txt
⊙ CMD ["실행할 명령어","인자"] : docker run으로 이 이미지를 기반으로 컨테이너를 만들 때 실행할 명령어
띄어쓰기를 사용하지 않음
RUN : 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행 vs CMD : 이미지 실행 시 바로 실행할 명령어
⊙ EXPOSE : 컨테이너 외부에 노출할 포트 지정
⊙ ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행하는 커멘드 - requirements.txt
pip freeze(설치한 라이브러리를 전부 보여줌)
pip list --not-required --format=freeze(의존성에 따라 설치된 라이브러리는 보이지 않음)
pip으로 설치한 라이브러리를 모두 requirements.txt에 저장 (ex) pip freeze > requirements.txt - 커맨드에 docker build [Dockerfile이 위치한 경로] 입력 : 이미지 생성(빌드)
(ex) docker build . -t [image name:tag] - 다른 터미널을 열어 curl로 애플리케이션 작동여부 확인 가능
'네이버 부스트캠프 AI Tech > Deep Learning Basics' 카테고리의 다른 글
[부스트캠프 AI Tech] MLflow (0) | 2022.02.16 |
---|---|
[부스트캠프 AI Tech] Linux & Shell Command (0) | 2022.02.15 |
[부스트캠프 AI Tech] Recurrent Neural Network / Transformer (0) | 2022.02.13 |
[부스트캠프 AI Tech] Convolutional Neural Networks (0) | 2022.02.08 |
[부스트캠프 AI Tech] Optimization (0) | 2022.02.07 |
댓글