[DevOps] DockerFile 사용해보기 - 고양이 이미지 API 구현 과제

2023. 4. 6. 01:01프로젝트/학습

과제 저장소 : https://github.com/twotwobread/jwp_cat_picture_search
💡본문에 들어가기 앞서...

프로그래머스 백엔드 데브코스 멘토님께서 연 코드리뷰 강의인 고양이 이미지 API 구현하는 과제에서 Docker를 이용해서 로컬 DB를 설정하라는 요구사항이 있었습니다. 그래서 저는 DockerFile을 이용해서 설정파일을 만들어야겠다고 생각을 했고 그 전에 Docker에 대해서 공부해보고자 글을 씁니다아!

※ 도커의 개념에 대해선 해당 글을 기반으로 작성했습니다!!

Docker란?

도커를 이용해서 프로젝트도 하고 꽤 많이 이용을 해봤는데 사실 도커가 뭔지에 대해서 명확히 몰랐습니다.

도커란?
도커(Docker)는 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트이다.

즉, 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 

컨테이너라고 하면 뭐가 떠오르나요?? 아래와 같은 보통 컨테이너 박스가 떠오를 겁니다.

출처: 위키백과

물건들을 넣을 수 있고 이를 이용해서 좀 더 쉽게 운송을 할 수 있습니다. 서버에서의 컨테이너도 비슷하게 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 통해 프로그램 배포 및 관리를 단순화합니다. WAS, DB 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 AWS, PC 등 어디에서든 실행할 수 있습니다.

도커의 구성요소

출처 : https://seosh817.tistory.com/345
  • Client : 도커를 설치하면 그것이 Client이고 build, pull, run 등의 명령어를 수행합니다.
  • DOCKER_HOST : 도커가 띄워진 서버를 의미하고 컨테이너와 이미지를 관리합니다.
  • Docker daemon : 도커 엔진입니다.
  • Registry : 외부(remote) 이미지 저장소입니다. 다른 사람들이 공유한 이미지를 내부(local) 도커 호스트에 pull할 수 있습니다. 이렇게 가져온 이미지를 run하면 컨테이너가 됩니다.
    • public 저장소 : Docker Hub, QUAY
    • private 저장소 : AWS ECR 혹은 Docker Registry를 직접 띄워서 비공개로 사용하는 방법 등이 존재합니다. 

컨테이너 란?

가상의 실행환경을 만들어준다고 하면 사실 가장 익숙한 것이 VM일 겁니다. OS를 가상화 해줘서 여러 OS 환경을 하나의 컴퓨터에서 이용할 수 있었습니다. 근데 이 방법은 무겁고 느려서 운영환경에서 사용할 수 없었습니다.

출처 : https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

이런 방법을 개선하기 위해서 프로세스를 격리하는 방식을 이용합니다. 이를 리눅스에선 리눅스 컨테이너라 하고 단순히 프로세스를 격리시켜 빠르게 동작합니다.

하나의 서버에서 여러 개의 컨테이너를 실행하면 서로 독립적으로 실행되어 마치 가벼운 VM을 사용하는 느낌을 줍니다. 마찬가지로 패키지 설치도 되고 사용자 추가, 여러 프로세스를 백그라운드에서 실행도 가능합니다. 

이미지 란?

도커에서 가장 중요한 개념은 컨테이너와 함께 이미지입니다.

출처 : https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

이는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다.

컨테이너는 이미지를 실행한 상태이고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기에 더 이상 의존성 파일을 컴파일하거나 따로 설치할 필요가 없습니다.

DockerFile 이란?

도커 파일은 도커 이미지를 만들때 사용하는 파일입니다.

출처 : https://seosh817.tistory.com/345

 도커파일로부터 이미지를 만들 때 쓸 수 있는 명령어는 다음과 같습니다. 주의할 것은 RUN은 이미지를 만들 때 실행되는 코드이며, ENTRYPOINT, CMD는 컨테이너를 만들고나서 실행되는 코드입니다.

