[카카오 챗봇] 도커 사용하기

nayoon·2021년 1월 28일
0

boanbot

목록 보기
4/6

aws에 django 실행 환경을 만들고 봇테스트를 통해 구현하고자 했던 기능이 하나를 제외하고 전부 구현되는 것을 확인했다.

도커를 사용해보고 싶기는 한데, 낯설어서 도커에 관련해서 제대로 공부하고 구현하려고 한다.

참고한 사이트

  1. docker, docker-compose 설치
    https://soyoung-new-challenge.tistory.com/52
  2. docker compose 용어
    https://kin3303.tistory.com/18
  3. docker image build 과정
    https://darkrasid.github.io/docker/container/image/create/2017/04/19/docker-image-create.html

도커 시작하기

https://soyoung-new-challenge.tistory.com/52 를 참고해서 ec2 ubuntu에 도커를 설치하였다.

Container

  • 성능향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성

Docker Hub

  • 이미지를 저장하고 관리해준다.
  • 많은 회사들이 Docker로 소프트웨어를 배포하기 시작했고 공개 이미지들을 공유할 수 있다. - - Docker Hub를 이용하면 손쉽게 image를 pull받아 컨테이너에 적용시킬 수 있다.
  • (GitHub와 동일하게 생각해도 무관)
  • web app 이미지를 만들려고 한다면, ubuntu 이미지에 nginx를 올리고, web app을 올리는 것이 아닌 이미 만들어진 nginx 베이스 이미지에 web app을 롤려 이미지를 만들게 된다.

official images들이 docker hub에 나와있다.

version 명시가 없으면 latest(최신버전)으로 pull된다.

Image 앞에 Url이 없을 경우 Default로 Docker Hub에서 pull
Private Registry에서 받으면 앞에 Url 작성해야 함.

Docker Registry

  • Docker Hub처럼 공개된 방식이 아닌 비공개적으로 격리된 저장소
  • 위에서도 작성했듯이 Private Registry에서 image를 pull받고 싶다면 앞에 Url을 작성해야 함.

Docker Image

  • 도커 컨테이너를 만들기 위한 템플릿
  • 운영체제로 구성된 파일 시스템, 의존 라이브러리, 실행 환경의 설정 정보를 포함하는 아카이브 - 컨테이너를 실행할 수 있는 실행파일, 설정 값들을 가지고 있는 것

Dockerfile

  • 이미지를 구성하는 순서를 기술한 코드, 도커 이미지를 만들기 위한 설정 파일
  • 여러가지 명령어를 토대로 DockerFile을 작성하면 설정된 내용대로 Docker Image를 만들 수 있음.
  • 컨테이너에 담을 파일들은 Dockerfile 하위 디렉토리에 있어야 함.
  • Dockerfile 안에서 ADD 시 절대 경로는 사용 불가능

Docker 설치하기

> curl -fsSL https://get.docker.com/ | sudo sh

Dockerfile 구성요소

  • FROM
    도커 이미지의 바탕이 되는 베이스 이미지 지정, 이미지 빌드 시 여기에 지정된 이미지를 내려받는다.
  • MAINTAINER
    메인테이너 정보
    (메인테이너 - 기술을 운용하고, 관리하고, 보수하는 사람)
  • RUN
    도커 이미지가 실행되기 전에 수행할 쉘 명령어
  • ADD
    파일을 호스트에서 컨테이너로 복사하는 기능 + 추가하는 기능
    추가 기능이 문제가 되어서 추가 기능이 삭제된 COPY 명령어가 만들어짐.
    ADD [source][destination]
    (단순히 복사하는 기능 뿐만 아니라, [source]에 url을 입력하면 다운로드해서 컨테이너에 추가하게 되는데, 특정 포맷의 압축 파일이 [source]일 경우 압축을 해제한다. 압축 파일을 넘기고 싶은 경우 문제가 되었다.)
  • COPY
    파일을 이미지에 추가.
    ADD와 다르게 COPY는 압축 파일을 추가할 때 압축을 해제하지 않고, 파일 URL도 사용할 수 없음.
  • VOLUME
    디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정한다.
  • CMD
    컨테이너가 시작되었을 때 실행할 실행 파일 또는 쉘 스크립트이다.
    해당 명령어는 DockerFile 내 1회만 쓸 수 있다.
  • WORKDIR
    CMD에서 설정한 실행 파일이 실행될 디렉터리
  • EXPOSE
    호스트와 연결할 포트 번호
  • ENTRYPOINT
    ENTRYPOINT는 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행한다.
    docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행된다.
    ENTRYPOINT는 Dockerfile에서 단 한번만 사용할 수 있다.

