꺼내먹는지식 준

Docker 본문

카테고리 없음

Docker

알 수 없는 사용자 2022. 2. 14. 12:58

1. Docker 소개 

1) 가상화 

가상화는 왜 하는 걸까? 

개발 시, 서비스 운영에 사용하는 서버는 직접 들어가서 개발하지 않음

Local 환경에서 개발, 완료되면 Staging 서버, Production 

 

Local 환경과 Production 서버 환경이 다른 경우 

ex. Local 환경 윈도우 서버 환경 Linux 

 

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

같은 OS 라도, 서버에서 올바르게 작동 하지 않을 수 있음

 

ex) local 환경 변수, Production 서버의 환경 변수, Production 서버의 사용자 그룹, Permission

 

다양한 설정을 Read Me에 기록하고 항상 실행하도록 하는 방법 

 

- 사람이 진행하는 일이라 Human Error 발생 

- 매번 이런 작업 귀찮다. 

 

ex) 쥬피터 노트북 서버 만들기 위해 클라우드 클릭 - 이름 - 클릭 만들기 -> 인스턴스 접속 필요한 패키지 설치 

운영하는 서버가 100대라면? 

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

 

서버 환경까지 모두 한번에 소프트웨어 화 할 수 없을까? 

 

이런 고민 해결 위한 "가상화"

 

연구 / production 환경이 다르면 불편해서 환경을 일치 시키곤 한다. 

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

- 개발과 운영 서버의 환경 불일치 해소 

- 어느 환경에서나 동일한 환경으로 프로그램 실행 

- 개발외에 Research 동일한 환경 사용 

 

통일할 수록 다시 사용할 수 있는 Template

 

 

2) Docker 등장 전 

가상화 기술은 주로 VM (virtual machine)을 사용 

실질 컴퓨터가 VM 의 일종, 이 위에 OS 포함한 가상화 소프트웨어 두는 방식 

 

ex) 호스트 머신은 window인데, window 에서 linux 실행 

- 호스트 머신 Mac, Mac에서 window 사용 

 

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

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

그냥 클릭으로 컴퓨터 만들어 주세요 라는 행동이 큰 컴퓨터 안에 내부에서 어떤 구조의 VM 띄어 라는 행동이 내장 

 

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

- 무겁다 (MAC OS 에서 부트캠프 쓰면 느렸다. )

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

- 이 기술의 등장으로 이전보다 빠르고 가볍게 가상화 구현 가능 

 

3) Docker 소개 

Container 기술을 쉽게 사용할 수 있는 도구 

 

컨테이너에 기반한 개발과 운영을 매우 빠르게 확장 

기존에는 guest os 위에 app을 올렸다면, Container 에서는 Host OS 하나만 존재하고, 실행할 수 있는 파일들 실행 즉 더 가벼운 개념 

 

Docker 와 비슷한 느낌 

- PC 방에서 특정 게임만 설치하고, 고객이 특정 프로그램 깔아도 재부팅 시 항상 PC 방에서 저장해둔 형태로 다시 복구 

- Docker image 로 만들어두고, 재부팅하면 Docker Img 상태로 실행 

Docker Image

- 컨테이너를 실행할 때 사용할 수 있는 템플릿 

- Read Only (만든 후 수정 불가능)

 

Docker Container 

- Docker Image를 활용해 실행된 인스턴스 

- Write 가능 

 

ex) 씨디로 이 곳 저 곳 다운 받는다 하면 CD는 Docker Image, Container 는 복사된 게임 컴퓨터가 container 환경

 

Image는 템플릿, 컨테이너는 템플릿 기반 서버 인스턴스 

 

 

4) Docker 가 할 수 있는 것 

다른 사람들이 만든 소프트웨어 바로 가져와서 바로 사용할 수 있음, 편집해서 사용도 가능 

ex) MySQL을 Docker 로 실행 

ex) Jupyter Noterbook을 Docker 로 실행 

 

다른 사람들이 만든 소프트웨어: Docker Image

- OS, 설정을 포함한 실행 환경 

- Linux, Window, Mac 어디에서나 동일하게 실행할 수 있음 

 

자신만의 이미지를 만들면 다른 사람에게 공유 가능 

원격 저장소에 저장하면 어디서나 사용 가능 

 

원격 저장소 : Container Registry

- 회사에서 서비스를 베포할 때는 원격 저장소에 이미지 업로드, 서버에서 받아서 실행하는 방식  

 

 


하지만 도커는 OS위에 OS를 설치하는게 아니라 현재 OS에 없는 것만 추가적으로 받아온다.

 

가령 현재 Host OS가 Redhat인데 Guest OS를 Ubuntu를 사용한다고 가정하자.

vm은 redhat위에 ubuntu를 설치하게된다.

근데 도커는 redhat에 없는 부분만, 즉 ubuntu와 redhat이 공유하는 부분은 냅두고 나머지만 재 설치한다.

이게 가능한 이유는 맥과 리눅스는 모두 unix likes운영체제이기 때문이다.

 

그래서 윈도우에서 사용하는 docker는 리눅스 자체를 vm마냥 올리기 때문에 성능이 안좋다.

그렇다고 윈도우에서 의미가 없는건 아니고 윈도우에서도 리눅스와 똑같은 환경으로 사용할 수 있다는 장점이 있다.

