TIL - docker

김영훈·2021년 5월 8일
0

ETC

목록 보기
12/34

# Docker란?

  • Docker는 가상화 기술이다. 한 문장으로 정의할 수 있는 개념은 아니지만, 짧게 요약해보면 Docker는 독립된 가상화 container에 application을 담아 배포를 자동화시켜주는 오픈소스 엔진이다. 배포할 application을 container에 담기 위해선 application을 image로 만드는(빌드하는) 과정이 필요하다.

  • 독립된 container는 서로에게 영향을 미치지 못한다. 그래서 서로 버전이 다른 프로그래밍 언어를 사용하는 애플리케이션이 있어도, 각자를 다른 container에 담으면 충돌 없이 server에서 동작시킬 수 있다.

  • 즉, 도커는 소프트웨어가 실행될 수 있는 환경을 컨테이너라는 패키지로 추상화하여 실행 중인 환경에 구애받지 않고(장점) 동일하게 애플리케이션을 신속하게 배포, 확장, 관리할 수 있습니다.

    1. 가상화란?
      • 가상 이미지로 불법 다운로드 게임 실행하는 것과 비슷한 개념
      • 실제 컴퓨터가 존재하는 것처럼 물리적 장치가 없는 컴퓨터를 소프트웨어적으로 만들어내는 것
    2. 사용 이유
      • 한 대의 컴퓨터에 한 가지 일만 시키기엔 자원이 아까워서…
      • server 안의 패키지나 프로그래밍 언어를 설치, 삭제, 업그레이드하는 등의 번거로움에서 벗아날 수 있다. 대신 필요한 컨테이너만 교체해주면 된다.
    3. docker의 차별화 포인트
      • 기존의 가상환경은 하이퍼바이저와 같은 지나친 간섭이 존재
      • 반면 도커는 이러한 문제점에서 다소 자유롭다.(부팅 필요x, 속도가 비교적 빠름)
      • 초심자가 편하게 배울 수 있다.
  • Docker 사용하기 전 필수 준비 사항

    • Docker 회원 가입: https://docker.com
    • Docker 설치
    • AWS EC2 인스턴스 생성
    • AWS RDS 생성

# Dockerfile 생성하기

  • Dockerfile 생성

    • 배포하려는 application 폴더(django의 경우 root directory)에 Dockerfile 생성
      • touch Dockerfile
    • 아래의 내용을 파일 내부에 붙여넣기
    #./Dockerfile
    FROM python:3 
    #기반이 될 이미지
    
    # 작업디렉토리(default)설정
    WORKDIR /usr/src/app 
    
    ## Install packages
    #현재 패키지 설치 정보를 도커 이미지에 복사
    COPY requirements.txt ./ 
    #설치정보를 읽어 들여서 패키지를 설치
    RUN pip install -r requirements.txt
    
    ## Copy all src files
    #현재경로에 존재하는 모든 소스파일을 이미지에 복사
    COPY . . 
    
    ## Run the application on the port 8080
    #8000번 포트를 외부에 개방하도록 설정
    EXPOSE 8000   
    
    #CMD ["python", "./setup.py", "runserver", "--host=0.0.0.0", "-p 8080"]
    #gunicorn을 사용해서 서버를 실행
    CMD ["gunicorn", "--bind", "0.0.0.0:8000", "example.wsgi:application"]  
    • 파일 내용 수정

      • CMD ["gunicorn", "--bind", "0.0.0.0:8000", "example.wsgi:application"]"example.wsgi:application" 부분을 본인의 application 이름(프로젝트 이름)에 맞게 수정한다.(application 이름이란 django-admin startproject 폴더 이름으로 생성했던 폴더 이름을 가리킨다)

      • ex) CMD ["gunicorn", "--bind", "0.0.0.0:8000", "herhouse.wsgi:application"]

# my_settings.py 설정

  • Name(RDS 서버 내부의 데이터베이스 이름), password 설정
  • secret은 대충 그럴듯한 문자열을 입력해도 무방
  • 본인 RDS 엔드포인트를 host에 입력하기

import re
import pymysql

pymysql.install_as_MySQLdb()

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '[데이터베이스 이름]',
        'USER': 'root',
        'PASSWORD': '[비밀번호]',
        'HOST': '[RDS 엔드포인트]',
        'PORT': '3306',
    }
}
SECRET_KEY = '[secret key]'

ID_NUMBER_CHECK = re.compile('[0-9]')
PHONE_NUMBER_CHECK = re.compile('^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$')
NAME_CHECK = re.compile('[a-zA-Z0-9~!@#$%^&*()_+-={}<>,.?//:;\[\]"각-힣]')
EMAIL_CHECK = re.compile('^[a-zA-Z0-9+-_]+@[a-z]+\.[a-z]+\.*[a-z]*')
  • requirements.txt에 설치가 필요한 module 목록 추가하기
    • pip freeze로 가상환경에 설치된 module 목록을 확인한 뒤, requirements.txt 파일에 목록을 붙여넣는다.
    • 모듈 gunicorn이 없다면 추가해주자.
    • Apple M1 사용자라면 모듈 PyMySQL을 추가해주자.

