DX Data School

Docker

Kim J 2024. 4. 5. 17:35

1. Docker

1) 개요

  • Container 형 가상화 기술을 구현하기 위한 애플리케이션(Docker Engine) 과 이 애플리케이션을 조작하기 위한 명령행 도구(Docker CLI)로 구성되는 애플리케이션
  • 같이 사용하는 프로그램 데이터를 다른 컨테이너 와 격리시키는 기능을 제공하는 애플리케이션

 

2) 특징

  • Micro Service 전환은 물론 DevOps, Testing 등 다양한 분야에서 활용
  • Linux Container 구현체의 사실상(de-facto) 표준

 

3) Docker는 Linux를 사용

  • Docker는 Linux를 필요로 함
  • Windows 나 Mac OS에서는 Docker를 구동할 수 있는지만 이 경우 내부적으로 Linux 가 사용되며 Container에서 동작하는 프로그램도 Linux 용 프로그램

 

4) LXC(Linux Container)

  • 운영체제 수준의 가상화
    • 단일 Linux 커널을 사용하는 제어 호스트에서 여러 개의 격리된 Linux 시스템 실행
  • Linux 커널에서 컨테이너 단위로 격리할 수 있도록 해주는 기능
    • cgroups
      • 자원을 제한하고 격리시키는 Linux 커널 기능
    • Namespace
    • chroot(change root)
      • 특정 디렉토리를 최상위 디렉토리인 root로 인식하게끔 설정하는 Linux 명령

 

5) 데이터나 프로그램을 격리시켜야 하는 이유

  • 대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리 또는 다른 프로그램을 이용해서 동작
    • 이러한 프로그램을 하나의 운영체제에 설치해서 사용하는 경우 한 프로그램의 변경이 다른 프로그램에 영향을 줄 수 있어서 각각의 프로그램을 격리시켜서 영향을 미치지 못하도록 하기 위해서

 

6) 동작 원리

  • 일반적인 리눅스가 설치된 컴퓨터
    • 하드웨어 > 커널 > 주변 부분 > 소프트웨어
  • 도커가 설치된 경우
    • 하드웨어 > 커널 > 도커 엔진 > 소프트웨어
  • Window 와 Mac Os에서 Docker 구동
    • Linux 운영체제를 끌어들여 사용
    • Windows 에서는 WSL2라는 프로그램을 이용하여 Linux 사용

 

7) Image와 Container

  • 하나의 이미지로 여러 컨테이너를 생성할 수 있으며 이미지가 없으면 컨테이너를 생성할 수 없음
  • Docker Hub
  • 이미지 종류
    • 운영체제와 유사한 이미지
    • 운영체제에 하나의 소프트웨어가 포함된 이미지
    • 운영체제에 여려 개의 소프트웨어가 포함된 이미지
  • Container의 다양한 조합
    • 일반적으로 하나의 소프트웨어 또는 하나의 이미지를 가지고 생성함
    • 여러 개의 이미지를 하나의 Container로 묶어 배포하는 것 도 가능함
    • WordPress를 사용하기 위해서는 Apache, MySQL, WordPress 3가지 소프트웨어가 필요한데 이 경우 3개의 컨테이너를 만들어도 되고 하나의 컨테이너에 3개를 묶어 사용할 수 있음
  • 컨테이너를 폐기하면 안에 존재하는 데이터도 같이 소멸되는데 데이터를 보존하고자 할 경우 Docker나 물러직 하드 디스크를 마운트하여 저장하는것이 가능하다.

 

8) 장점

  • 가상화 소프트웨어보다 더 가볍게 동작
  • 다른 컴퓨터에서 동작하는 이미지를 가져와 사용할 수 있기 때문에 개발 환경과 운영 환경을 거의 동등하게 재현하는 것이 가능
  • 거의 모든 클라우드 플랫폼에서 서비스를 제공함

 

9) 단점

  • Container는 운영체제의 동작을 완전하게 재현하지 못하기 때문에 조금 더 엄밀한 Linux 운영체제의 동작이 요구되는 경우 가상화 소프트웨어를 이용해야 함
  • Docker는 Linux만 지원하므로 운영체제에 제한이 있음

 