그래서 오히려 윈도우에서 코딩할 수록 docker를 사용하는것이 좋다고 생각한다.

하지만 docker를 사용한다는 의미는 단순히 테스팅을 한다는게 아니다.

오히려 테스팅을 할거면 vm이 훨씬 낫다.

도커는 배포를 위해서 사용하는 것이므로 테스트를 하기에 적합하지는 않다고 생각한다.


2. Docker 실습하며 배워보기 

1) Docker 설치, 진행 

docker 공식 웹 

terminal 에서 docker 라고 치면 설치가 잘 되었나 확인 가능

docker를 실행해보자. 

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

docker pull mysql:8로 mysql 8버전 이미지를 다운 받자. 

Mac M1 Pro 를 사용하는 필자는 다운이 안된다. 

다음과 같이 해결하자. 

다음의 글이 좀 어렵다면, 간단하게 이와 같이 해결하자. 

두번째 방법을 통해 잘 해결된 것을 볼 수 있다.

docker images 
어떤 이미지가 생성 되었는지 Repository Tag Image ID Created Size 등의 정보가 주어진다. 

 

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

다운 받은 MySQL 이미지 기반으로 Docker Container를 만들고 실행 

로컬은 우리의 컴퓨터라는걸 잊지말자. 어느경로로 접근했을 때 container 를 연결해주는가 관련 

mysql:8 "이미지 이름: 태그"

 

docker ps 로 실행한 컨테니어 확인 가능 

실행한 컨테이너에 들어가야 할 경우가 생긴다.

내 의도와 다르게 동작이 안할 때, 접근이 안될 때 디버깅 하기 위한 경우 등이다. 

 

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

MySQL이 실행되고 있는지 확인하기 위해 컨테니어 진입 

Compute Engine에서 SSH와 접속하는 방식이 유사 

(-it interative하게 .. 기본적으로 쓰는 기능)

 

mysql -u root -p 

MySQL 프로세스로 들어가면 MySQL 쉘 화면이 보임 

 

작동을 멈춘 컨테이너는 docker ps -a 명령어로만 확인 가능 

(docker ps 는 실행중 컨테이너 목록만 보여줌)

; , exit 로 바로 빠져나올 수 있다. 

 

docker rm "컨테이너 이름(ID)"

멈춘 컨테이너 삭제 

(docker rm "컨테이너 이름(ID)" -f 로 실행중인 컨테이너도 삭제 가능 단, 언제나 실행중인건 유의할 것)

 

다시 한번 정리, 기본 명령어

그 외 

docker run 할 때 파일 공유 방법 

대표적으로 쥬피터 노트북과 연동해서 사용하기도 함. 

dockerhub에 공개된 모든 이미지를 다운받을 수 있음 

MySQL도 dockerhub에서 다운로드 

dockerhub에 웬만한 오픈소스들이 공개되어있고, 필요한 이미지를 찾아 실행

 

2) Docker 이미지 만들기 

폴더 만들어서 가상 환경 세팅과 FAST API package 설치 

 

FAST API 란? 

간단 예제를 실행해보자. 

pip freeze: 설치한 라이브러리를 모두 보여줌 

pip list --not-required --formate=freeze: 의존성에 따라 설치된 라이브러리는 보이지 않음 

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

 

Dockerfile(표준규격)라는 파일을 만들어 다음처럼 작성 (Docker Image를 빌드하기 위한 정보가 담김)

규격

내가 참고한 베이스 이미지 언급 (파이썬 중에도 가볍, 테스트할때는 가벼운게 속도도 빠르다.)

현재 폴더에 있는 모든 것들을 컨테이너 내부의 ./app 으로 옮겨오겠다는 뜻 즉 copy 

 

컨테이너 내부 앱에서 실행한다는 것을 의미 

컨테이너 내 환경변수 지정

파이썬 어플리케이션에서 두 값 지정 

 

실행할 리눅스 명령어

명령어가 나눠지면 각자 다른 레이어로 인식되어서 보통 이러한 건 하나의 레이어로 구성 

레이어가 늘어날 수록 시간 더 소요, 변경시 재실행 된다. 

 

run 이랑 CMD 차이 고민해보자. 

 

Docker build "Dockerfile이 위치한 경로"

- 이미지 생성 

- 아래 이미지에서 . 는 현재 폴더에 Dockerfile이 있음을 의미 

-t "이미지 이름:태그" 옵션으로 이미지 이름과 태그 지정할 수 있음 

태그는 미 지정시 "latest"로 채워짐 

docker images 명령어로 방금 빌드한 이미지 확인 가능 

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

방금 만든 이미지 실행! 

태그가 "latest"인 경우 생략 가능 

 

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

도커 이미지 만들기 정리 

그 외에 Dockerfile에서 사용하는 것 

- EXPOSE: 컨테이너 외부에 노출할 포트 지정 

- ENETRYPOINT: 이미지를 컨테이너롤 띄울 때 항상 실행하는 커맨드

 

 

 

3) Registry Docker Image Push 

 

4. Docker 이미지 배포 

1) Severless Cloud 서비스 

 

2) Compute Engine에 Docker image 배포하기 (Streamlit)

 

3) Docker Compose

Comments