weekly learning2019. 7. 7. 16:55

도커로 배포하기


수업 시간에 많은 배포 방식을 배웠다. aws, pythonanywhere, heroku, elastic beanstalk ...


그 마지막인 도커에 대해 정리 해보자.


도커는 virtualBox와 같은 가상 컴퓨팅 환경과 비슷한 컨테이너 서비스이다.


과거에는 LXC(Linux Container) 방식으로 구현되어 리눅스 시스템이 아닌 곳에서는 도커를 사용하지 못했지만, runC라는 방식으로 변경이 되어 윈도우, 맥, 리눅스 등 다양한 운영체제에서 도커 시스템을 사용할 수 있다.


도커를 사용하려면 도커 CLI가 설치되어 있어야 한다.


먼저 도커허브에 가입하자.

https://hub.docker.com


리눅스에서 도커 설치 방법

리눅스에서는 간단한 명령어로 도커를 설치할 수 있다.

$ curl -s https://get.docker.com/ | sudo sh


만약 curl이 없다면

 $ sudo apt-get -y install curl


도커를 관리자 계정으로 실행해야 하는 번거로움을 없애기 위해 아래 명령 실행

$ sudo usermod -aG $USER


docker 명령을 실행해 옵션이 나타났다면 잘 설치가 된 것.


맥에서 도커 설치

맥의 경우 도커허브 첫 화면에서 Get started with Docker Desktop 버튼을 클릭해 다운로드를 받는다.


다운 받은 파일을 실행해 도커 데스크톱을 설치한다.


다운받은 이미지를 실행해 도커를 Applications 폴더로 복사하면 설치가 끝난다.


도커를 실행하면 권한이 필요하다는 메시지가 나오는데 비밀번호 입력창이 나타나면 계정 비밀번호를 입력한다.


모든 과정이 완료되면 로그인창이 뜨는데 로그인 후 터미널에서 docker 라는 명령어를 실행하면 위 리눅스와 같은 옵션 목록이 나타나면 정상 설치가 된 것이다.


이제 도커를 사용해서 ubuntu 18.04 가상 컨테이너를 사용해 보자.


run이라는 명령어를 사용하여 이미지명을 지정하고 새로운 컨테이너를 실행할 수 있다.


주의할 점은 도커 컨테이너는 프로세서가 돌고 있는 동안만 유효하다.


$ sudo docker run ubuntu:18.04


위 명령을 실행하면 우분투 이미지를 다운로드하고 컨테이너를 실행하게 된다. 현재 로컬에 있는 이미지 목록을 보려면 다음 명령을 실행한다.

$ docker image ls



우분투의 배시 쉘을 실행해 보자.

 $ docker run --rm -it ubuntu:18.04 bin/bash


--rm : 실행 종료 후 컨테이너 제거

-it : 쉘을 실행할 경우 표준 입출력 연결


이제 원하는 명령을 컨테이너에 전달할 수 있다.


nginx를 설치하고 테스트 해보자.


nginx를 설치하고 테스트하려면 포트 포워딩이 필요하다. run 명령어에 -p 옵션을 넣으면 포워딩 포트를 지정할 수 있다.

$ docker container run --rm -it -p 8080:80 ubuntu:18.04 bin/bash
$ apt-get -y update
$ apt-get -y install curl
$ apt-get -y install nginx
$ nginx -v
$ service nginx start



nginx -v : 버전 확인을 위한 명령어


웹 브라우저에서 로컬호스트에 8080 포트를 이용해 접속해보자.


호스트의 8080 포트느는 컨테이너의 80 포트로 포워딩 되기 때문에 nginx의 환영 메시지를 확인할 수 있다.

$ service nginx start



이제 원하는 이미지를 베이스로 추가 프로그램 설치를 진행하여 최종 이미지를 생성해 보도록 하겠다.


FROM은 베이스가 되는 이미지, MAINTAINER는 본인 이메일, RUN은 이미지 생성시 실행할 명령어를 입력한다.

 $ vim Dockerfile.base

FROM ubuntu:18.04
MAINTAINER linux@linux.lix
RUN apt-get -y update
RUN apt-get -y install nginx

CMD ["nginx", "-g", "daemon off;"]


위의 파일을 기반으로 새로운 이미지를 생성한다.

