애저 펑션 과 도커 컨테이너 가 만났 을 때 – Aliencube Community 
 Home > Microsoft Azure > Azure Container Services > 애저 펑션 과 도커 컨테이너 가 만났 을 때 
 Published Apr 16 , 2018 by Justin Yoo 
 이전 포스트 들 에서 우리 는 cmder 에 WSL Bash 를 연결 했 고 , 애저 CLI 도 설치 하 고 사용 해 봤 고 , 애저 CLI , 도커 , WSL 을 모두 연동 도 시켜 봤 고 , 애저 컨테이너 레지스트리 ( ACR ) 도 사용 해 봤 다 . 이번 포스트 에서 는 이 일련 의 포스트 중 마지막 으로 우분투 리눅스 기반 도커 컨테이너 에 애저 펑션 을 설치 하 고 , 이 를 애저 펑션 인 스턴스 로 설치 하 는 방법 에 대해 알아보 고자 한다 . 
 앞서 와 마찬가지 로 이번 포스트 에서 도 WSL 과 애저 CLI 를 이용 한다 . 
 서버리스 애플리케이션 과 컨테이너 기술 의 콜라보 
 서버리스 애플리케이션 의 가장 큰 특징 이 라면 서버 운영 환경 을 극한 으로 추상 화 시켜 개발자 는 아무 걱정 없이 비지니스 로직 에 만 집중 하 면 되 게끔 만들 어 주 는데 있 다 . 반면 에 컨테이너 기술 은 이러 한 서버 운영 환경 을 제공 하 는 데 촛 점 을 맞춘다 . 얼 필 보 면 이 둘 은 상당히 다른 방향 에서 진화 하 는 중 이 라 겹칠 이유 가 거의 없 는 것 처럼 보이 는데 , 어떻게 해서 서로 만나 게 된 것 일까 ? 
 우선 개발자 마다 저마다 개발 환경 이 달라지 면서 생길 수 있 는 문제점 들 을 방지 한다 . 개발 환경 , 테스트 환경 , 실 서버 환경 이 사실 은 아무리 같 게 맞춘다 하 더라도 달라질 수 밖 에 없 다 . 게다가 누구 는 윈도우 OS , 누구 는 맥 OS , 누구 는 리눅스 OS 등 개발자 마다 개발 플랫 폼 자체 가 다를 수 있 는데 , 이럴 때 컨테이너 기술 은 이러 한 모든 환경 을 하나 로 통일 시켜 주 는 역할 을 한다 . 다시 말 해서 개발자 의 개발 환경 과 개발 / 운영 서버 의 차이 등 을 하나 로 통합 해서 개발 할 수 있 게 해 주 는 역할 을 해 준다 . 이렇게 된다면 각자 코딩 은 저마다 의 환경 에서 하 겠 지만 , 실제 코딩 결과물 을 컨테이너 에 넣 어 배포 를 하 게 되 면 배 포시 뭔가 가 변경 될 수 있 는 가능 성 이 현저히 줄어들 게 된다 . 
 또 한 가지 쓰임새 는 애저 스택 환경 이 다 . 애저 스택 환경 에서 는 컨테이너 기술 을 통해 애저 펑션 을 운영 할 수 있 다 . 사실 애저 펑션 런타임 환경 을 우리 가 직접 설정 할 이유 는 거의 없 지만 이러 한 회사 내 네트워크 안 에서 서버리스 환경 을 구성 할 때 굉장히 편리 하 다는 장점 이 있 다 . 
 사실 , 이렇게 된다면 애저 펑션 환경 을 AWS 에서 도 구현 할 수 도 있 고 , 실제로 해 본 사람 도 있 다 . 하나 씩 차근차근 설정 해 나가 보 자 . 
 애저 펑션 CLI 설치 하 기 
 우선 WSL 안 에 애저 펑션 CLI 를 설치 해야 한다 . 애저 펑션 CLI 는 npm 또는 apt - get 명령 으로 손쉽 게 설치 할 수 있 다 . 설치 하 는 방법 은 이 페이지 를 참조 한다 . 설치 가 끝난 후 func 명령어 를 통해 설치 가 제대로 됐 는지 곧바로 확인 해 볼 수 있 다 . 
 애저 펑션 프로젝트 만들 기 
 이 포스트 에서 사용 한 코드 샘플 은 여기 에서 다운로드 받 을 수 있 다 . 
 애저 펑션 CLI 를 이용 해서 우선 애저 펑션 프로젝트 를 하나 만들 어 보 자 . 현재 디렉 토리 에 바로 프로젝트 를 생성 하 려면 func init . -- docker 명령어 를 입력 하 면 된다 . 여기 서 -- docker 옵션 을 주 게 되 면 도커 컨테이너 관련 DockerFile 파일 도 함께 추가 된다 . 이 파일 을 열 어 보 면 대략 다음 과 같이 생겼 다 . 
 하지만 여기 서 참조 하 는 기본 이미지 는 꽤 오래 된 것 이 라서 최근 애저 펑션 SDK 가 제대로 작동 하 지 않 기 때문 에 아래 와 같이 수정 해서 최신 기본 이미지 를 참조 하 게끔 한다 . 
 이제 . dockerignore 파일 을 만들 차례 이 다 . 이 파일 을 이용 하 면 커스텀 도커 이미지 를 만들 때 포함 시키 지 않 아도 될 불 필요 한 파일 을 정리 할 수 있 다 . 이 파일 의 내용 은 대략 아래 와 비슷 하 다 . 
 여기 까지 애저 펑션 도커 프로젝트 를 만들 었 다 . 
 애저 펑션 코드 작성 하 기 
 이제 기본 애저 펑션 코드 를 만들 어 보 자 . 비주얼 스튜디오 를 통해서 도 만들 수 있 지만 애저 펑션 CLI 를 이용 해서 도 만들 수 도 있 다 . 여기 서 는 애저 펑션 CLI 명령어 인 func new - l C # - t HttpTrigger - n [ FUNCTION _ NAME ] 을 통해 기본 HTTP 트리거 펑션 을 만든 다 . 그리고 그 결과 는 대략 아래 와 같 다 . 
 여기 서 function . json 파일 을 열 어 인풋 바인딩 섹션 에 " route ": " test " 값 을 추가 한다 . 그리고 , authLevel 값 을 기존 의 function 에서 anonymous 로 수정 한다 . 그 이유 는 이유 는 나중 에 다시 설명 하 도록 한다 . 
 도커 커스텀 이미지 생성 하 기 
 이제 기본 적 인 애저 펑션 소스 코드 는 준비 가 끝났으니 , docker build . - t [ DOCKER _ IMAGE _ NAME ] 명령어 를 통해 커스텀 도커 이미지 를 생성 한다 . 아래 와 같이 도커 이미지 가 생성 된 것 을 확인 할 수 있 다 . 
 실제로 이 도커 이미지 가 잘 돌아가 는지 확인 해 볼 차례 이 다 . docker run - it - p 8080 : 80 -- name [ CONTAINER _ NAME ] [ DOCKER _ IMAGE _ NAME ] 명령어 로 도커 컨테이너 를 생성 하 고 실행 시켜 보 자 . 
 포스트 맨 을 통해 실제로 실행 시켜 보 면 아래 와 같이 예상 했 던 결과 가 나타난다 . 
 주의 : 현재 까지 작업 해 본 결과 에 따르 면 C # 코드 를 이용 해서 애저 펑션 도커 이미지 를 만들 때 에 는 아직 까지 는 . csx 파일 , 즉 C # 스크립트 로 만 작동 하 지 , 컴파일 된 코드 , 즉 . dll 파일 을 이용 해서 는 작동 하 지 않 는다 . 아직 프리뷰 상태 인 점 을 감안 한다면 이 부분 은 차후 개선 될 것 으로 기대 한다 . 
 도커 허브 이미지 업로드 하 기 
 앞서 생성 한 커스텀 도커 이미지 를 이제 도커 허브 리포 지토리 로 업로드 할 차례 이 다 . 
 안타깝 게 도 현재 애저 펑션 리눅스 컨테이너 는 도커 허브 만 지원 하 고 아직 애저 컨테이너 레지스트리 는 지원 하 지 않 는다 . 이 역시 도 곧 해결 될 것 으로 기대 한다 . 
 먼저 도커 허브 에 업로드 하 기 위해서 는 커스텀 도커 이미지 에 태 깅 을 해야 한다 . docker tag [ DOCKER _ IMAGE _ NAME ] [ DOCKER _ ID ] / [ DOCKER _ IMAGE _ NAME ] 명령어 를 이용 한다 . 
 이렇게 만들 어 진 이미지 를 업로드 하 기 위해서 는 도커 허브 에 먼저 로그인 해야 한다 . docker login - u [ USERNAME ] - p [ PASSWORD ] 
 로그인 후 docker push [ DOCKER _ ID ] / [ DOCKER _ IMAGE _ NAME ] 명령어 를 통해 도커 허브 로 이미지 를 업로드 한다 . 
 실제 도커 허브 웹 사이트 에서 는 이렇게 보인다 . 
 애저 펑션 컨테이너 인 스턴스 생성 하 기 
 커스텀 도커 이미지 도 준비 가 끝났으니 이제 실제로 애저 펑션 컨테이너 인 스턴스 를 생성 할 차례 이 다 . 애저 CLI 를 이용 해서 az functionapp create - g [ RESOURCE _ GROUP _ NAME ] - n [ FUNCTION _ APP _ NAME ] - s [ STORAGE _ ACCOUNT _ NAME ] - p [ APP _ SERVICE _ PLAN _ NAME ] - i [ DOCKER _ ID ] / [ DOCKER _ IMAGE _ NAME ] 명령어 를 사용 하 면 곧바로 애저 펑션 인 스턴스 가 하나 만들 어 진다 . 
 이 명령어 를 실행 시키 기 전 에 이미 스토리지 어카운트 와 리눅스 용 앱 서비스 플랜 이 이미 준비 되 어 있 어야 한다 . 컨테이너 용 애저 펑션 은 컨 섬 션 플랜 은 아직 지원 하 지 않 고 앱 서비스 플랜 만 가능 하 다 . 
 애저 포탈 에서 도 이렇게 만들 어 진 애저 펑션 인 스턴스 를 곧바로 확인 해 볼 수 있 다 . 
 애저 펑션 인 스턴스 UI 로 이동 하 면 앞서 생성 한 TestHttpTrigger 가 등록 되 어 있 는 것 이 보일 것 이 다 . 
 마지막 으로 포스트 맨 에서 애저 펑션 인 스턴스 로 요청 을 날려 보 면 예상 했 던 결과 를 받 을 수 있 다 . 
 지금 까지 애저 펑션 인 스턴스 를 커스텀 도커 이미지 를 만들 고 실행 시키 는 방법 에 대해 살펴보 았 다 . 여전히 개선 해야 할 점 들 이 많이 보이 긴 하 지만 , 크로스 플랫폼 에서 돌아가 는 ASP . NET Core 를 기반 으로 애저 펑션 이 어떤 식 으로 돌아가 는지 대략 적 인 그림 을 그려볼 수 는 있 을 것 이 다 . 
 Previous Post 애저 컨테이너 레지스트리 기초 
 Azure CLI Azure Functions Container Cross Platform Docker Weird Meetup