명령어 기능 예시
FROM 새로운 이미지 생성 시 기반으로 사용할 이미지를 지정합니다. 주로 OS를 지정하고 버전까지 지정하는 것이 좋습니다.
DockerFile은 반드시 FROM 구문으로 시작해야 하고 이미지가 내 로컬 도커 호스트에 없어도 외부 이미지 저장소에서 가져올 수 있습니다. 
FROM ubuntu:18.04
ENV 환경변수를 할당하고 싶을 때 사용합니다. ENV DATABASE MYSQL
도커 이미지 생성 시 DATABASE 환경변수에 MYSQL을 할당하라는 명령어입니다.
WORKDIR shell의 cd 명령문처럼 컨테이너 상에서 작업 디렉토리로 전환하기 위해 사용합니다. WORKDIR /etc/nginx
COPY 호스트 컴퓨터에 있는 디렉토리나 파일을 Docker 이미지 내부로 복사하기 위해서 사용합니다. COPY ~/model ./model
RUN DockerFile로부터 도커 이미지를 빌드하는 순간에 실행됩니다. (이미지를 만들 때 생성되는 명령어입니다.) RUN apt-get update
ENTRYPOINT 컨테이너 생성 후 최초로 실행되는 명령어입니다.  
CMD 컨테이너 생성 후에 실행되는 명령어입니다. (실행 되지 않을 수 있습니다.)

docker run <image-name> [CMD]의 명령어에서 CMD가 없는 경우에 디폴트로 돌리기 위함이거나 인자를 받기 위해서 사용됩니다.

docker run 뒤에 CMD가 없으면 default로 실행, 다른 명령어가 있으면 실행이 안됩니다.
 

DockerFile 적용해보기

일단 mysql 8.0 버전을 이용할 것이고 생성이 될 때 database를 생성하게 만들겁니다.

FROM mysql:8.0

ENV MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
ENV MYSQL_DATABASE=${MYSQL_DATABASE}
COPY ./schema.sql /docker-entrypoint-initdb.d/

EXPOSE 3306

그래서 위와 같이 Dockerfile을 구성했습니다. 저는 dockerfile을 실행하기만 하면 컨테이너까지 자동으로 생성되면 좋겠는데 대부분 알려주는 방식이 터미널 상에서 커맨드랑 dockerfile을 이용해서 이미지를 생성하고 그 후에 다른 커맨드를 입력해서 컨테이너를 실행시키는 방식이어서 저는 인텔리제이 ui를 최대한 활용했습니다.

요렇게 dockerfile이 있으면 저기 >> 이렇게 생긴 친구를 누르면

요렇게 Edit을 할 수 있습니다. 저는 env 파일을 사용해서 password를 설정하고 database를 만들기 때문에 env 파일도 추가했습니다. 그리고 포트를 바인딩 해야해서 바인딩해주는 모습입니다.

이렇게 설정해주면 아래와 같은 모습이고 apply를 해줍시다.

그러면 이제 >>를 통해서 Dockerfile을 실행하기만 하면 컨테이너가 자동으로 Run 되기에 다른 사람들이 해당 서비스를 실행시킬 때 조금 더 간편하게 설정을 해줄 수 있다고 생각해서 이렇게 설정해봤습니다.


마무리

도커에 대해서 잘 몰랐는데 도커에 대해서 개념적으로 이해를 할 수 있었고 직접 설정해보면서 개발 환경을 구성해보니까 사용하는 측면에서도 이해가 되어서 너무 좋았습니다아~

 

Reference

https://happy-nut.github.io/devops/docker

 

Docker 사용법

happy-nut.github.io

https://seosh817.tistory.com/345

 

[Docker] 도커란? - 도커 개념 정리

이 포스트는 시작하세요 도커! 책을 참고하였습니다. 도커란? 도커(Docker)는 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수

seosh817.tistory.com

https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

 

초보를 위한 도커 안내서 - 도커란 무엇인가?

도커를 처음 접하는 시스템 관리자나 서버 개발자를 대상으로 도커 전반에 대해 얕고 넓은 지식을 담고 있습니다. 도커가 등장한 배경과 도커의 역사, 그리고 도커의 핵심 개념인 컨테이너와 이

subicura.com

https://jojozhuang.github.io/architecture/creating-mysql-image-with-docker-file/

 

Creating MySQL Image with Docker File

Tutorial for creating MySQL image with Dockerfile.

jojozhuang.github.io