Docker 1.5가 나온지 좀 됐고, IPv6 지원이랑 stats 명령 생긴게 눈에 띔. 이번 사내 배치 작업 하나 Docker로 넘겨봄. 기록.
앱은 파이썬 스크립트 하나 + 관련 패키지. Dockerfile 대충:
FROM python:2.7-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "worker.py"]
빌드 → private registry push → 서버에서 pull 해서 docker run -d. 기존 방식 대비 배포 절차가 간결해진거는 좋음.
근데 실사용하면서 걸린 것들.
1. 로그. docker logs 로 stdout 볼 수 있지만 파일로 남기려면 별도 수집 필요. 우리는 --log-driver=syslog 로 syslog에 쏨. rsyslog에서 파일로 저장하는 구조.
2. 네트워크. 호스트 모드 --net=host 쓰면 편한데 포트 충돌나면 빡침. bridge 모드 + -p 로 명시. link는 deprecated 느낌이라 피함.
3. 볼륨. -v /host/path:/container/path. 로그, 데이터 디렉토리는 반드시 호스트에 마운트. 컨테이너 날리면 같이 날아가니까.
4. 이미지 빌드 캐시. requirements.txt 먼저 복사하고 pip install, 그 다음에 소스 복사. 이렇게 해야 코드만 바뀐 경우 pip install 단계가 캐시 히트함. 알려진 팁이지만 매번 까먹음.
5. cleanup. 오래된 이미지랑 stopped 컨테이너가 계속 쌓임. cron으로 docker rm $(docker ps -aq -f status=exited) 및 docker rmi $(docker images -f dangling=true -q) 돌림.
서비스 서버 이관은 아직. 배치만 일단. 서비스는 여러 컨테이너 orchestration 필요한데 fig(→compose) 찍먹만 해봄. 다음에 정리.