Docker build (docker image 생성)

# Dockerfile 빌드 -> docker 이미지 생성
> docker build --tag boanbot:1.0 .
FROM ubuntu:latest
Sending build context to Docker daemon  204.3kB
Step 1/2 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
83ee3a23efb7: Pull complete
db98fc6f11f0: Pull complete
f611acd52c6c: Pull complete
Digest: sha256:703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715
Status: Downloaded newer image for ubuntu:latest
 ---> f63181f19b2f
Step 2/2 : MAINTAINER nayoonkym@gmail.com
 ---> Running in bcdb8aa44688
Removing intermediate container bcdb8aa44688
 ---> ad6b45a1f0b2
Successfully built ad6b45a1f0b2
Successfully tagged boanbot:1.0

docker image 생성 확인

docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
boanbot      1.0       ad6b45a1f0b2   About a minute ago   72.9MB
ubuntu       latest    f63181f19b2f   6 days ago           72.9MB

docker build 중 궁금한 점

# Dockerfile 빌드 -> docker 이미지 생성
> docker build --tag boanbot:1.0 .
FROM ubuntu:latest
Sending build context to Docker daemon  204.3kB
Step 1/2 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
83ee3a23efb7: Pull complete
db98fc6f11f0: Pull complete
f611acd52c6c: Pull complete
Digest: sha256:703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715
Status: Downloaded newer image for ubuntu:latest
 ---> f63181f19b2f
Step 2/2 : MAINTAINER nayoonkym@gmail.com
 ---> Running in bcdb8aa44688
Removing intermediate container bcdb8aa44688
 ---> ad6b45a1f0b2
Successfully built ad6b45a1f0b2
Successfully tagged boanbot:1.0

위와 같이 docker build 명령어를 실행하게 되면 궁금한 점은 Removing intermediate container ... 이다.
build 과정이 궁금했다.

> docker build
1. container가 만들어진다.
2. FROM에서 내려받아온 base image로부터 container를 하나 실행시킨다.
3. container로부터 image를 commit해서 image를 생성한다.
4. 그리고 쓸모없어진 container를 삭제한다.

실제 build 과정에 적용해보면 다음과 같다.

...
Status: Downloaded newer image for ubuntu:latest
 ---> f63181f19b2f # 최신 ubuntu image를 docker hub에서 내려받았다.
Step 2/2 : MAINTAINER nayoonkym@gmail.com
 ---> Running in bcdb8aa44688 # base image(f63181f19b2f)를 토대로 명령을 날려 만들어진 container
Removing intermediate container bcdb8aa44688 # 쓸모없어진 container 삭제
 ---> ad6b45a1f0b2 # 위에서 만들어진 container를 토대로 만들어진 image
Successfully built ad6b45a1f0b2 # 최종적으로 생성된 image, 쓸모없어진 image들은 모두 삭제
...

docker image를 살펴보면 다음과 같다.

> docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
boanbot      latest    c67d35f28f65   32 minutes ago      486MB
boanbot      1.1       f6e5a89e9d0e   7 hours ago         72.9MB
boanbot      1.0       ad6b45a1f0b2   7 hours ago         72.9MB
ubuntu       latest    f63181f19b2f   7 days ago          72.9MB

docker build 도중 많은 image가 생성되었지만 위와 같이 쓸모없어진 image들은 모두 삭제된 것을 알 수 있다.

실제로 Dockerfile 작성하기

# requirements.txt 만들기 (없다면 만들고, 있으면 다음을 진행한다.)
> pip freeze >> requirements.txt
> vim Dockerfile
# Docker Hub에서 official ubuntu 최신 이미지를 내려받는다.
FROM ubuntu:latest
# 메인테이너는 다음 사람이다. (간지나서 썼는데, 안써도 상관없음)
MAINTAINER nayoonkym@gmail.com
# 작업디렉토리는 /srv/boanbot이다.
WORKDIR /srv/boanbot
# apt-get update 명령어를 실행한다.
RUN apt-get update
# PIP
RUN apt-get update
RUN apt-get install -y python3.8 python3-pip --fix-missing
WORKDIR /srv/boanbot
COPY requirements.txt /srv/boanbot
RUN pip3 install -r requirements.txt
COPY . /srv/boanbot

