Docker

Jung·2021년 11월 15일
0

TIL

목록 보기
53/77
post-thumbnail
post-custom-banner

도커

  • 도커는 '컨테이너 기반의 오픈소스 가상화 플랫폼'이다.
    • 도커로 컨테이너를 띄운다.
    • 컨테이너란?
      • 애플리케이션 & 애플리케이션을 구동하는 환경을 격리한 공간이다.
        • 컨테이너에 프로그램을 띄워서 돌린다고 생각하면 된다.
        • 보통 마이크로서비스로 사용된다.
        • 거대한 어플리케이션을 기능별로 나누어 변경/조합이 가능하게 한 것
        • 컨테이너를 사용하면 하나의 큰 어플을 서비스 단위로 잘라 빠르게 배포 가능.
        • 그리고 각각 분리해서 쓰니 변경사항이 분리된 다른 기능들에 영향 미치지 않음.

기존의 가상머신(VM)과 컨테이너의 차이점

  • 기존의 가상머신(VM) 서버

    • Server → Host OS → Hypervisor → 각각의 Guest OS가 설치된 VM 구동
    • 가상 머신의 모든 자원을 사용한다.
  • 컨테이너 서버

    • Server → Host OS → Docker Engine → Container 올리기
    • CPU, RAM, Disk, Network와 같은 운영체제의 자원을 필요한 만큼 격리하여 컨테이너에 할당
      • 효율적! 배포가 빠름! 하지만 컨테이너 하나가 자원을 많이 사용하면 장애 발생.
  • 도커가 가진 컨테이너는 독립적이고, 동적이다.

    • 만약 개발한 java 앱이 인기가 많아지면 java 컨테이너의 수를 늘리고, 다시 트래픽이 줄면 해당 컨테이너 수를 줄이면 된다.
    • 즉, docker 덕분에 매번 새로운 서비스를 만들 때마다 새로운 서비스를 사고, 설정할 필요가 없는 것이다. 당신이 원할 때마다 docker를 통해 새로운 환경을 생성할 수 있다.
    • 하나의 같은 서버에서 각기 다른 환경의 컨테이너를 설정할 수 있고, 게다가 이 컨테이너들은 각각 분리, 독립되어 있는 것이기 때문에 더욱 효율적인 것이다.

DockerFile 기본 명령어

  1. FROM
    베이스 이미지를 지정한다. 반드시 지정해야 하며 어떤 이미지도 베이스 이미지가 될 수 있다. tag는 될 수 있으면 기본값보다 구체적인 버전(16.04등)을 지정하는 것이 좋다. 이미 만들어진 다양한 베이스 이미지는 Docker hub에서 확인할 수 있다.

  2. MAINTAINER
    Dockerfile을 관리하는 사람의 이름 또는 이메일 정보를 적는다. 빌드에 딱히 영향을 주지는 않는다.

  3. COPY
    파일이나 디렉토리를 이미지로 복사한다. 일반적으로 소스를 복사하는 데 사용한다. target 디렉토리가 없다면 자동으로 생성한다.

  4. ADD
    COPY명령어와 매우 유사하나 몇가지 추가 기능이 있습니다. src에 파일 대신 URL을 입력할 수 있고 src에 압축 파일을 입력하는 경우 자동으로 압축을 해제하면서 복사됩니다.

  5. RUN
    가장 많이 사용하는 구문입니다. 명령어를 그대로 실행합니다. 내부적으로 /bin/sh -c 뒤에 명령어를 실행하는 방식입니다.

  6. CMD
    도커 컨테이너가 실행되었을 때 실행되는 명령어를 정의합니다. 빌드할 때는 실행되지 않으며 여러 개의 CMD가 존재할 경우 가장 마지막 CMD만 실행됩니다. 한꺼번에 여러 개의 프로그램을 실행하고 싶은 경우에는 run.sh 파일을 작성하여 데몬으로 실행하거나 supervisord, forego와 같은 여러 개의 프로그램을 실행하는 프로그램을 사용합니다.

  7. WORKDIR
    RUN, CMD, ADD, COPY등이 이루어질 기본 디렉토리를 설정합니다. 각 명령어의 현재 디렉토리는 한 줄마다 초기화되기 때문에 RUN cd /path를 하더라도 다음 명령어에선 위치가 초기화 됩니다. 같은 디렉토리에서 계속 작업하기 위해서 WORKDIR을 사용합니다

  8. EXPOSE
    도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정합니다. 여러개의 포트를 지정할 수 있습니다.

  9. VOLUME
    컨테이너 외부에 파일시스템을 마운트 할 때 사용합니다. 반드시 지정하지 않아도 마운트 할 수 있지만, 기본적으로 지정하는 것이 좋습니다.

  10. ENV
    컨테이너에서 사용할 환경변수를 지정합니다. 컨테이너를 실행할 때 -e옵션을 사용하면 기존 값을 오버라이딩 하게 됩니다.