10) 주요 도구

  • Containerd
    • LXC를 이용한 Container를 구동시키는 도구
    • Image 전송 및 스토리지에서 Container 실행 및 감독, 네트워크 연결까지 Container의 Life Cycle을 관리하는 도구
  • Buildkit
    • Dockerfile의 설정 정보를 이용해 Docker Image를 빌드하는 도구
  • Docker CLI
    • Docker 명령을 수행하는 명령행 도구
    • 터미널에 명령을 입력하면 CLI가 명령을 받아 해석하여 containerd에게 명령을 전달하여 수행

 

11) 용도

  • PaaS 서비스를 가능하게 하는 개발 환경을 제공하는 것

 

12) Docker Engin 및 CLI 설치

  • Windows와 Mac은 Docker 사이트에서 회원가입 후 Docker Desktop을 다운답다 설치
  • Windows는 wsl2도 함께 설치해야함

 

13) 기본 사용

  • 이미지 다운로드 : docker pull hello-world
  • 도커 이미지 확인 : docker images
  • 이미지로 컨테이너 생성 : docker run hello-world
  • 컨테이너 확인 : docker ps -a ( 모든 컨테이너 출력함 )

14) 정보 확인

  • 도커의 버전 확인 : docker version
    • 버전만 확인 : docker -v
  • 도커의 구성 정보 및 현재 상태 확인 : docker info
  • 도커의 디스크 사용량 확인 : docker system df
  • 도커 관련 이벤트 정보를 표시 : docker system events

 

 

2. Container

1) Docker Container 기반의 애플리케이션 개발 과정

  • 애플리케이션 코드 개발
  • Base Image를 이용한 Dockerfile 작성
  • Dockerfile Build를 이용한 이미지 생성
  • 생성된 이미지를 이용해 컨테이너 실행 후 애플리케이션 서비스 테스트
    • 여러 컨테이너를 가지고 개발한 경우 Docker-Compose를 이용해 다중 컨테이너를 실행하여 테스트
    • 마이크로 서비스를 만들 때 기능 위주로 만드는 경우도 있고 동일한 환경을 사용하는 서비스로 만드는 경우도 있음
  • 로컬 및 원격 저장소에 Image 저장 (push)
  • Code Repository를 이용해 Dockerfile 관리
  • 동일한 환경에서 지속적 애플리케이션 개발 수행

 

2) Docker 명령어 사용

  • 거의 모든 명령어는 docker로 시작
    • 터미널에서 docker로 시작하는 명령어를 입력하면 docker cli 해석을 하여 수행함
  • 기본 형식
    • docker 명렁어 옵션 대상 인지
      • penguin 이미지 다운로드 받기
        • docker image pull penguin
      • penguin 컨테이너를 penguin 이미지를 활용해 백그라운드에서 실행
        • docker container run -d penguin

 

3) 컨테이너 관련 명령어

  • docker container 로 시작
    • start : 실행
    • stop : 중지
    • create : 생성
    • run : 실행
    • rm : 삭제
    • exec : 실행중인 컨테이너 속에서 프로그램을 실행
    • ls : 목록 출력
    • cp : 컨테이너와 호스트 간 복사
    • commit : 도커 컨테이너를 이미지로 변환
      • 대부분의 명령이 container를 생략해도 된다.

 

4) 이미지 관련 명령

  • docker image로 시작
    • pull : 이미지 다운로드
    • rm : 이미지 삭제
    • ls : 이미지 확인
    • build : 도커 이미지를 생성하는 것으로 t 옵션을 종종 이용

 

5) 볼륨 조작을 위한 명령

  • 볼륨 : 데이터를 저장하기 위한 기능
  • docker volume 으로 시작
    • create :생성 ( --name 을 이용해 이름 생성)
    • inspect : 상세 정보 출력
    • ls : 목록 출력
    • prune : 현재 마운트 되지 않은 모든 볼륨 삭제
    • rm : 특정 볼륨 삭제

 

6) 네트워크 조작을 위한 명령

  • 여러 개의 컨테이너가 통신을 하기 위한 기능이 네트워크 (network)
  • docker netwokr 로 시작
    • connect
    • disconnect
    • create
    • inspect
    • ls
    • prune
    • rm

 

