본문 바로가기
Docker

Docker 실습

by 혀넝 2022. 7. 6.

Docker

도커는 개발 환경을 이미지화시키고 해당 이미지를 통해 개발 및 배포 환경을 컨테이너화 시켜 구축한다. 각 컨테이너는 도커의 관리하에 독립적으로 존재하며 생성한 컨테이너를 복제하여 다른 pc에 배포할 수 있다. 컨테이너 가상 실행 환경 위에 application 배포 엔진을 더해 사용자 코드를 빠르고 가볍게 실행할 수 있는 기술을 제공한다.

도커 이미지란, 도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드, 라이브러리, 컴파일된 실행 파일을 묶는 형태를 말한다. 즉 특정 프로세스를 실행하기 위한 모든 파일과 설정값을 가진 것을 의미한다.

도커 컨테이너는 이미지를 실행한 상태로, 응용프로그램 자체를 패키징/캡슐화하여 격리된 공간에서 프로세스를 실행시키는 기술이다.

 

장점

쉽고 빠른 실행 환경 구축

팀 단위로 프로젝트를 진행할 때 여러 컴퓨터에서 동일한 개발환경을 구축하는 일이 필요하다. 도커 컨테이너로 초기 개발환경을 배포하게 되면 프로젝트 개발 및 실행 환경을 빠르게 구축할 수 있다.

가볍고 빠른 실행 속도

가상 머신의 경우 os를 재구동해야 하기 때문에 무거운 편이지만, 컨테이너는 상대적으로 가벼워 시작이 빠르다.

하드웨어 절감

하나의 물리적 서버에 다수의 컨테이너를 가동할 수 있어 비용 절감 효과가 크다.

 

실습

아래의 내용을 실행하기 전에 DockerHub에서 repository를 생성했다.
github에 소스코드를 저장하고 관리하듯이 docker image는 DockerHub와 같은 registries에 저장해서 사용한다. 진행하다 보면 <docker hub user name>/<project name>을 사용하는 경우가 있는데, 레파지토리의 이름이 여기에 사용된다고 보면 된다.

실습은 EC2, RDS 설정이 끝난 후 진행했다.

로컬 폴더에 Dockerfile 작성

(manage.py가 있는 곳에 작성함)

# 기반이 될 이미지
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   

# gunicorn 사용해서 서버를 실행
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "'프로젝트명'.wsgi:application"]

 

Dockerfile을 이용한 image build

# 해당 dockerfile이 있는 위치에서 진행
docker build -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path'
ex) docker build -t example/exampleproject:0.1.0 .

# M1을 사용 중이면 아래의 명령어 사용
docker buildx build --platform=linux/amd64 -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path'
ex) docker buildx build --platform=linux/amd64 -t example/exampleproject:0.1.0 .

:version의 경우 여기에 tag가 들어가게 되는데, 아무것도 쓰지 않으면 자연스럽게 latest가 tag가 된다. 따라서 아래와 같이 작성할 수 있다.

docker buildx build --platform=linux/amd64 -t example/exampleproject

그 후 docker images 명령어를 통해 이미지가 만들어진 것을 확인할 수 있다.

 

DockerHub에 docker image push

docker push example/exampleproject:0.1.0

:0.1.0도 build 할 때 지정한 tag를 사용하는데, tag를 지정하지 않았으면 비워도 된다.

docker push example/quiz

push를 완료한 후 docker hub의 repository를 가보면 새로 생성된 이미지를 확인할 수 있다.

 

EC2 서버 환경에서 docker 설치

miniconda, .bashrc, .ssh등이 있는 위치에서 설치를 진행했다.

# get-docker.sh 다운로드
curl -fsSL https://get.docker.com -o get-docker.sh

# get-docker.sh를 실행해서 Docker 설치
sh get-docker.sh

 

Docker image pull / Docker container 실행

docker pull example/exampleproject:0.1.0

원래는 위 명령어를 사용해서 이미지를 pull 해야 한다. 하지만 아래의 명령어를 사용하면 local에서 먼저 이미지를 찾고, 그 후 없으면 Dockerhub에서 자동으로 이미지를 찾게 되고, 그 뒤에 이미지를 불러와 명령어가 실행된다. 따라서 바로 컨테이너를 실행하는 경우 pull 명령어가 필요 없을 수도 있다.

docker run --name api -p 8000:8000 example/exampleproject:0.1.0

name 옵션을 주면 api라는 이름으로 container를 띄우기 되고, 그 후 포트를 설정하고, 어떤 이미지를 실행할 건지를 적는다.

 

이번에는 pull을 진행한 후 run을 했다.
pull을 진행하면 permission 에러가 나는 경우가 있다.

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/create?fromImage=hy6652%2Fquiz&tag=latest": dial unix /var/run/docker.sock: connect: permission denied

권한을 부여하기 위해 아래의 명령어를 사용한다.

sudo chmod 666 /var/run/docker.sock

그 후 다시 pull을 진행하면 된다.

 

docker run에서 진행이 되지 않거나 docker ps 명령어를 사용하여 살펴봤을 때 실행 중인 컨테이너가 없는 경우가 있다. 그건 빌드된 이미지에 이상이 있을 경우 컨테이너를 실행하고 나서 바로 종료되기 때문이다. 이런 경우에는 아래의 명령어로 문제를 확인할 수 있다.

docker run -it example/exampleproject:0.1.0 /bin/bash
# 위의 명령어를 실행하여 이미지를 기반으로 바로 컨테이너를 실행하면서 접속
# process 등 여러가지를 살펴보면서 현재 서버에 어떤 문제가 있는지 알 수 있다. 하지만 수정은 컨테이너에서 하는게 아닌 이미지를 다시 빌드 해야한다.

 

명령어

local에 있는 docker image 삭제

docker rmi <IMAGE ID>

 

실행 중인 container 확인

docker ps

 

docker container 목록 보기

docker container ls

# 종료된 컨테이너까지 보이는 명령어
docker container ls -a

 

container 삭제

docker rm <name>