1. Docker 간단 개념
Docker는 가상화된 서버에서 각종 라이브러리나 프로그램들을 단위체로 제공하는 오픈소스 플랫폼이다. 각 컴퓨터가 다른 운영체제(OS), 다른 프로그램 구성을 갖고 있고 이것들을 매번 설치하고 배포하고 관리하는 것이 번거롭다보니, 가상 서버에서 Image화하여 저장하고, container로 배포 및 구동하는 방식으로 개선한 것이다.
Image는 OS, 각종 프로그램들의 버전별 기록이라고 할 수 있다. Windows 10, v0.1 버전을 Image화 해놓고, 여러 서버 컴퓨터에 설치하다가 Windows 10, v0.2가 나오면 이걸 다시 image로 만들어서 container로 구동하고 다른 사람들이 사용하게 할 수도 있다. Image를 만들고, 이것을 복사한 instance들로 container로 배포하여 서버를 구동하는 방식으로 Docker가 작동한다.
가상화 서비스이지만 성능면에서 Local로 구동할 때와 거의 차이가 없다고 한다. 그리고 기존 가상화 서비스가 OS를 가상화한 환경을 제공하는 것과 달리, Docker는 각 Image만 가상화하여 제공하는 방식이라는 차이점이 있다.
2. VPS(Virtual Priavate Server) 대여 : 참고만
docker를 적용하기 위해서 가상 서버를 대여하는 VPS 서비스 중, VULTR[벌쳐]를 사용한다. VPS란 물리적인 서버 중 자원을 분리하여 가상으로 만든 작은 서버이다. VULTR는 처음 가입하면 무료로 크레딧을 제공해줘서 가상 서버 대여가 가능하다. 회원가입을 하고 서버를 대여하면 된다고 한다.
그러나, 나는 강의 내용과 달리 굳이 VULTR를 안쓰고 Local에서 Docker를 사용해볼 것이다. 아마 강의 후반부에 나오는 AWS 강의에서, 어짜피 AWS에다가 Docker를 설치하면서 가상 서버에 Docker를 설치할 것 같기도 하고 Local에서 사용하는 것도 이번 기회에 한 번 해보고 싶다!
3. Docker 설치 및 배포
Windows 환경이라 Docker Desktop을 다운로드 받아서 설치하면 된다. 특별히 커스터마이징할 것 없이 ok, 실행, 확인 등을 눌러가며 설치하면 된다. 내 경우에는 설치 이후에 "Docker is starting..."만 뜨면서 제대로 실행이 안됐었는데, stackoverflow에서 비슷한 문제를 발견하여 powershell로 명령어를 실행하여 해결했다. 대부분 오류나 에러 사항은 이미 사람들이 발견하고 해결해놓은 것 같다.
https://stackoverflow.com/questions/43041331/docker-forever-in-docker-is-starting-at-windows-task
설치를 완료했으면 cmd에서 $ docker 명령어를 입력해본다. 그럼 docker와 관련된 명령어 리스트가 조회된다. Docker Desktop을 실행 후, cmd에서 $ docker container ls를 입력해보면 구동 중인 container 리스트가 출력되는 것도 볼 수 있다. 물론 그냥 Docker desktop에서 봐도 되지만...
dockerhub: Portainer.io
docker에서 대부분 유명한 라이브러리들은 이미 image로 올라와있으며 버전 관리도 다 되있다. Maven Central처럼, docker도 dockerhub라는 곳이 있어서 이런 image들을 다운로드 받으면 바로 container로 구동할 수 있다.
https://hub.docker.com/search?q=
여기서 맨 처음 설치할 라이브러리는 portainer.io이다. CLI 기반으로 docker 명령어를 입력하는 대신, GUI(Graphic User Interface)로 docker의 image, conatiner, network 등 거의 모든 기능들을 사용할 수 있게 해준다. 초보자들에게 Docker의 전반적인 구성을 이해하는데 큰 도움을 준다.
portainer-ce 버전을 다운로드 받아야한다!
cmd창에서 사진의 명령어를 입력하면 portainer가 설치된다. 이제 docker desktop/Image 에서 portainer를 Run 하면 새로운 Container로 portainer를 실행할 수 있다.
SSH
cmd에서 $ ssh root@{서버 ip 주소} 를 입력하면 ssh를 이용해서 해당 서버로 접근이 가능하다. 서버 주소는 만약 VULTR와 같은 가상 서버 대여 서비스를 이용한다면 그곳에서 제공하는 ip 주소이고, 로컬에서 진행한다면 굳이 ssh로 접근하지 않아도 된다.
Portainer 설정
portainer를 위한 volume과 포트 연결을 진행한다.
https://install.portainer.io/be-standalone-wsl
위 링크에서 2개의 명령어를 보여주는데, 약간의 변경이 필요하다. 2번째 명령어에서 -p 9000:9000으로 해주었는데 이것중 첫 번째 포트 번호는 외부에서 서버에 접근 시 어떤 포트로 접근해야하는지를 설정해준다. 그리고 두 번째 9000번은 portainer가 내부적으로 사용하는 기본적인 9000번 포트를 의미한다.
맨 마지막 부분에 portainer/portainer-ce로 변경했다.(링크에서는 portainer-be:lastest)
docker volume create portainer_data
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
Portainer 접속
이제 portainer로 docker에 접근한다. 로컬에서 했다면 docker desktop에서 portainer.io 용 container가 잘 작동하는지 보고, 127.0.0.1:9000으로 접근하면 된다. 처음에는 admin의 계정 비밀번호를 설정하고, 이후 로그인 시 아래와 같은 portainer의 메인 화면으로 접근이 된다.
4. 서버 배포 : docker 이미지 만들기
이제 그동안 작성했던 django 프로젝트의 이미지를 만들고 container로 배포해본다.
4-1. requiremets.txt 작성 및 코드 배포
docker 서버에서 기본적인 django 프로젝트의 설정 및 실행을 할 수 있도록 할 것이다. 우선 가상환경 venv에서 설치했던 라이브러리의 리스트를 requirements.txt로 생성할 것이다.
pip list를 Terminal에 입력하면 venv 가상환경에 설치했던 라이브러리 리스트가 나온다.
이제 $ pip freeze > requirements.txt 라고 입력하여 해당 리스트를 requirements.txt로 리스트화 해준다. 이 파일을 github에 push해서 가상환경인 docker에서도 로컬에 설치했던 라이브러리들을 설치하도록 할 것이다.
requirements.txt를 포함하여 git에 push를 하자.
4-2. Dockerfile 작성
docker image 생성 시 기본적으로 삽입될 환경설정과 실행 내용을 Dockerfile 이라는 파일에 작성한다. django 프로젝트의 루트 디렉토리에 Dockerfile(첫 문자만 대문자) 파일을 생성하고 아래와 같이 적는다.
git 주소를 적상하고, SECRET_KEY는 .env에 숨겨두었던 값을 우선 적는다. 이 값은 당연히 배포되면 안되기 때문에 나중에 변경할 것이지만, 실습을 위해서 일단은 그대로 복사해와서 적는다.
FROM python:3.9.0
WORKDIR /home/
RUN git clone https://github.com/{git 주소}
WORKDIR /home/{git 주소 디렉토리 이름}
RUN pip install -r requirements.txt
RUN echo "SECRET_KEY=......" > .env
RUN python manage.py migrate
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
다음은 dockerfile command에 대한 간단한 설명이다.
- FROM - 베이스 image를 뭘 쓸지 결정. 기존 image를 상속받는 개념이다.
- RUN - command 실행
- WORKDIR- 디렉토리 이동. cmd에서의 cd와 같다고 보면 된다.
- EXPOSR - 포트 지정
- CMD - container가 실행될 때마다 실행할 명령어를 넣어준다.
4-3. portainer에서 image 생성, container 구동 및 접속
image 생성
portainer/image/build a new image에 들어가서 Upload 방식으로 Dockerfile 설정 정보를 넘긴다. 상기 작성하였던 Dockerfile을 올리면된다. 이름은 대략 django_test_image:1로 하는데, 콜론 뒤에 숫자를 붙여서 version으로 image를 관리할 수 있다. 처음 생성한다면 이미지 생성에 약간의 시간이 소요될 수 있다.
container 생성
이미지 생성 후, Containers 탭에 들어가서 name, image_name을 입력해준다. image_name은 image를 생성했던 이름이다. 그리고 아래에 회색 publish a new network port를 눌러서 host, container의 포트번호를 설정해준다. django는 기본으로 8000번 포트를 사용하므로 둘 다 8000번으로 지정해주면 된다. 이것은 portainer를 설치할 때와 마찬가지로 host는 서버 외부에서 접근 시의 post 정보, container는 container 내부의 port 정보를 의미한다.
Deploy the container 버튼을 누르면 container가 생성된다. container를 run 하고, localhost:8000에 접속하면 만들었던 django proejct의 화면이 나온다.
css, static 파일들이 제대로 매칭되지 않아서 화면이 좀 이상하다. 이 내용은 다음 글에서 nginx, gunicorn 등을 활용하여 해결한다.
참조
1. 작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지-박형석님 인프런 강의