# Docker 이미지 생성하기

  • 도커 파일을 이용해 이미지 빌드하기

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

    • ex) docker build -t wecode/wecodeproject:0.1.0 .

      • --tag(또는 -t) 옵션은 새로 생성할 이미지 이름을 지정한다. 여기서는 리포지토리 이름으로 wecode/wecodeproject를 사용하고 태그로 0.1.0을 사용했다.

      • 마지막에 점(.)은 Dockerfile의 위치를 경로로 지정한다. 파일 이름이 Dockerfile이 아닌 경우 --file(또는 -f) 옵션을 사용해서 파일 이름을 지정한다.

Dockerfile이 위치한 디렉토리에서 위 명령어를 실행하면 다음과 같이 새로운 도커 이미지를 생성한다. docker images 명령어로 새로 생긴 이미지를 확인할 수 있다.

  • 만약 맥북 M1을 사용 중이라면... 애플실리콘은 ARM으로 기존 x86_64 아키텍쳐와 설계방식 및 프로그램의 동작 방식이 다르기 때문에 아래의 명령어로 빌드해야 한다.

    • docker buildx build --platform=linux/amd64 -t {image name}:{tag name} {Dockerfile path}
    • ex) docker buildx build --platform=linux/amd64 -t wecode/wecodeproject:0.1.0 .
  • 빌드된 이미지 실행

    • docker run --name '컨테이너 명' -d'데몬으로 실행하기 위한 옵션' -p '호스트 포트':'컨테이너 포트' '이미지명'
    • ex) docker run --name wecode01 -d -p 8000:8000 wecode/wecodeproject:0.1.0
      • -p 8000:8000 : 내 노트북의 8000포트와 docker 서버의 8000 포트를 연결 —> 내 노트북으로 통신이 들어오면, docker 서버로 연결됨) —> port fowarding
      • 로컬 호스트 서버가 docker 서버와 연결되는지를 postman이나 httpie로 직접 확인해보자.
        • ex) http -v GET localhost:8000/store/category
  • 빌드된 이미지에 이상이 있을 경우

    • docker run -it wecode/wecodeproject:0.1.0 /bin/bash
    • 위의 명령어를 실행하면 이미지를 기반으로 바로 컨테이너를 실행하면서 접속한다.
    • process 등 여러가지를 살펴보면서 현재 서버에 어떤 문제가 있는지 알 수 있다. 하지만 수정은 컨테이너에서 하는게 아닌 이미지를 다시 빌드 해야한다.
  • 컨테이너 전부 삭제하는 명령어

    • MacOS : docker rm $(docker ps -a -q)
    • ubuntu : sudo docker rm $(sudo docker ps -a -q)
  • 이미지 전부 삭제하는 명령어

    • MacOS : docker rmi $(docker images -q)
    • ubuntu : sudo docker rmi $(sudo docker images -q)
  • 그밖에 docker 실행을 위해 필요한 명령어

    • docker ps : 실행중인 컨테이너를 보여줌
    • docker ps -a : 실행이 종료된 것을 포함해서 모든 컨테이너를 보는 커맨드 및 옵션 / container ID 확인이 가능하다.
    • docker images : 생성된 혹은 다운로드 된 이미지를 보여주는 커맨드 / image ID 확인이 가능하다.
    • docker images -a: 모든 이미지를 보여주는 커맨드 및 옵션)
    • docker rmi [image ID] : 해당 이미지 삭제
    • docker rm [container ID]: 해당 컨테이너 삭제
    • docker start [container name] : 해당 컨테이너 시작
      • ubuntu에서 사용할 땐 명령어 맨 앞에 sudo 를 붙이면 된다.
    • docekr stop [container name] : 해당 컨테이너 중지
      • ubuntu에서 사용할 땐 명령어 맨 앞에 sudo 를 붙이면 된다.

# Docker 이미지 배포 및 다운로드

  • 생성한 이미지 배포

    • docker login
    • docker push [이미지 이름]:0.1 or :0.1.0
  • 배포한 이미지 다운로드

    • EC2 인스턴스 접속하기
      • aws_key_pair가 저장된 폴더로 이동 —> ssh -i [key_par 이름].pem ubuntu@IPv4 퍼블릭 IP
        • ubuntu는 EC2 환경에 기본으로 생성된 username이다.
    • EC2 내부에 Docker 설치
    sudo apt update
    sudo apt install apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
    sudo apt update
    apt-cache policy docker-ce
    
    sudo apt install docker-ce
    • docker 로그인

      • docker 설치가 완료됐으면 sudo docker login으로 docker에 로그인을 한다.
      • sudo를 붙여주지 않을 경우 docker에 접근할 수 없을 수 있으므로 반드시 입력해주자
    • 이미지 다운로드(pull)

      • sudo docker pull [이미지 이름]:0.1 or :0.1.0
      • ex) sudo docker pull fcfargo/herhouse_project:0.1
    • 이미지 실행

      • sudo docker run -d -p 8000:8000 [이미지 이름]:0.1 or :0.1.0
      • ex) sudo docker run -d -p 8000:8000 fcfargo/herhouse_project:0.1
    • 서버 접속

      • EC2 인스턴스의 Pv4 퍼블릭 IP로 통신을 요청하면, 다운로드된 이미지(배포한 django 프로젝트)로 구현한 서버실행되는 것을 확인할 수 있다.
      • 당연한 얘기지만 docker 이미지를 실행시킬 땐, 가상환경을 활성화 할 필요가 없다.
      • EC2 접속 끊기: control + d
profile
Difference & Repetition

0개의 댓글