종식당

현대오토에버 모빌리티 SW 스쿨 웹/앱 Docker 개념 및 설명 본문

현대오토에버 모빌리티 sw 스쿨

현대오토에버 모빌리티 SW 스쿨 웹/앱 Docker 개념 및 설명

종식당 2024. 10. 9. 15:12
728x90
반응형

개발자가 컨테이너 내에서 애플리케이션 배포 및 관리를 자동화할 수 있는 오픈 소스 플랫폼

 

먼저 docker란 리눅스 컨테이너 기반 오픈소스 가상화 플랫폼이다. 다양한 서비스를 한 서버 안에 올린다면 안정성에 문제가 생길 수가 있다. 그래서 안정성을 높이며 리소스도 최대한 활용할 수 있는 방법이 바로 서버 가상화이다. 학부에서는 주로 VM을 통해 가상화를 사용했었는데 이번 교육에서는 docker를 사용하기도 하도 제대로 공부해 본 적이 없어 이번에 정리하면서 자세히 알아보려 한다. 


Docker 핵심 구성요소

  • Docker 엔진
    호스트 시스템에서 실행되는 서비스로, 핵심 역할을 담당하는 소프트웨어이다. 이는 사용자의 명령을 해석하고 이미지 빌드, 컨테이너 실행, 네트워킹, 저장소 관리 등등을 수행 및 관리한다. 
    그리고 리눅스 컨테이너 기술(LXC)를 사용ㅎ여 컨테이너를 생성 및 관리하고 다양한 운영체제에서 동작한다.

 

  • Docker 이미지
    Docker컨테이너를 생성하고 응용 프로그램을 실행하는데 필요한 모든 것을 포함하는 템플릿이다. 이미지는 여러 계층으로 구성되어 있으며, 각 계층은 파일 시스템의 변경 사항을 나타내고 Dockerfile을 사용하여 정의된다. 정의된 Dockerfile에는 이미지를 구성하는 명령과 설정이 포함되어 있다. 이미지는 Docker Hub와 같은 저장소에 저장되어 다른 사용자와 공유하여 사용할 수 있다. 

  • Docker 컨테이너
    Docker이미지의 인스턴스로, 실행 중인 애플리케이션을 포함한다. 컨테이너는 격리된 환경에서 실행되며, 호스트 시스템의 자원을 공유하거나 격리된 네트워크 및 저장소를 사용할 수 있다. 각 컨테이너는 고유한 파일 시스템을 가지며 해당 파일 시스템은 해당 이미지의 변경 가능한 계층 위에 구축된다. 

 

  • Docker 파일
    Docker이미지를 정의하는 텍스트 파일이다. 해당 파일에는 이미지를 구성하기 위한 명령과 설정이 포함되어 있다.
    #빌드 이미지로이미지로 node:20.17지정
    FROM node:20.17 AS build
    WORKDIR /app
    
    #빌드 컨텍스트의 소스코드를 작업 디렉토리로 복사복사, 라이브러리 설치 및 빌드빌드
    COPY . /app
    RUN npm ci
    RUN npm run build
    
    #런타임 이미지로이미지로nginx latest, /usr/share/nginx/html 폴더에 권한 추가
    FROM nginx:latest
    
    #빌드 이미지에서 생성된생성된 dist 폴더를 nginx이미지로 복사
    COPY --from=build /app/dist /usr/share/nginx/html
    EXPOSE 80
    ENTRYPOINT ["nginx"]
    CMD ["-g", "daemon off;"]
docker build -t vuepro .
docker images
docker run -d --name vuetest -p 80:80 vuepro
docker ps

 

위와 같이 dockerfile을 만들고 작업하고 싶은 디렉터리에 저장해 두면  docker build -t vuepro. 를 통해 도커 이미지를 vuepro라는 이름으로 빌드 가능하다. 뒤에 "."은 현재 디렉터리를 의미하므로 꼭 빼먹지 말도록 하자.

