본문 바로가기
개발

Docker 공부하기 (기초)

by hwan-da 2024. 9. 1.

공통 프로젝트를 하면서 인프라를 할 줄 아느냐 모르느냐에 따라 편의성이 달라진다는 것을 깨달았다.

능숙하게 모든 것을 하기는 힘들지만, 기초적인 도커, Jenkins, 서버 배포 등을 공부해보고자 한다.

 

오늘은 그 첫 번째인 도커 기초이다.

1. 도커 기초 강의

  • 도커(Docker)란?
    • 컨테이너 기반의 오픈소스 가상화 플랫폼
    • 어떤 프로그램을 외부 환경과 격리 시켜 구동할 수 있게 해주는 소프트웨어
    • 개발 후 가동을 시킬 때 우리가 쓰고 있는 OS 환경에 영향을 많이 받지 않게 격리 시켜 구동할 수 있게 해주는 것
  • 컨테이너(Container)란?
    • OS 상에 논리적인 영역(컨테이너)을 구축하고, 애플리케이션이 작동하는데 필요한 요소들을 모아 별도의 서버처럼 동작하는 것
    • 필요한 요소만으로 구성되어 있어 오버헤드가 적음
    • Infrastrucure
      • RAM, 메모리, CPU 등의 인프라
    • Host Opearting System
      • 운영체제(OS)
    • Docker
      • 도커를 하나 쌓음
    • Application
      • 겹쳐져 있지 않고 각각 독립적으로 마치 컨테이터처럼 배치
      • 격리된 환경
        • A가 동작하는 환경과 B가 동작하는 환경이 아예 달라도 영향을 받지 않음
    • 리눅스 환경이 아닌 곳에서 리눅스 환경에서 구동하는 것처럼 구동 시킬 수 있게 하는 것

2. 컨테이너 구조 및 커맨드 사용법 - 이론편 -

  • 도커 컨테이너 구조
    • 컨테이너 레이어
      • 이미지 레이어를 컨테이너에 올리게 되면 계층이 추가
        • 이를 컨테이너 레이어라고 부름
        • read와 write가 모두 가능
        • 실행하고 진행되는 변경 사항은 이 계층에 저장됨
    • 이미지 레이어
      • 이미지
        • 컨테이너를 가동하기 위해서 필요함
        • 도커 허브나, 레포지토리에서 가지고 올 수 있는 형태
      • 읽기 전용의 계층으로 다른 컨테이너와 공유할 수 있는 레이어
    • 여러 컨테이너를 가동하게 되면, 이미지 레이어는 공유하되 각각의 컨테이너 레이어를 붙여 각기 다른 컨테이너가 공유하지 않는 계층을 만듦
    • 동일한 이미지 레이어를 사용하고 있기 때문에 동일한 퍼포먼스를 낼 수 있음
  • 도커 명령어 구조
    • 도커의 컴포넌트를 제대로 사용하기 위해서는 명령어를 사용해야 함
    • 도커의 모든 명령은 ‘docker’로 시작하며 어떤 대상에게 명령어를 실행할 것인지로 구분하면 보기 쉬움
      • docker {대상} {커맨드} {옵션} {인자}
      • 대표적인 커맨드 대상 docker - container, image, volume, network
  • 도커 커맨드
    • 도커에서 사용할 수 있는 커맨드 리스트 확인 방법
      • ‘docker’ 입력
        • image, container 등에서 사용할 수 있는 모든 명령어
      • ‘docker [command 대상 컴포넌트] --help’ 입력
      • 위와 같은 방법으로 커맨드 수준을 높이고 뒤에 --help 입력
  • Container 관련 커맨드
    • start, stop, create, run, rm, exec, ls, cp, commit
  • Image 관련 커맨드
    • pull, rm, ls, build
  • 주요 옵션 설명
    • --name, -p, -v, -e, -d, -i, -t

3. 도커 커맨드 사용법 - 실습편 -

  • 실습 완료

