개발 완전 초보의 도커 시작하기
도커는 내 컴퓨터 위에 새로운 컴퓨터를 하나 만드는 것과 같다.
아무것도 없는 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을 가져올 수 있다.
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를 만들면 한 번에 개발환경 세팅을 해결해 주기 때문에 간편하다.
즉 어떤 컴퓨터를 사용해도 동일한 환경에서 서버를 돌릴 수 있게 되는 것이다.
도커 만세!