docker-compose.yml

docker compose는 다중 컨테이너 애플리케이션을 정의하고 공유할 수 있도록 개발된 도구로
compose 정의 파일에 시스템 안에서 가동하는 여러 서버들의 구성을 모아서 정의한다.
기본적으로 docker-compose.yml은 프로젝트 최상위 디렉토리에 위치시킨다.

  • image
    docker image를 입력
    docker container의 기반이 되는 Base image를 지정하기 위한 키
    로컬에 이미지가 없으면 그 이미지를 원격 저장소에서 Pull해서 가져온다.
  • build
    dockerfile을 사용해서 image를 build할 경우 사용한다.
    dockerfile이 위치하는 경로를 표시한다.
  • command
    container 내에서 동작하는 command 사용 시 command 키를 사용한다.
    도커 파일 내부에 있는 CMD가 이미 있는 경우 이를 Override한다.
  • ports
    bind가 필요한 호스트 외부 포트와 컨테이너 내부 포트를 표시한다.
    < container port > 혹은 < host port >:< container port > 형식
    host port를 생략하고 container port만 지정하면 host port는 랜덤으로 지정된다.
  • volumes
    현재 디렉토리를 볼륨으로 마운트할 때 컨테이너에서 사용할 경로를 입력
  • depends_on
    서비스 간에 종속성을 설정
    웹 애플리케이션이 올라오기 전에 데이터베이스가 먼저 올라와야 한다면 web의 depends_on에 db를 표시하면 된다.
  • links
    container를 다른 service들과 연결 시 links 키를 사용한다.
  • environment
    환경 변수를 설정하기 위해 사용
    ex. mysql_user = nayoon
  • entrypoint
    컨테이너 내에서 동작하는 엔트리 포인트 지정 시 entrypoint 키를 사용한다.
    도커 파일 내부에 ENTRYPOINT가 이미 있는 경우 이를 Override한다.
  • services
    관련있는 컨테이너들을 묶을 경우 services 키를 사용한다.
    예를 들어 웹 서비스를 위해 FrontEnd, Application, Db같이 3가지 컨테이너가 필요할 경우 이를 services 하위에 정의한다.

docker-compose 설치

> sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
> sudo chmod +x /usr/local/bin/docker-compose
> sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
> docker-compose version
  docker-compose version 1.28.2, build 67630359

실제로 docker-compose.yml 작성

version: '3'
services:
  web:
   build:
    context: .
    dockerfile: Dockerfile
   ports:
     - 8080:8080
   command: /bin/sh -c "cd /srv/boanbot && python3 manage.py runserver 0.0.0.0:8080"

docker-compose 실행

> docker-compose up
  Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
  Creating network "boanbot_default" with the default driver
  Building web
  Sending build context to Docker daemon  204.3kB
  Step 1/10 : FROM ubuntu:latest
   ---> f63181f19b2f
  Step 2/10 : MAINTAINER nayoonkym@gmail.com
   ---> Using cache
   ---> ad6b45a1f0b2
  Step 3/10 : WORKDIR /srv/boanbot
   ---> Using cache
   ---> f6e5a89e9d0e
  Step 4/10 : RUN apt-get update
   ---> Using cache
   ---> a91860c52766
  Step 5/10 : RUN apt-get update
   ---> Using cache
   ---> a0a9d74c419f
  Step 6/10 : RUN apt-get install -y python3.8 python3-pip --fix-missing
   ---> Using cache
   ---> a852e9271db0
  Step 7/10 : WORKDIR /srv/boanbot
   ---> Using cache
   ---> f8d76cc5ac13
  Step 8/10 : COPY requirements.txt /srv/boanbot
   ---> Using cache
   ---> be36485092e9
  Step 9/10 : RUN pip3 install -r requirements.txt
   ---> Using cache
   ---> bb73af43b403
  Step 10/10 : COPY . /srv/boanbot
   ---> a44f8d987580
  Successfully built a44f8d987580
  Successfully tagged boanbot:latest
  WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
  Creating boanbot ... done
  Attaching to boanbot
  boanbot | Watching for file changes with StatReloader
  boanbot | [28/Jan/2021 02:55:45] "POST /call/ HTTP/1.1" 200 1674

지구촌 사람들과 함께.. 도커실행에 성공하였다..

> docker-compose up -d
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Starting boanbot ... done
Starting boanbot_nginx_1 ... done
profile
뚜벅뚜벅 열심히 공부하는 개발자

0개의 댓글