data engineering

docker 삽질.

qkqhxla1 2017. 4. 25. 20:08

앞에 getting started를 해봤지만 그것만 가지고서 뭔가를 만들어보려면 본인이 이해하기 전까지 삽질을 해야 한다. 삽질한 내용을 정리했다.


난 파이썬의 웹 프레임워크 sanic(flask같은거라고 생각하면 된다.)을 도커로 설치해보려고 했다. sanic은 3.5버전 이상에서 돌아간다. 그런데 현재 맥북에 파이썬 2버전대가 깔려있다. 3버전도 설치하려다가 환경변수가 매우매우 꼬일것같은 느낌을 받아서... 도커도 정리할겸 도커로 설치해보기로 결심했다.


도커로 삽질한점도 적고, sanic getting started를 도커에서 돌리는게 목표다.


도커로 삽질하면서 깨달은점.

1. 도커로 docker-compose up으로 실행하면 도커가 c에서 코드를 컴파일하듯이 빌드된다. 그 이후로는 빌드한게 실행되므로(확실하지 않음) 뭔가 설정이 바뀌었다. 싶으면 매번 docker-compose build명령어로 빌드 해준다.


2. docker-compose up으로 도커를 실행할때 항상 현재 파일안에 있는 도커 파일들로 구성되어 도커를 실행한다. 즉 다른 프로젝트를 도커로 돌리고 싶으면 도커용 파일을 하나 더 만들어서 그 안에다가 Dockerfile이라던지, docker-compose.yml이라던지 새로 만든다.


3. docker ps -a 로 현재 어떤 프로세스가 돌아가고 있는지, 돌아갔었는지 확인할수 있다. 지울땐 docker rm 프로세스id로 지울수 있다.


나머지는 하면서..


sanic을 설치한다고 하였다. 앞의 http://qkqhxla1.tistory.com/882 에서 난 내 개인적인 docker라는 폴더 안에 composetest를 만들었는데, 새 프로젝트를 만들 것이므로 docker폴더 안에 sanic이라는 폴더를 만들었다. 

sanic폴더 안에서..


첫번재로 파이썬 소스인 app.py를 만들고 그 안에 코드를 넣는다. (아래 보면 포트 번호 5000번으로 줬다. 8000이 아니라)

from sanic import Sanic
from sanic.response import text
 
app = Sanic()
 
@app.route("/")
async def hello(request):
    return text("Hello World!")
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

Dockerfile을 만들고 그 안에 

FROM python:3.5

ADD . /code

WORKDIR /code

RUN pip install -r requirements.txt

CMD ["python", "app.py"]


요렇게 넣는다. 앞의 도커 예제와 달라진 점은 가장 위의 FROM python:3.5부분인데, 이건 당연히 눈치챘겠지만 파이썬 3.5버전으로 돌리겠다는 소리이다.(sanic은 3.5부터 돌아간다.) 그런데 앞에는 python 3.4-alpine이었는데 alpine이런건 뭐지..? 라고 생각한다면 https://hub.docker.com/_/python/ 를 보면 된다. python-alpine말고도 slim등 다양한게 있으며, 왜 이런지 설명되어있다. 예로 slim은 python의 최소 패키지만 포함시킨다고 한다.


requirements.txt에는 sanic만 있으면 되므로

sanic만 적어주고 나온다.


docker-compose.yml파일에는

version: '2'

services:

    web:

        build: .

        ports:

            - "5000:5000"

        volumes:

            - .:/code


이렇게 적어준다. 앞에서는 redis가 필요해서 

redis:

image: "redis:alpine"

라인이 더 있었는데 이 뜻은 도커 홈페이지에서 redis를 검색하면 나오는


https://hub.docker.com/search/?isAutomated=0&isOfficial=0&page=1&pullCount=0&q=redis&starCount=0


에서 첫번재 공식 redis링크로 들어가면 redis:alpine이 공식 이미지라고 설명이 나와 있다. 왜 redis만 이미지가 필요하냐고 묻는다면 flask나 지금 현재 설치하려는 sanic은 파이썬에서 돌리는게 가능하지만 redis는 이미지가 더 필요하기 때문인것같다.


그리고 ports의 인자는 도커의 5000번 포트를 호스트의 5000번 포트로 포워딩하겠다는 뜻이라고 한다. 위의 sanic 소스코드를 보면 알수있듯이 5000번 포트에서 실행한다. 그러니까 5000번을 포워딩해줘야 제대로 진입이 가능하다.


저 후에 docker-compose up명령어로 실행시키고 http://0.0.0.0:5000/ 로 들어가보면 Hello World!가 잘 보인다.

'data engineering' 카테고리의 다른 글

oozie workflow 기본과 삽질한 내용들  (0) 2017.06.04
mapreduce(맵리듀스)란?  (0) 2017.05.20
redis 기초.  (2) 2017.04.20
index (mongodb)  (0) 2017.04.20
docker getting started  (0) 2017.04.17