개발 완전 초보의 도커 시작하기

 

도커는 내 컴퓨터 위에 새로운 컴퓨터를 하나 만드는 것과 같다.

아무것도 없는 A4용지에 내 입맛에 맞는 개발환경을 설정하는 것이라고 생각하면 된다.

 

1. 도커를 설치하자 www.docker.com 

docker version
docker

도커 설치 확인

docker라고 치면 docker 명령어 목록과 설명이 나온다. 

 

Enterprise Application Container Platform | Docker

Build, Ship, and Run Any App, Anywhere. Learn about the only enterprise-ready container platform to cost-effectively build and manage your application portfolio.

www.docker.com

 

2. 도커 Hub에 들어가고 가입도 하자 https://hub.docker.com/

도커 Hub은 도커 라이브러리 같은 곳이다.

도커의 이미지들이 public 하게 올라와 있고 이곳에서 이번에 사용할 django와 PostgreSQL을 가져올 수 있다.

django를 검색하고 제일 위에 나오는 페이지로 들어가면 django 이미지 사용 설명이 있다.

 

3. 장고 image 가져오기 (명령어: pull) 

이미지는 컨테이너를 만들 수 있는 설계도이다.

나만 사용할 수도 있고[private] 모두에게 공유할 수도 있다 [public ex) hub].

이미지에는 컨테이너 실행에 필요한 모든 것들이 설정되어 있고, 하나의 이미지로 여러 개의 컨테이너들을 만들 수 있다. 

docker pull django:latest

:latest는 최신버전으로 가져오라는 것이다 (docker pull django 까지만 해도 됨 default tag가 :latest일 것이다)

명령어를 실행하면 이렇게 나온다.

latest: Pulling from library/django
75a822cd7888: Pull complete
e4665cede9d1: Pull complete
202a45aa091c: Pull complete
7799136eb561: Pull complete
7a7f9ca3fd40: Pull complete
412f2d081014: Pull complete
Digest: sha256:5bfd3f442952463f5bc97188b7f43cfcd6c2f631a017ee2a6fca3cb8992501e8
Status: Downloaded newer image for django:latest

 

4. docker에 올릴 django application을 만든다.

자신이 접근하기 편한 폴더에 django app을 만든다. 

저는 Documents에 docker-django 폴더를 만들고 그 안에 django app을 만들었습니다.

user@user-ui-MacBook-Pro:~/Documents$ mkdir docker-django
user@user-ui-MacBook-Pro:~/Documents$ cd docker-django
user@user-ui-MacBook-Pro:~/Documents/docker-django$ django-admin startproject testapp

그러면 평소에 하던데로 장고 앱이 생기고 그걸 편집기로 열겠죠

도커에 올릴 장고 앱이 있으면 4번을 생략하고 그 장고 앱에 바로 도커 파일과 requirement.txt를 만들면 됩니다. 

 

5. django app에 도커파일 만들기

만든 장고앱에 Dockerfile이라는 이름의 파일을 만들고 다음과 같이 쓴다.

ARG PROJECT_DIR이 중요합니다.

이것은 도커의 directory를 만드는 것이고, 나중 단계인 내 컴퓨터의 directory와 docker 컨테이너의 directory를 정확하게 연결하는 과정에 쓰입니다. (testapp이라는 이름 대신 다른 directory를 만들어도 당연히 됩니다. "/자신이정한이름" )

 

6. requirements.txt 만들기

도커는 새로 컴퓨터를 만드는 것 같다고 위에 설명했는데 docker에는 django가 없으니 설치를 해주어야 합니다.

그러므로 django를 requirements.txt의 목록에 넣어줍니다.

 

7. 도커의 3가지 단계

도커를 돌리는 것은 3가지 단계로 나눌 수 있다.

    1) 내가 만든 app을 이미지로 만드는 단계 (명령어: build)

docker build -t kyuran-django .

-t는 --tag의 줄임말로 이미지에 이름을 붙여주는 것이다.

 

cf) 명령어 맨 뒤는 언제나 위치를 나타낸다. 

 .은 현재 폴더에 있는 도커 파일을 이미지로 만들겠다는 의미다. (나의 현재 위치는 ~/Documents/docker-django)

 ..이면 상위 폴더

 

