도커는 컨테이너를 실행하고 관리할 수 있도록 도와주는 도구이다. 도커 이전에도 컨테이너 기술은 존재했다.
도커를 이해하는 데 위 참고 링크가 정말 도움됐다. 특히 클래스와 인스턴스처럼 도커 이미지 바라보기 파트에서 도커 파일에 실행 시점을 더한 게 도커 이미지고, 도커 이미지에 실행 시점에 수정되어야 할 정보들을 더한 게 도커 컨테이너라는 설명!
같이 보기 좋은 글 - 도커 입문편
가상머신 중 하나인 Virtual Box를 사용해본 적이 있다. 지금 사용하고 있는 컴퓨터 위에 다른 컴퓨터를 얹는 것 같은 느낌이었고, 가상머신의 근간이 되는 파일은 기본 십여기가에 이르렀다. GUI가 갖춰진 새 컴퓨터가 기존 컴퓨터의 RAM 용량을 나눠 사용하기 때문에 컴퓨터의 속도가 엄청 느렸다.
도커 컨테이너도 가상머신처럼 컴퓨터에 다른 컴퓨터를 얹는 느낌이지만, 가상머신이라 하기엔 조금 다르다. 좀 더 가볍고 편하다.
답: 프로세스
도커 이미지
가상머신의 이미지는 스냅샷이다. 도커의 이미지는 이와 비슷한 역할을 한다. 이미지를 빌드할 때 당시의 상태를 간직한다.
같은 파일들을 대상으로 해도 이미지를 빌드한 시점에 따라 설치된 패키지에 변화가 생겼을 수도 있으니 먼저 빌드한 이미지는 정상이고 나중에 빌드한 이미지는 이상할 수도 있다. 같은 사과여도 3일 지난 사과를 얼린 것과 30일 지난 사과를 얼린 건 다르다.
도커 이미지는 레이어들로 구성되어 있고, 이 레이어들은 읽기 전용이기 때문에 절대 변하지 않는다. 도커 이미지의 구조 참고 링크
도커 컨테이너
도커 컨테이너는 이미지를 실행한 것이다. 같은 이미지를 사용한다면 언제든 같은 형태의 서버를 실행할 수 있다.
하나의 이미지로 여러개의 컨테이너를 만들 수 있다. 그리고 도커 컨테이너를 실행할 때 환경변수 설정을 통해 같은 이미지로 조금씩 다른 서버를 실행할 수도 있다. 환경변수 설정 예시 링크
도커 사이트에 접속해서 회원 가입을 한다. 이 때 등록한 ID와 password를 잘 기억해놔야 된다. 이 때 ID는 이메일이 아니다!
도커설치
# 우분투 기준
$ 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를 붙여야 된다. 터미널에서 sudo password를 요구할 때는 아래와 같이 나온다.
[sudo] password for <사용자명>:
이미지를 배포할 때 docker hub에 로그인해야 된다. 이 때 무심코 docker 계정의 password를 바로 쳤는데 알고보니 sudo password를 요구하는 거여서 틀린 적이 있다. sudo를 쓰는 게 번거롭다면 permission denied error에 관련된 파일의 권한을 변경하면 된다. 참고 링크
먼저 dockerize할 프로젝트가 멀쩡한지 확인할 필요가 있다. 서버 실행까지 문제 없이 되는 상태를 이미지화 해야되기 때문이다. 이 과정에서 커맨드를 하나하나 치는 대신 쉘 스크립트를 파일을 만들어 실행할 수 있다.
예시파일을 가지고 $ source setting_up.sh 실행하면 생기는 일: 가상환경 만들고 requirements.txt에 있는 패키지를 설치하고 migrate하고 db_uploader.py 실행해서 DB에 데이터 넣고 서버 실행(runserver)까지.
Dockerfile
도커 이미지를 빌드하려면 Dockerfile이 필요하다. Dockerfile은 도커 이미지를 만들 때 설계도 역할을 하고, 서버의 운영기록과 같다. CICD(무중단 배포)할 때 필요하다.
기반으로 하는 이미지와 이 기반 이미지에서 어디를 작업 디렉토리로 하는지를 설정하고 필요한 패키지와 소스파일을 설치, 복사해 넣는다. 어떤 포트를 개방해둘지도 설정한다. 그 후 서버를 실행하는 것 까지가 이미지 안에 들어간다. 예시 링크
도커는 또 하나의 컴퓨터고, 나름의 방화벽이 있어 사용할 포트를 열여줘야 된다. 단일 OS로 사용할 거라 가상환경을 설치하지 않고 바로 pip install 해서 패키지를 설치했다. CMD는 커맨드 치라는 뜻.
#기반이 될 이미지
FROM python:3
# 작업디렉토리(default)설정
# 위에서 불러온 python3 안에서의 디렉토리
# 이후의 커맨드는 이 경로를 기준으로 한다.
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
# runserver 는 개발단계에서 서버를 실행하는 방식이다. 대신 아래의 gunicorn을 사용한다.
# CMD ["python", "./setup.py", "runserver", "--host=0.0.0.0", "-p 8080"]
# gunicorn을 사용해서 웹서버를 실행
# <Django 프로젝트 기준 settings.py가 들어있는 프로젝트 디렉토리>.wsgi
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi:application"]
runserver는 개발용이고, gunicorn, wsgi를 이용해 서버를 기동해야 된다.
도커 이미지 빌드
-t는 버저닝을 위한 태그 옵션이다. 편의상 이 태그를 앞으로 버전으로 쓰겠다.
$ docker build -t <docker 계정명>/<이미지명>:<버전> <읽어들일 Dockerfile의 위치>
생성된 또는 다운로드 된 이미지 보기
$ docker image
이미지가 완성된 걸 확인한 뒤 도커 컨테이너를 실행하자.
이미지 삭제
$ docker rmi <이미지명 또는 id>
$ docker rmi -f <이미지명 또는 id> # 컨테이너까지 삭제
도커 컨테이너 실행
$ docker run --name <컨테이너명> <docker 계정명>/<이미지명>:<버전>
--name <컨테이너명> 이 부분이 없어도 된다. 컨테이너 이름을 지정해 컨테이너 목록에서 쉽게 알아보고자 함이다.
컨테이너명은 다른 컨테이너와 겹치면 안 된다. 쓰고 싶다면 원래 있던 동명의 컨테이너를 삭제하고 만들기.
도커 컨테이너 실행시 다른 포트 사용하기
도커 이미지는 8000 번 포트를 개방해두었지만, 실행하는 컴퓨터에서 8000번 포트를 이미 자른 데에 사용하고 있을 수도 있다. 포트포워딩을 통해 실행하는 컴퓨터의 다른 포트를 통해 들어온 요청을 도커의 8000번 포트로 안내할 수 있다. 도커 컨테이너가 또 다른 컴퓨터라고 생각하면 이해하기 좀 쉽다.
8000:8000 -> 실행하는 컴퓨터의 ip의 8000번 포트로 접속해야 된다.
8001:8000 -> 실행하는 컴퓨터의 ip의 8001번 포트로 접속해야 된다.
$ docker run -d -p <실행하는 컴퓨터의 포트 번호>:<도커 컨테이너의 포트 번호> <docker 계정명>/<이미지명>:<버전>
-d 는 백그라운드 실행(daemon화)을 위한 옵션이다. nohup 같은 역할을 한다.
도커 컨테이너를 실행시킴과 동시에 컨테이너에 접속해서 쉘을 실행
$ docker run -it <docker 계정명>/<이미지명> /bin/bash
실행중인 컨테이너에 접속
$ docker attach <컨테이너명 또는 id>
로그 확인
$ docker logs <컨테이너명>
에러가 났을 때 쉘보다 더 쉽게 오류를 확인할 수 있다.
실행중인 컨테이너 보기
$ docker ps
모든 컨테이너 보기
$ docker ps -a
exited 된 컨테이너까지 다 볼 수 있다.
컨테이너 중지
$ docker stop <컨테이너명 또는 id>
중지되었다고 삭제되는 건 아니다.
컨테이너 아이디는 목록에서 id column에 있는 복잡한 해쉬값인데, 중지, 시작, 삭제 등의 커맨드를 실행할 때 다 치지 않아도 된다. 앞에서부터 다른 컨테이너와 분별될 정도로만 넣어줘도 실행된다.
컨테이너 시작, 재부팅
$ docker start <컨테이너명 또는 id> # 시작
$ docker restart <컨테이너명 또는 id> # 재부팅
컨테이너 삭제
$ docker rm <컨테이너명 또는 id>
삭제하려면 해당 컨테이너가 중지된 상태여야 한다.
이제 빌드한 이미지를 docker hub에 올려두면 다른 컴퓨터에서도 편하게 다운받아 컨테이너를 실행, 서버를 돌릴 수 있다. 배포!
'Web' 카테고리의 다른 글
EC2 포트 열기 (2) | 2021.03.24 |
---|---|
Docker 배포하기 (0) | 2021.03.24 |
소셜로그인 - kakao API (0) | 2021.03.14 |
RESTful API (0) | 2021.03.01 |
Style We 프로젝트 이미지 2 (0) | 2021.02.24 |