여기까지 Dockerfile에서 가장 많이 사용하는 명령어에 대해 알아보았습니다. 모든 명령어가 궁금하신 분은 공식문서를 참고하시면 됩니다.

도커 이미지

도커 이미지는 컨테이너를 실행하기 위해 필요한 파일들의 모음이다.
이미지를 만들기 위해서 Dockerfile이라는 이미지 생성 파일이 필요하다.

Dockerfile 생성

FROM openjdk:8-jdk-alpine #베이스 이미지 파일
COPY build/libs/demo-0.0.1-SNAPSHOT.jar app.jar #컨테이너 내부로 파일 복사
ENTRYPOINT ["java","-jar","/app.jar"] #컨테이너 생성되면서 실행

ENTRYPOINT와 CMD 차이점
ENTRYPOINT와 CMD의 가장 큰 차이점은 바로 컨테이너 시작 시 실행 명령에 대한 Default 지정 여부이다.

만약 ENTRYPOINT를 사용하여 컨테이너 수행 명령을 정의한 경우,
해당 컨테이너가 수행될 때 반드시 ENTRYPOINT에서 지정한 명령을 수행되도록 지정된다.

하지만, CMD를 사용하여 수행 명령을 경우에는,
컨테이너를 실행할 때 인자 값을 주게 되면 Dockerfile에 지정된 CMD 값을 대신 하고 지정한 인자 값으로 변경하여 실행되게 된다.

Docker 이미지 생성

docker build -t {이미지명}:{태그} {Dockerfile 파일 위치}
docker build -t my-springboot .

-t는 이름 옵션이다.

Docker 이미지 확인

docker images

Docker 이미지 삭제

docker rmi {이미지id}

Docker 컨테이너 생성

docker run --name {컨테이너 이름} -p {호스트 포트}:{컨테이너 포트} -d {이미지명}:{이미지태그}
docker run --name run-my-springboot -p 8080:8080 -d my-springboot

8080:8080에서 앞에 8080은 호스트 포트, 뒤에 8080은 컨테이너 포트다.
8081:8080이면 호스트에 8081포트로 접속하는 것을 컨테이너에 8080포트로 연결해준다는 뜻이다.
-d는 이미지를 백그라운드로 실행시킨다는 옵션이다. -d를 생략하면 터미널에서 Ctrl + C를 눌러서 빠져나오는 순간 해당 컨테이너는 종료된다.

기타

생성된 컨테이너 확인

docker ps

컨테이너 정지

docker stop {컨테이너명}

정지된 컨테이너 확인

docker stop {컨테이너명}

정지된 컨테이너 삭제

docker rm {컨테이너명}

참고
우노! 최운호. “[Kubernetes] 도커와 쿠버네티스 간단 비교.” 우노!, TISTORY, 7 July 2021, https://wooono.tistory.com/109.

[Docker] 개념 정리 및 사용 - Cultivo-Hy.github.io. https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/.

클쏭 . “Dockerfile Entrypoint 와 CMD의 올바른 사용 방법.”, TISTORY, 14 June 2019, https://bluese05.tistory.com/77.

profile
97kim.github.io
post-custom-banner

0개의 댓글