...더보기

docker build 실행 결과

 

    2) 이미지를 컨테이너로 만드는 단계 (명령어: run)

 

컨테이너는 이미지가 실행된 상태라고 볼 수 있다.

컨테이너는 내 local에만 있는 것으로 공유할 수 없다.

docker run -it -p 8000:8000 --volume $(PWD):/testapp --name django1 kyuran-django

-it는 interaction으로 서버의 log를 확인하고 싶을 때 쓴다.

log를 확인하지 않아도 될 때는 -d를 쓴다. (detach)

 

-p는 --port의 줄임말이다. 컴퓨터(local)의 port와 docker의 port를 맞춰줘야 한다.

장고의 기본 port는 8000이다. 

앞의 8000이 local의 port

: (콜론)은 연결의 의미

뒤의 8000은 docker의 port다.

 

--volume은 가장 중요한 부분이다!

local 파일에서 수정한 내용이 docker에 적용이 되게 하기 위해서는

local의 디렉토리를 docker 컨테이너 내부의 디렉터리와 정확히 연결해야 하고

그 역할을 하는 것이 --volume이다.

$(PWD)는 현재 경로(local)

:는 연결

/testapp은 앞에 Dockerfile에서 만든 ARG PROJECT_DIR의 이름

--name은 컨테이너의 이름을 붙여주는 것 

django1 이라고 이름을 지었다.

 

마지막으로 어떤 이미지를 컨테이너로 만들 것인지 지정해 주어야 한다.

마지막에 kyuran-django는 이미지의 이름이다.

 

 

...더보기

docker run 실행 결과

migrate를 안했다고 나오는데 다른 terminal을 열어서 

docker exec -it django1 bash

bash로 들어가서 migrate를 해준다. 

root@9c749b72c39f:/testapp# 

이런 식으로 나올 것이다.

python manage.py migrate

 

cf) exec : docker 컨테이너에 접근

bash 상태에서 admin user를 만들 수 있다.

root@9c749b72c39f:/testapp# python manage.py createsuperuser

 

 

    3) 컨테이너를 켜고 끄기 (명령어: start, stop)

 

docker start -i django1

-i 는 log를 확인하고 싶을 때 사용한다. 

docker stop django1

 

컨테이너를 켜고 localhost:8000으로 들어가면 장고가 도커에서 잘 돌아가고 있는 것을 확인할 수 있다.

이제 장고앱을 계속 만들면 된다.

 

cf) image 없애기 (명령어: rm)

# rm 뒤에 없앨 이미지의 이름 입력
docker rm django1

이미지의 이름을 만들어주지 않으면 4edea98cd0d0 이런 식으로 이름이 만들어지는데,

docker images나 docker ps -a 명령어로 이름을 찾아야 한다.

 

cf) docker ps와 docker ps -a

docker ps를 하면 지금 실행되고 있는 이미지가 나오고 뒤에 -a를 붙이면 모든 이미지가 나온다.

(아래 결과 사진의 hello-world 이미지는 처음에 가져와본 이미지이고 postgreSQL은 아직 가져오지 않았으니 신경 쓰지 말자..)

user@user-ui-MacBook-Pro:~$ docker ps

 

user@user-ui-MacBook-Pro:~$ docker ps -a

 

도커를 왜 사용하는가?

 

개발을 하면서 필요한 library들을 local에 계속 설치하면 복잡해진다.

그래서 프로젝트마다 필요한 library만 설치하기 위해 가상의 환경을 사용하게 된다.

 파이썬을 할 때는 virtualenv를 루비는 rbenv를 사용해 보았을 것이다.

내가 만든 앱을 local에서만 잘 customize해서 사용할 때는 괜찮지만

나의 django app을 다른 사람의 컴퓨터에서 돌려보려면 복잡해진다.

그 사람의 컴퓨터에 virtualenv를 깔아야하고, 그 위에 pip install로 필요한 라이브러리를 깔고..

 

그러나 docker로 image를 만들면 한 번에 개발환경 세팅을 해결해 주기 때문에 간편하다.

즉 어떤 컴퓨터를 사용해도 동일한 환경에서 서버를 돌릴 수 있게 되는 것이다.

도커 만세!

 

 

+ Recent posts