$ docker image build -f Dockerfile.base -t peaceful/django:1.0 .

peaceful/django:1.0 : 계정명/이미지명:버전명


생성된 이미지를 목록에서 확인해 보자.

$ docker image ls




생성된 이미지로 컨테이너를 실행해 보자.

$ docker container run -it --rm -p 8080:80 peaceful/django:1.0


웹 브라우저로 접속하면 nginx가 실행되어 있는 것을 확인할 수 있다.


실행되어 있는 컨테이너 목록을 확인하려면 다음 명령어를 실행한다.


컨테이너에 추가 명령을 전달하려면 container id나 name을 사용하기 때문에 목록을 확인할 필요가 있다.


별도로 일므을 지정하지 않고 컨테이너를 실행하면 자동으로 이름이 만들어 진다.

$ docker container ls


실제로 웹 서버를 배포할 때는 nginx와 uwsgi가 모두 동작하는 형태로 배포해야 한다.


도커의 특성상 하나의 프로세스만 동작하는 명령을 실행할 수 있고, 동작하고 있는 프로세스가 없는 경우 컨테이너는 종료된다.


이런 문제를 해결하기 위해서 supervisor라는 모듈을 사용할 수 있다.


도커 파일을 수정해서 supervisor를 설치하고 설정 파일을 복사하는 명령어를 입력한다.

$ vim Dockerfile.base

RUN apt-get -y update
RUN apt-get -y install supervisor
ADD ./conf/supervisord.conf /etc/supervisor/supervisord.conf

CMD ["/usr/bin/supervisord"]


supervisord.conf 파일을 작성하기 위해 다음 명령을 입력한다.

$ mkdir conf
$ vim conf/supervisord.conf

[supervisord]
nodaemon=true

[program:nginx]
command = nginx -g "daemon off;"


새로운 내용으로 이미지를 만들어 보자.

$ docker image build -f Dockerfile.base -t peaceful/django:2.0 .


만약 캐시 때문에 문제가 발생한다면 --no-cache 옵션을 더해준다.

$ docker image build --no-cache -f Dockerfile.base -t peaceful/django:2.0 .


새로운 이미지로 컨테이너를 실행해 보자. 컨테이너가 실행되고 있을 때 웹 브라우저에서도 정상 응답이 있는지 확인해 보자.

$ docker container run --rm -it -p 8080:80 peaceful/django:2.0



아래 명령어를 이용해 도커 로그인 정보 파일을 만든다

$ docker login


이제 ~/.docker/config.json 파일이 만들어졌을 것인데, 해당 파일을 S3 버킷을 만들어 업로드 한다.


eb init 명령을 실행한다.

$ eb init


Dockerrun.aws.json 파일을 만들어 필요 내용을 입력한다.

{
     "AWSEBDockerrunVersion": "1",
     "Authentication": {
         "Bucket": "nginx-docker",
         "Key": "config.json"
     },      
     "Image": {
         "Name": "peaceful/django",
         "Update":"true"
     },      
     "Ports": [
         {
             "ContainerPort": "80"
         }       
     ],
     "Logging": "/var/log"
 } 


aws의 elastic beanstalk 페이지에 설정 파일을 업로드 하고 환경을 추가한다.


eb list 명령을 이용해 환경 목록을 확인한다.

$ eb list


eb deploy 명령을 실행한다.

$ eb deploy [환경명]


이번 주 부터는 한 달간 타 스쿨 분들과 함께 프로젝트를 진행하는 기간이다.


이미 프론트, ios 분들과 어떤 사이트를 만들지 얘기가 끝난 상태이며, 같은 백엔드 분들과 기본 모델링을 작성 중에 있다.


얘기를 하면서 느낀 것은 모두 적극적으로 임하는 것이 보기 좋았고, 좋은 결과물이 나올 것이라는 느낌이 든다.


그리고 이번 주 수요일에 ERD 특강이 있었는데, 사실 시간대비 그닥 도움은 안되었다. ERD에  대한 내용보다 데이터베이스의 중요성 등 외적인 이야기를 많이 해서 ERD에 대해 많이 알지 못했다.


다음 주 수요일에 마지막 특강이 있는데, 그 때는 ERD에 대해 좀 더 집중해서 수업이 진행되었으면 한다.


Posted by gawain