aws에 django 실행 환경을 만들고 봇테스트를 통해 구현하고자 했던 기능이 하나를 제외하고 전부 구현되는 것을 확인했다.
도커를 사용해보고 싶기는 한데, 낯설어서 도커에 관련해서 제대로 공부하고 구현하려고 한다.
https://soyoung-new-challenge.tistory.com/52 를 참고해서 ec2 ubuntu에 도커를 설치하였다.
- 성능향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성
- 이미지를 저장하고 관리해준다.
- 많은 회사들이 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 Hub처럼 공개된 방식이 아닌 비공개적으로 격리된 저장소
- 위에서도 작성했듯이 Private Registry에서 image를 pull받고 싶다면 앞에 Url을 작성해야 함.
- 도커 컨테이너를 만들기 위한 템플릿
- 운영체제로 구성된 파일 시스템, 의존 라이브러리, 실행 환경의 설정 정보를 포함하는 아카이브 - 컨테이너를 실행할 수 있는 실행파일, 설정 값들을 가지고 있는 것
- 이미지를 구성하는 순서를 기술한 코드, 도커 이미지를 만들기 위한 설정 파일
- 여러가지 명령어를 토대로 DockerFile을 작성하면 설정된 내용대로 Docker Image를 만들 수 있음.
- 컨테이너에 담을 파일들은 Dockerfile 하위 디렉토리에 있어야 함.
- Dockerfile 안에서 ADD 시 절대 경로는 사용 불가능
> curl -fsSL https://get.docker.com/ | sudo sh
- 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에서 단 한번만 사용할 수 있다.
# 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 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
# 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들은 모두 삭제된 것을 알 수 있다.
# 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는 다중 컨테이너 애플리케이션을 정의하고 공유할 수 있도록 개발된 도구로
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 하위에 정의한다.
> 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
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 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