그리고  docker run -d --name vuetest -p 80:80 vuepro를 통해 vuetest라는 이름으로 컨테이너를 생성하고 실행할 수 있다. 여기서  -p 80:80를 통해 호스트의 80번 포트를 컨테이너의 80번 포트에 연결하여 외부에서도 접속 가능하게 할 수 있다.

 

  • Docker 허브
    Docker이미지의 공식 저장소이다. 개발자들은 이곳에서 이미지를 공유하고, 다른 사용자의 이미지를 다운로드하여 사용할 수 있다. Docker Search를 통해 사용자가 공유한 이미지들을 검색하여 pull 받을 수 있다.

Docker 동작방식

개발자는 Dockerfile이라는 파일을 사용하여 이미지를 정의하는데 정의된 Dockerfile에는 애플리케이션의 환경 설정, 종속성, 실행 명령 등이 포함된다. 정의된 Dockerfile을 사용하여 Docker엔진이 이미지를 빌드하고 해당 과정에서 Dockerfile에 정의된 명령을 순서대로 실행하고 이미지를 생성한다. 생성된 이미지는 Docker Hub와 같은 이미지 저장소에 공유할 수 있고 공유된 이미지는 다른 개발자나 시스템에서 다운로드하여 사용할 수 있다. 빌드를 통해 생성된 Docker이미지를 기반으로 Docker엔진은 컨테이너를 생성한다. 해당 과정에서 이미지의 파일 시스템과 설정이 컨테이너로 복제되고, 컨테이너가 실행된다.
컨테이너가 실행되면 해당 애플리케이션이 호스트 OS의 격리된 환경에서 동작하게 되는데, 호스트 시스템의 자원을 사용하며 필요에 따라 추가적인 설정을 통해 외부와 통신할 수 있다. 

이렇듯, Docker이미지를 기반으로 컨테이너를 생성하고 실행하여 애플리케이션을 배포하고 관리한다. 이러한 방식으로 Docker는 개발과 배포 프로세스를 단순화하고, 이식성과 확장성을 향상할 수 있는 능력을 갖추고 있다.

 


Docker 사용

 

 

docker ps -a를 통해 모든 컨테이너를 확인할 수 있다. 

 

 

docker images를 통해 docker 이미지를 확인할 수 있다. 

 

  • mysql dockerfile
FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD=1234
ENV MYSQL_DATABASE=hanyong5

# 시간대 설정
ENV TZ=Asia/Seoul

COPY ./init.sql /docker-entrypoint-initdb.d/

CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci", "--default-time-zone=+09:00"]
EXPOSE 3306

 

  • dockerfile build -> test-mysql이라는 docker 이미지 생성
docker build -t test-mysql . <- 점중요****(docker파일 위치)
  • docker 컨테이너 생성 및 실행
docker run -d --name mysqlserver -e MYSQL_ROOT_PASSWORD=[password] -p 3306:3306 mysql

 


  • 마무리
    도커 컨테이너는 도커 이미지가 실제 구동되는 것을 의미하고, 하나의 도커 이미지로 어려 도커컨테이너를 실행시킬 수 있다. 비유하자면, 도커 컨테이너가 밀키트 만드는 제조법으로 끓여낸 부대찌개라면, 도커이미지는 밀키트 제조 레시피 및 재료이다. 위에서는 도커이미지를 도커허브(Docker Hub)에서 다운로드하여서 사용했고, 이를 이용해서 도커 컨테이너를 구동하였다. 그렇다면, 도커이미지를 만들기 위해서는 어떤 것들이 필요한가? 이 정답은  Dockerfile이다. Dockerfile은 도커이미지를 만들기 위한 레시피를 의미한다. 이 레시피에는 어떤 파일들을 참조하고 있는지, 어떤 과정이 진행되는지 파악할 수 있다.
    도커에 대해 들어보기만 하고 내용과 지식도 많이 부족했는데 이번에 수업을 들으면서 사용도 해보고 직접 정리도 하니까 개념은 좀 잡힌 것 같아 좋았다. 이미지와 컨테이너의 차이가 헷갈렸는데 정리가 좀 되었다. 

 

728x90
반응형