본문 바로가기
Docker | Kubernetes

Docker(도커)를 사용하면서 정리한 글

by 자유코딩 2019. 5. 7.

도커 소개

컨테이너 기반의 가상화 플랫폼.

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

 

python - Docker Hub

Supported tags and respective Dockerfile links (See "What's the difference between 'Shared' and 'Simple' tags?" in the FAQ.) Simple Tags 3.9.0a1-buster, 3.9-rc-buster, rc-buster 3.9.0a1-alpine3.10, 3.9-rc-alpine3.10, rc-alpine3.10, 3.9.0a1-alpine, 3.9-rc-a

hub.docker.com

이것만 작성하고 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/

 

Compose file versions and upgrading

The Compose file is a YAML file defining services, networks, and volumes for a Docker application. The Compose file formats are now described in these references, specific to each version....

docs.docker.com

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 이름> ./

이렇게 하면 도커파일을 선택해서 이미지를 만들 수 있다.

 

 

 

 

 

댓글