7) 기타 명령어

  • checkpoint
  • node : 도커 스웜을 위한 명령어
  • plugin
  • secret
  • service
  • stack
  • swarm
  • system

 

8) 단독으로 사용되는 명령

  • login
  • logout
  • search
  • version

 

 

5. Image 관련 명령

1) docker search

  • Docker Hub에서 이미지를 검색해주는 명령
  • 형식
    • docker search [options] 검색 키워드
  • 동일한 이미지가 여러 개 있는 경우 stars 순으로 출력
  • 공식 이미지는 네임스페이거 생략될 수 있음
  • mysql 이미지 검색
    • docker search mysql
    • 상단의 4개 이미지는 이름만 존재하고 나머지는 Repository이름/이미지 이름의 형태
    • Repository 이름이 없는 경우는 공식 이미지로 되도록 Repository 이름이 없는 이미지를 사용하는 것을 권장한다.
  • 검색 개수 제한 : --limit 개수
    • docker search --limit 5 mysql

2) docker pull

  • 이미지를 다운로드 받는 명령어
    • docker [image] pull [OPTIONS] 이미지이름[:TAG|@IMAGE_DIGEST]
      • image는 생략 가능
      • 태그를 생략하면 latest 버전이 다운로드 됨
  • 결과 확인
    • 하나의 이미지는 여러 개의 layer로 구성될 수 있어서 다운로드 될 때 레이어의 구성을 출력하면 다운로도 된다.
    • 분산 해시 값 (Digest - 이미지의 고유한 이름)이나 버전 등이 표시
  • Jenkins / Jenkins:lts 버전을 옵션 없이 다운로드
  • 옵션
    • -a, --all-tags : 저장소에 태그로 지정된 여러 Image를 전부 다운로드
    • --disable-content-trust : 이미지를 다운로드 할 때 이미지를 검증하는데 이 옵션을 사용하면 이미지 검증을 생략
    • --platform : 플랫폼을 지정하는 것으로 --platform=linux 의 형태로 지정하며 Mac에서 이미지를 다운받아 구동할 때 지정하는 경우가 많음
    • -q, --quiet : 이미지 다운로드 과정에서 나타나는 상세 출력을 숨김

 

  • 실습
    • debian 리눅스의 최신버전 다운로드
      • docker pull debian
    • gcr.io/google-samples/hello-app:1.0 이미지를 다운로드
      • docker pull gcr.io/google-samples/hello-app:1.0

3) Image 정보 확인

  • 형식
    • docker image ls
    • docker images
  • 정보
    • REPOSITORY : 이미지 이름
    • TAG : 버전 정보, 다운로드 받을 때 지정하지 않으면 latest
    • IMAGE ID : 이미지의 고유한 이름으로 원래는 64글자지만 편의상 앞 12글자만 표시
    • CREATED : 이미지가 생성된 날짜
    • SIZE : 이미지 용량

 

4) 이미지의 세부 정보 확인

  • docker imgae inspect [OPTIONS] 이미지 이름
  • 옵션으로 --format 이나 -f를 이용하면 JSON 형식의 정보 중 원하는 형식의 정보만 출력이 가능하다.

 

  • 실습
    • docker image pull httpd
    • docker image inspect httpd
    • docker image inspect --format="{{.Created}}" httpd

 

5) Docker image를 구성하고 있는 Layer와 실행 정보 확인

  • docker image history 이미지 이름
  • 이미지를 구성하는 각 레이어와 레이어가 만들어진 날짜 및 크기를 출력
  • httpd의 각 Layer 구성을 확인
    • docker image history httpd
      • 이미지를 만들기 위해 수행할 명령어 확인 가능
      • 각 명령어를 레이어라고 하기도 하는데 용량이 있으면 레이어, 그렇지 않으면 명령어와 환경 설정이라고 함

 

