도커 소개
컨테이너 기반의 가상화 플랫폼.
VM ware 같은 가상머신 기반의 가상환경과는 차이가 있다.
도커는 컨테이너를 기반으로 Guest OS 를 설치하지 않는다.
도커의 필요성
최근 웹 개발에서는 클라우드 컴퓨팅을 사용해서 배포하는 일이 많다.
언제 어디서나 같은 환경을 구성하고 배포하는것은 시간적 비용이 많이 든다.
배포하려는 구성 환경을 이미지 파일로 만들어서 관리하면 훨씬 편리하게 배포, 운영을 할 수 있다.
도커의 장점
도커는 환경을 이미지 파일로 만들어서 배포 운영을 훨씬 편리하게 해준다.
생성한 이미지는 깃처럼 버전 관리를 할 수도 있다.
push / pull 하며 배포하고 내려 받을 수도 있다. ECR 같은 이미지 저장소를 함께 쓰면 더 편리하다.
도커의 단점
호스트 컴퓨터보다는 느리다.
OS 선택이 자유롭지 않다.
도커는 원래 리눅스 기반으로 돌아간다.
리눅스에서는 리눅스 컨테이너만 생성할 수 있다
읽으면서 맥 OS, Windows OS에서 왜 linux image가 받고 실행 되는지 이해 안될 수 있다.
Mac OS 와 Windows용 도커는 Virtual Box가 내장되어 있고 가상머신으로 리눅스가 실행 된 형태이다.
그래서 우분투 리눅스 이미지를 받고 실행 할 수 있다.
도커 명령어
이미지 다운 받기
docker pull <이미지 이름: 버전>
예) docker pull ubuntu:latest
컨테이너 실행하기
docker run -i -t --name <명명할 이름> <이미지 이름> <실행할 파일>
-i, -t : 실행된 쉘에서 입력, 출력을 할 수 있다.
--name <이름>: 실행할 컨테이너 이름 짓기
<실행할 파일>: 실행하는 컨테이너에서 실행할 항목
컨테이너 종료
docker stop <컨테이너 이름>
컨테이너 지우기
docker rm <컨테이너 이름>
컨테이너를 삭제한다고 이미지가 지워지진 않는다.
이미지 삭제
docker rmi <이미지 이름>
안 쓰는 이미지, 컨테이너 모두 정리, 제거
docker system prune
Stop 된 컨테이너 모두 제거
docker container prune
Stop 된 이미지 모두 제거
docker image prune
실행 중인 도커 컨테이너 모두 중지하기
docker stop $(docker ps -a -q)
docker run -it -p 8080:8080 -v "/Users/woojongseon/Projects/Frontend/app:/app" -w /app --name frontend-test ubuntu
-w: 바로 뒤에있는 디렉토리를 working directory 로 지정하겠다
-it 는 가상환경의 쉘을 사용한다.
-itd: 백그라운드에서 실행하도록 한다.
-p: 메인 pc의 포트 8080으로 접속하면 게스트 os의 8080으로 접속한다
-v 해당 디렉토리를 가상환경으로 만든다
자주 쓰이는 명령어는 이런 것들이 있었던 것 같다.
그럼 이제 Docker 파일을 만들고 이미지를 만들어 보려고 한다.
docker-compose.yaml 파일도 하나씩 만들어 보려고 한다.
그 전에 샘플로 사용할 장고 프로젝트를 만들었다.
1. 가상환경 생성
python3 -m venv venv
2. 진입
source venv/bin/activate
3. 장고 설치
pip install django
django-admin startproject config .
프로젝트를 만들었다.
설치한 장고를 requirements.txt 파일에 작성한다.
pip freeze > requirements.txt
이제 도커 파일을 작성한다.
아주 간단하게 FROM 만 썼다.
FROM 은 만들려는 도커 이미지가 어떤 이미지를 기반으로 할지 정한다.
만약에 이게 express.js 로 만든 node js 프로젝트 였다면 FROM에 node 버전을 적는다.
이런 버전은 docker hub에서 확인 할 수 있다.
https://hub.docker.com/_/python
이것만 작성하고 docker 를 사용해서 빌드하려고 한다.
docker build <Dockerfile이 있는 경로>
docker build 를 입력하기 전의 docker images 결과이다.
지금은 python 이미지가 없다.
이제 docker build를 입력하면 이미지가 생긴다.
이미지가 생긴 것을 확인 할 수 있다.
Dockerfile에 몇가지 항목을 더 작성하려고 한다.
이렇게 하면 이미지가 만들어지기만 하는 것이고 이미지가 실행되었을때 장고 홈페이지가 뜨도록 바꿔본다.
Dockerfile 을 아래처럼 작성한다.
FROM python:3.7-alpine
# 이미지 설정
RUN mkdir ./azure-docker-test
# 도커 이미지 안에 폴더 만들기
COPY . ./azure-docker-test
# 현재 경로에 있는거 모두 도커 폴더 안으로 복사
WORKDIR /azure-docker-test
# 프로젝트 실행 경로를 만든 경로로 바꿈
RUN pip install -r requirements.txt
# requirements.txt 파일 읽어서 pip 다운로드
빌드한다.
docker build ./ --tag p1:0.1
--tag 뒤에 붙은 건 이미지에 붙이는 이름과 태그다.
이게 없으면 이미지를 빌드 했을때 이름이 <none>으로 표시되어서 곤란하다.
이제 만들어진 이미지를 실행한다.
docker run -it --rm -p 8000:8000 p1:0.1 ./manage.py runserver 0.0.0.0:8000
그런데 접속이 안될 것이다.
만든 이미지를 실행하고 실행한 이미지에서
manage.py runserver 를 하는 명령인데
장고 프로젝트에서 0.0.0.0 주소를 허용한 적이 없기 때문에 안된다.
이걸 되게 만들려면 /config/settings.py 를 수정한다.
ALLOWED_HOSTS = ["0.0.0.0"]
이렇게 작성하고 0.0.0.0 에 접속하면 된다.
127.0.0.1에도 접속하고 싶다면 추가한다.
ALLOWED_HOSTS = ["0.0.0.0", "127.0.0.1"]
그러면 이제 접속이 된다.
2019.12.29 수정사항
도커파일을 아래와 같이 작성하면 도커 이미지만 실행해도 서버가 실행된다.
FROM python:3.7.3
RUN mkdir ./coin
# 도커 이미지 안에 폴더 만들기
COPY . ./coin
# 현재 경로에 있는거 모두 도커 폴더 안으로 복사
WORKDIR /coin
# 프로젝트 실행 경로를 만든 경로로 바꿈
RUN pip install -r requirements.txt
# requirements.txt 파일 읽어서 pip 다운로드
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
이렇게 작성하고 settings.py 의 ALLOWED_HOSTS를 열면 된다.
그러면 이미지 실행만으로 서버에 접속할 수 있다.
docker run -it --rm -p 8000:8000 coin:0.1
근데 도커를 사용해서 서버를 실행할때는 항상 저렇게 긴 명령어를 작성해야 한다면 이건 좀 불편하다.
docker-compose.yaml 파일을 작성하면 저렇게 긴 명령어를 적지 않아도 된다.
docker-compose up 하나만으로 이미지를 빌드하고 실행 할 수 있다.
docker-compose.yaml 을 사용하면 여러 개의 이미지를 빌드하고 실행 하는 것도 가능하다.
docker-compose.yaml 파일을 작성했다.
version 은 프로젝트의 버전을 말하는게 아니고 compose 파일의 버전이다.
https://docs.docker.com/compose/compose-file/compose-versioning/
3이라고 적으면 3.xx 최신 버전을 사용한다.
링크를 타고 들어가면 3이 권장이라고 나와있다.
그 아래에는 services를 적는다.
services 는 이 compose 파일에 포함되는 서비스들을 모두 포함한다.
그 아래 config 는 이 서비스의 이름으로 적었다.
그 아래에는 build 가 있다.
context가 build 아래 있으면 빌드할 위치를 의미한다.
ports 는 이 이미지가 사용할 포트를 말한다.
command 는 docker-compose up 했을때 실행하는 커맨드를 적는다.
이전에
docker run -it --rm -p 8000:8000 p1:0.1 ./manage.py runserver 0.0.0.0:8000
이 명령에서 manage.py 이하 부분이 모두 저기 들어간다.
그럼 이제 docker-compose up 을 하면 Dockerfile에 있는대로 빌드하고 실행하게 된다.
이제 0.0.0.0:8000 에 들어가면 홈페이지가 표시 된다.
추가 - 도커 파일을 여러개 두고 골라서 빌드하는 방법
docker build --file ./Dockerfile.prod ./
docker build --file <file 이름> ./
이렇게 하면 도커파일을 선택해서 이미지를 만들 수 있다.
'Docker | Kubernetes' 카테고리의 다른 글
AKS 쿠버네티스를 도입하면서 정리한 글 - 배포하기 (4) | 2019.12.16 |
---|---|
도커 이미지 이름으로 삭제하기 , 한번에 여러개 선택해서 지우기 (0) | 2019.07.30 |
AWS 리눅스에서 도커 사용하기 (0) | 2018.08.09 |
댓글