Docker는 가상화 기술이다. 한 문장으로 정의할 수 있는 개념은 아니지만, 짧게 요약해보면 Docker는 독립된 가상화 container에 application을 담아 배포를 자동화시켜주는 오픈소스 엔진이다. 배포할 application을 container에 담기 위해선 application을 image로 만드는(빌드하는) 과정이 필요하다.
독립된 container는 서로에게 영향을 미치지 못한다. 그래서 서로 버전이 다른 프로그래밍 언어를 사용하는 애플리케이션이 있어도, 각자를 다른 container에 담으면 충돌 없이 server에서 동작시킬 수 있다.
즉, 도커는 소프트웨어가 실행될 수 있는 환경을 컨테이너라는 패키지로 추상화하여 실행 중인 환경에 구애받지 않고(장점) 동일하게 애플리케이션을 신속하게 배포, 확장, 관리할 수 있습니다.
- 가상화란?
- 가상 이미지로 불법 다운로드 게임 실행하는 것과 비슷한 개념
- 실제 컴퓨터가 존재하는 것처럼 물리적 장치가 없는 컴퓨터를 소프트웨어적으로 만들어내는 것
- 사용 이유
- 한 대의 컴퓨터에 한 가지 일만 시키기엔 자원이 아까워서…
- server 안의 패키지나 프로그래밍 언어를 설치, 삭제, 업그레이드하는 등의 번거로움에서 벗아날 수 있다. 대신 필요한 컨테이너만 교체해주면 된다.
- docker의 차별화 포인트
- 기존의 가상환경은 하이퍼바이저와 같은 지나친 간섭이 존재
- 반면 도커는 이러한 문제점에서 다소 자유롭다.(부팅 필요x, 속도가 비교적 빠름)
- 초심자가 편하게 배울 수 있다.
Docker 사용하기 전 필수 준비 사항
Dockerfile 생성
touch Dockerfile
#./Dockerfile
FROM python:3
#기반이 될 이미지
# 작업디렉토리(default)설정
WORKDIR /usr/src/app
## Install packages
#현재 패키지 설치 정보를 도커 이미지에 복사
COPY requirements.txt ./
#설치정보를 읽어 들여서 패키지를 설치
RUN pip install -r requirements.txt
## Copy all src files
#현재경로에 존재하는 모든 소스파일을 이미지에 복사
COPY . .
## Run the application on the port 8080
#8000번 포트를 외부에 개방하도록 설정
EXPOSE 8000
#CMD ["python", "./setup.py", "runserver", "--host=0.0.0.0", "-p 8080"]
#gunicorn을 사용해서 서버를 실행
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "example.wsgi:application"]
파일 내용 수정
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "example.wsgi:application"]
의 "example.wsgi:application" 부분을 본인의 application 이름(프로젝트 이름)에 맞게 수정한다.(application 이름이란 django-admin startproject 폴더 이름
으로 생성했던 폴더 이름을 가리킨다)
ex) CMD ["gunicorn", "--bind", "0.0.0.0:8000", "herhouse.wsgi:application"]
import re
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': '[데이터베이스 이름]',
'USER': 'root',
'PASSWORD': '[비밀번호]',
'HOST': '[RDS 엔드포인트]',
'PORT': '3306',
}
}
SECRET_KEY = '[secret key]'
ID_NUMBER_CHECK = re.compile('[0-9]')
PHONE_NUMBER_CHECK = re.compile('^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$')
NAME_CHECK = re.compile('[a-zA-Z0-9~!@#$%^&*()_+-={}<>,.?//:;\[\]"각-힣]')
EMAIL_CHECK = re.compile('^[a-zA-Z0-9+-_]+@[a-z]+\.[a-z]+\.*[a-z]*')
pip freeze
로 가상환경에 설치된 module 목록을 확인한 뒤, requirements.txt 파일에 목록을 붙여넣는다.gunicorn
이 없다면 추가해주자.PyMySQL
을 추가해주자.도커 파일을 이용해 이미지 빌드하기
docker build -t '도커허브에 가입한 계정명'/'이미지명(프로젝트명 권장)':'버전' .
ex) docker build -t wecode/wecodeproject:0.1.0 .
--tag(또는 -t) 옵션은 새로 생성할 이미지 이름을 지정한다. 여기서는 리포지토리 이름으로 wecode/wecodeproject
를 사용하고 태그로 0.1.0을 사용했다.
마지막에 점(.)은 Dockerfile의 위치를 경로로 지정한다. 파일 이름이 Dockerfile이 아닌 경우 --file(또는 -f) 옵션을 사용해서 파일 이름을 지정한다.
Dockerfile이 위치한 디렉토리에서 위 명령어를 실행하면 다음과 같이 새로운 도커 이미지를 생성한다. docker images 명령어로 새로 생긴 이미지를 확인할 수 있다.
만약 맥북 M1을 사용 중이라면... 애플실리콘은 ARM으로 기존 x86_64 아키텍쳐와 설계방식 및 프로그램의 동작 방식이 다르기 때문에 아래의 명령어로 빌드해야 한다.
docker buildx build --platform=linux/amd64 -t {image name}:{tag name} {Dockerfile path}
docker buildx build --platform=linux/amd64 -t wecode/wecodeproject:0.1.0 .
빌드된 이미지 실행
docker run --name '컨테이너 명' -d'데몬으로 실행하기 위한 옵션' -p '호스트 포트':'컨테이너 포트' '이미지명'
docker run --name wecode01 -d -p 8000:8000 wecode/wecodeproject:0.1.0
-p 8000:8000
: 내 노트북의 8000포트와 docker 서버의 8000 포트를 연결 —> 내 노트북으로 통신이 들어오면, docker 서버로 연결됨) —> port fowardinghttp -v GET localhost:8000/store/category
빌드된 이미지에 이상이 있을 경우
docker run -it wecode/wecodeproject:0.1.0 /bin/bash
컨테이너 전부 삭제하는 명령어
docker rm $(docker ps -a -q)
sudo docker rm $(sudo docker ps -a -q)
이미지 전부 삭제하는 명령어
docker rmi $(docker images -q)
sudo docker rmi $(sudo docker images -q)
그밖에 docker 실행을 위해 필요한 명령어
docker ps
: 실행중인 컨테이너를 보여줌docker ps -a
: 실행이 종료된 것을 포함해서 모든 컨테이너를 보는 커맨드 및 옵션 / container ID 확인이 가능하다. docker images
: 생성된 혹은 다운로드 된 이미지를 보여주는 커맨드 / image ID 확인이 가능하다.docker images -a
: 모든 이미지를 보여주는 커맨드 및 옵션)docker rmi [image ID]
: 해당 이미지 삭제docker rm [container ID]
: 해당 컨테이너 삭제docker start [container name]
: 해당 컨테이너 시작sudo
를 붙이면 된다.docekr stop [container name]
: 해당 컨테이너 중지sudo
를 붙이면 된다.생성한 이미지 배포
docker login
docker push [이미지 이름]:0.1
or :0.1.0
배포한 이미지 다운로드
ssh -i [key_par 이름].pem ubuntu@IPv4 퍼블릭 IP
ubuntu
는 EC2 환경에 기본으로 생성된 username이다.sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce
docker 로그인
sudo docker login
으로 docker에 로그인을 한다.sudo
를 붙여주지 않을 경우 docker에 접근할 수 없을 수 있으므로 반드시 입력해주자이미지 다운로드(pull)
sudo docker pull [이미지 이름]:0.1
or :0.1.0
sudo docker pull fcfargo/herhouse_project:0.1
이미지 실행
sudo docker run -d -p 8000:8000 [이미지 이름]:0.1
or :0.1.0
sudo docker run -d -p 8000:8000 fcfargo/herhouse_project:0.1
서버 접속
control + d