6) 이미지 업로드

  • docker hub에 만든 이미지를 업로드 하는 것
  • 로그인 관련 명령어
    • docker login
    • docker logout

 

  • 이미지 이름과 태그
    • docker에서는 레지스트리에 업로드 할 때 사용하는 이름을 Tag라고 한다.
    • 형식
      • 레지스트리주소/레포지토리이름:버전 형태로 Tag가 생성
    • Tag 이름 부여
      • docker tag 원본이미지이름[:버전] 변경할이미지이름 [:버전]
    • docker hub에 업로드
      • docker push 이름
    • 이미지 확인 : docker images
    • 기존 httpd 이미지를 이용해 myhttpd:1.0으로 생성
      • docker tag ac45b24b92cc myhttpd:1.0
        • ac45b24b92cc는 기존 httpd 의 image 이름
    • 기존 httpd 이미지를 이용해서 myhttpd:2.0 으로 생성
      • docker tag httpd:latest myhttpd:2.0
    • 업로드를 위한 이미지 이름 생성: 이미지 앞에 DockerHub의아이디/ 가 추가되어야 함
      • docker tag httpd:latest DockerHub아이디/myhttpd:3.0

 

  • docker hub에 이미지 업로드
    • 이미지의 이름이 dockerhub아이디/이미지이름:버전 의 형태여야 함
    • Docker Hub를 이용해서 CI/CD를 구축하고자 할 때는 버전을 변경해가면서 적용
    • 이미지가 없으면 docker pull httpd 로 httpd 라는 이미지를 다운로드
    • 업로드할 이미지를 생성: 지금은 기존 이미지를 복사해서 만들지만 대부분은 Dockerfile을 이용해서 생성
      • docker image tag httpd:latest dxjh/myhttpd:3.0
    • 업로드
      • docker image push dxjh/myhttpd:3.0

 

7) Docker Image를 파일로 관리

  • 원본 Image를 복제를 해서 tar 확장자로 저장하는 것이 가능
  • 이미지를 tar로 저장하는 이유
    • Docker Hub로 부터 내려받은 이미지를 내부망에서 사용하고자 하는 경우
  • 저장 명령어
    • docker image save [옵션] 이미지이름 > 파일경로
  • 로드 명령어
    • docker image load < 파일경로
  • eclipse/mysql 을 tar 로 저장하고 불러오기
    • 이미지를 다운로드
      • docker pull eclipse/mysql
    • 이미지를 확인
      • docker images
    • 이미지를 압축 (444MB)
      • docker image save eclipse/mysql > test-mysql57.tar
    • 기존 이미지 삭제
      • docker image rm eclipse/mysql
    • 이미지를 확인
      • docker images
eclipse/mysql 지워진거 확인

 

    • 이미지 로드
      • docker image load < test-mysql57.tar
  • 이미지를 압축할 때 뒤에 .gz를 추가하면 용량이 줄어든다.
  • 모든 이미지를 저장
    • docker image save -o 파일명 $(docker image ls -q)

 

8) 이미지 삭제

  • 형식
    • docker imgae rm(docker rmi) [옵션] {이미지이름[:태그] | 이미지아이디}
  • 삭제할 때 latest 버전은 태그명을 생략해도 되지만 그 이외 버전은 생략 불가
  • 관련된 모든 이미지를 삭제할 때는 -f 옵션을 추가한다.
  • 셀 스크립트 변수 활용 (Windows에서는 불가)
    • 이미지 전체 삭제 : docker rmi $(docker -images -q)
    • 특정 이미지 이름을 포함한 이미지만 삭제 : docker rmi $(docker images | grep 이미지명)
    • 특정 이미지 이름을 포함하지 않은 이미지만 삭제 docker rmi $(docker images | grep -v 이미지명)

 

  • 컨테이너로 사용하지 않은 이미지를 삭제
    • docker image prune -a
  • 48시간 이전의 모든 이미지를 삭제
    • docker image prune -a -f --filter "until=48h"

 

 

 

#비전공자 #성장기 #DX #AI #빅데이터 #개발자 #김제이 #LG #LG헬로비전 #dxdataschool #2기

#부트캠프 #데이터분석 #Docker

 

'DX Data School' 카테고리의 다른 글

쿠버네티스 (Kubernetes)  (0) 2024.04.08
Docker 2  (0) 2024.04.08
Container 와 Virtualization  (0) 2024.04.05
CI/CD  (0) 2024.04.05
MSA 구성 요소 및 MSA 패턴  (1) 2024.04.01