4. 도커 컨테이너 통신하기 - 이론편 -

  • 도커 컨테이너와 통신하기
    • 도커 컨테이너는 기본적으로 독립적인 환경에서 실행되기 때문에 컨테이너 밖에서 접근할 수 없음
    • 컨테이너와 통신하기 위해서는 컨테이너를 가동시키면서 ‘p’ 옵션을 사용하여 호스트의 포트와 컨테이너의 포트를 설정해야 함
      • -p ${host_port}:${container_port}
      • 이 설정을 사용하기 위해서 호스트(서버 또는 PC)에서 사용 중인 포트와 번호가 겹치지 않는지 확인이 필요
    • 도커 커맨드의 차이
      • docker run --name test1 -d httpd
        • test1이라는 이름으로 컨테이너 생성
        • -d 백그라운드로 동작
      • docker run --name test2 -d -p 8080:80 httpd
        • 8080:80 → 호스트의 포트는 8080, 컨테이너의 포트는 80으로 세팅하여 네트워크 설정
      • docker ps -a / cocker container ls -a를 사용하여 컨테이너 상태 확인
      • 실습을 마치면 stop과 rm 커맨트로 실행을 중지하고 삭제하는 작업을 수행하는 것이 좋음

5. 도커 컨테이너 통신하기 - 실습편 -

  • 실습 완료

6. 도커파일(DockerFile) 작성하기 - 이론편 -

  • dockerfile에서 사용되는 주요 인스트럭션
    • FROM
      • From 키워드를 사용하여 base가 되는 image를 지정
      • 주로 OS 이미지나 런타임 이미지를 지정함
    • RUN
      • 이미지를 빌드할 때 사용하는 커맨드를 설정할 때 사용
    • ADD
      • 이미지에 호스트의 파일이나 폴더를 추가하기 위해 사용
      • 만약 이미지에 복사하려는 디렉토리가 존재하지 않으면 docker가 자동으로 생성
        • 이 원리는 검색해서 찾아보기
    • COPY
      • 호스트 환경의 파일이나 폴더를 이미지 안으로 복사하기 위해 사용
      • ‘ADD’와 동일하게 동작하지만 가장 확실한 차이점은 URL을 지정하거나, 압축 파일을 푸는 것을 자동으로 하지 않음
    • EXPOSE
      • 이미지가 통신에 사용할 포트를 지정할 때 사용
    • ENV
      • 환경 변수를 지정할 때 사용
      • 여기서 설정한 변수는 #name, #{name} 형태로 사용할 수 있음
      • 추가로 아래와 같은 문법 사용 가능
          • ${name:-else} : name이 정의가 안되어 있다면 else 사용
    • CMD
      • 도커 컨테이너가 실행될 때 실행할 커맨드를 지정
      • RUN과 비슷하지만 CMD는 도커 이미지를 빌드할 때가 아니라, 컨테이너가 시작할 때 실행된다는 것이 다름
    • ENTRYPOINT
      • 도커 이미지가 실행될 때 사용되는 기본 커맨드 지정(강제)
    • WORKDIR
      • RUN, CMD, ENTRYPOINT 등을 사용한 커맨드를 실행하는 디렉토리를 지정
      • -w 옵션으로 오버라이딩 할 수 있음(빌드 할 때)
    • VOLUME
      • Persistence 데이터를 저장할 경로를 지정할 때 사용
      • 호스트의 디렉토리를 도커 컨테이너에 연결
      • 주로 휘발성으로 사용되면 안되는 데이터를 저장할 때 사용
    • 기타 옵션
      • SHELL
      • LABEL
      • USER
      • APG
      • STOPSIGNAL
      • HEALTHCHECK
  • docker build 커맨드
    • dockerfile을 실행하기 위해 docker build 커맨드를 사용
    • docker build ${option} ${dockerfile directory}
      • docker build -t test
    • 생성된 이미지를 컨테이너로 실행하기 위해서는 run 커맨드를 사용
      • docker run —name test_app -p 80:80 test

