TIL97. docker

Jaeyeon·2021년 5월 8일
0

docker?

  • Container Virtual Machine Service : 컨테이너 가상 머신 서비스
  • 컨테이너 가상화 기술이자 회사명이다.
    내 컴퓨터 안에 가상의 물리적 장치가 아닌 컴퓨터를 소프트웨어적으로 생성
  • 한대의 컴퓨터에 한가지 일만 시키기에는 남는 자원이 아깝다. 그래서 하나의 컴퓨터에 다량의 서버를 돌릴 수 있는 기술을 뜻한다.

VM ware : host OS (ex: mac OS, Linux etc..) 위에 똑같은 os를 만들기(하이퍼바이저) 때문에 무겁고 느리다.
도커(컨테이너) : 하이퍼바이저가 없기때문에 가볍고 빠르다.

  • 도커 이미지는 카세트 테이프
  • 도커 데몬(서버)은 카세트 플레이어 : 클라이언트에게 요청(명령어)을 받아서 수행을 해준다.
  • 이미지인 카세트 테이프를 카세트 플레이어에서 재생하는 동작 그리고 그로인해 나오는 결과물이 바로 컨테이너다.

내 코드를 이미지화 하고 다른사람이 깃헙에서 clone 받듯이 나의 코드 이미지를 클론 받으면 내 서버에서 돌아가는 것과 똑같이 돌아간다.
이미지 파일을 잘 가지고 있으면 재사용 가능 (확장성이 유연함)

  • 컨테이너는 영원하지 않다. 단일 프로세스로서 동작하고, 프로세서의 작업이 종료되면 컨테이너도 종료 된다. 마치, 음악 재생이 모두 끝나면 종료되는 것과 마찬가지이다.

  • 컨테이너 자체는 격리된 환경이기 때문에 conda(가상환경)을 따로 설치할 필요 없다.

docker 명령어

docker ps : 실행중인 컨테이너를 보여주는 커맨드
docker ps -a : 실행이 종료된 것을 포함해서 모든 컨테이너를 보는 커맨드 및 옵션
docker images : 생성된 혹은 다운로드 된 이미지를 보여주는 커맨드
docker build -t '도커 허브에 가입한 계정명/ 이미지명(프로젝트명 권장)':버전'. : 도커 이미지를 빌드하는 명령어 도커파일 사용
docker run --name '컨테이너 명''이미지 명' : 도커 컨테이너를 실행하는 명령어 완성된 이미지를 사용
docker run -it '이미지 명' /bin/bash : 도커 컨테이너를 실행시킴과 동시에 컨테이너에 접속해서 쉘을 실행시키는 명령어

docker 실습

  1. my_settings.py에 'NAME' : '데이터베이스명', 'HOST' : RDS 엔드포인트 주소 넣어주기
    (RDS에 my_settings.py에 들어간 데이터 베이스명이 생성되어 있어야 겠쥬?)

  2. source setting_up.sh 실행하기 (지훈님이 배포해주신 파일,세팅 부터 runserver까지 한번에!) 잘 실행 된다면 서버를 꺼도 좋다!

  1. 이미지 만들기 인데 -t는 태그를 의미하며 뒤에 나오는 영어는 이미지 이름(도커허브 계정명/프로젝트명) 을 얘기하고 0.1은 버전을 의미한다.

  1. 이미지가 만들어져있는것을 확인할 수 있다.

  1. 컨테이너를 실행시키는 것을 의미한다. (컨테이너 내에서의 runserver 같은 느낌)

-d 는 데몬을 의미한다. 데몬을 활용해서 컨테이너가 계속 유지될 수 있게 도와준다.
-p 는 포트를 의미한다. 포트포워딩을 의미한다. host OS port 8000번과 컨테이너의 포트 8000번을 연결해준다.
--name 뒤에 docker_train은 컨테이너의 이름을 의미(내가 아무렇게나 지을 수 있다)하며
그 뒤는 어떤 이미지를 컨테이너에 담을지 적는 것이다.

  1. docker ps를 통해 현재 열심히 돌아가고 있는 컨테이너를 확인 할 수 있다.

  1. 서버를 따로 켜지도 않았는데도 서버가 잘 돌아가는 것을 확인할 수 있다.
    컨테이너 안에서 실행되고 있는 서버에서 gunicorn을 통해 response를 해줬다는 것을 알 수 있다.

7-1. docker exec -it 컨테이너명 /bin/bash를 통해 컨테이너를 직접 들어가볼수도 있다.

  1. docker push 이미지 이름 을 입력하여 docker 레파지토리에 푸시를 한다.

  1. docker 레파지토리에 가서 확인해보니 잘 들어가있다..

  1. 내 EC2 서버(우분투)에 들어가 sudo를 붙힌 후 pull을 받는다.

  1. 우분투에서도 마찬가지로 컨테이너를 만든후 런서버를 돌린다.

  1. EC2에서도 나의 코드가 그대로 적용 되었다는 것을 볼 수 있다.

컨테이너 runserver를 끌 때 :docker stop 컨테이너 ID
컨테이너 자체를 지워버리고 싶을 때 :docker rm 컨테이너 ID
image를 지우고 싶을 때 :docker rmi 이미지 ID

최종적으로 EC2에서 배포를 위해 해야할 일

  1. my_settings.py에 RDS와 연결시켜놓기

    'NAME' : '데이터베이스명', 'HOST' : RDS 엔드포인트 주소 넣어주기

  2. 이미지화 하려면 무조건 Dockerfile 넣어놓기

  3. 내 host OS에서 프로젝트 이미지화 시키기

    docker build -t '도커 허브에 가입한 계정명/ 이미지명(프로젝트명 권장)':버전'.

  4. 도커 레포에 push 하기

    docker push '도커 허브에 가입한 계정명/ 이미지명(프로젝트명 권장)':버전'

  5. EC2 서버 접속해서 pull 받기

    sudo docker pull '도커 허브에 가입한 계정명/ 이미지명(프로젝트명 권장)':버전'

  6. 컨테이너를 만든 후 런서버 돌리기

    sudo docker run -d -p 8000:8000 --name 프로젝트명 '도커 허브에 가입한 계정명/ 이미지명(프로젝트명 권장)':버전'

  7. 배포 완료~!! 아이피 주소는 EC2 Public IP 주소를 알려주면 된다!

profile
생각하는 개발자 되기

0개의 댓글