7. 도커파일(DockerFile) 작성하기 - 실습편 -

  • 실습 완료

8. 도커 컴포즈(Docker Compose) 작성하기 - 이론편-

  • Compose 파일
    • 도커 애플리케이션의 서비스, 네트워크 볼륨 등의 설정을 yml 파일 형식으로 작성한 것
  • 큰 틀에서의 구성 요소
    • version
      • deprecated 되어 더 이상 설정하지 않아도 됨
    • services
    • network
    • volume
    • config
    • secret
  • services는 여러 컨테이너를 정의하는데 사용됨
    • frontend와 backend는 각 컨테이너를 정의하게 되며, 각 컨테이너의 이름이 됨
  • 컨테이너를 설정할 때 사용되는 키워드
  • docker-compose.tml 파일을 실행하기 위해서는 아래와 같은 커맨드 사용
    • docker compose up
  • 추가 주요 옵션
    • -f 옵션
      • docker-compose는 기본적으로 docker-compose.yml 또는 docker-compose.yaml의 이름을 사용,
      • 만약 다른 이름으로 파일을 관리하고 사용할 때 사용
      • docker compose -f docker-compose-custom.yml up
    • -d 옵션
      • 백그라운드에서 docker-compose를 실행하기 위해 사용
        • docker compose up -d
        • -d가 없이 실행하면 해당 cmd는 사용할 수 없게 되므로 백그라운드에서 실행함

9. 도커 컴포즈(Docker Compose) 작성하기 - 실전편-

10. 도커 이미지 생성 및 저장하기 - 이론편 -

  • 도커 이미지 생성하기
    • offcial 이미지가 아닌 이미지 생성 후 사용 가능
    • 주로 이미지를 생성하는 경우
      • 특정 이미지에 자주 사용하는 설정을 추가하여 편하게 사용하고 싶을 경우
      • 본인이 개발한 애플리케이션을 이미지로 생성하고 싶을 경우
  • 컨테이너로 이미지 생성하기
    • 첫 번째 방법
      • 추가 설정 내역이 포함된 레이어를 붙여서 쓰고 있었다면, 이 컨테이너를 그대로 가져와서 이미지로 만들 수 있음
      • docker commit {container_name} {image_name}
        • container_name : 이미지로 만들고자 하는 컨테이너 이름
        • image_name : 생성할 이미지의 이름
    • 두 번째 방법
      • Dockerfile로 이미지 생성하기
  • 도커 이미지 파일로 저장
    • 생성된 이미지는 파일로 저장할 수 있음
    • 대체로 운영서버에서 이미지를 사용해야할 때 종종 사용됨
    • 방법 2가지
      • save/load 커맨드
        • save를 이용한 이미지 저장은 원본 이미지와 레이어를 동일하게 가져가는 형식으로 동작
        • save : 도커 이미지를 tar 파일로 추출
        • load : 추출된 tar 파일을 이미지로 불러옴
      • export/import 커맨드
        • export를 이용한 이미지 저장은 원본 이미지와 다르게 하나의 레이러로 통합되어 추출
        • 이렇게 추출된 이미지는 다시 컨테이너로 가동하기 위해 별도 작업 필요
        • export : 도커 이미지를 tar 파일로 추출
        • import : 추출된 tar 파일을 이미지로 불러옴

11. 도커 이미지 생성 및 저장하기 - 실전편 -

  • 실습 완료

12. 스프링부트 Dockerfile 만들기

'개발' 카테고리의 다른 글

Spring Batch란?  (0) 2024.11.24
[OAuth2] X(구 트위터) 로그인 API 사용기  (1) 2024.11.17
JWT 심화  (1) 2024.08.11
OAuth2.0 + SpringSecurity  (0) 2024.08.04
스프링 시큐리티(Spring Security) + JWT  (0) 2024.07.21