본문 바로가기

AWS 교육/Docker-AWS (월)

241028_Data Container, Build, Dockerfile, 이미지 경량화

728x90

다운로드

 

◈ Data Container

 - 여러 컨테이너에 데이터를 공유하고자 하는 경우 데이터 컨테이너 또는 볼륨 컨테이너를 만들고 , “—volume-from 공유 컨테이너명 ˮ 옵션을 사용하여 볼륨을 공유할 수 있다

 

 - 이때까지는 우분투에 데이터를 보관했으나 이제 데이터를 보관하는 컨테이너를 만드는 것

 - 데이터 컨테이너는 시작시킬 필요가 없음

 

◆ 암시적 Volume

 ㄴdocker volume create my-data

  ㄴ호스트 컴퓨터의 /var/lib/docker/volumes/my-data

 

-v <호스트 볼륨>:<컨테이너 디렉토리>

-v /share-data                                                  // 호스트볼륨이 없기에 임의로 볼륨이름을 생성, 제공함

-v <호스트 디렉토리 or 파일명>:<컨테이너 디렉토리 or 파일명>

 

 docker volume 방식에서 volume 이름을 임의로 만들어 줌

 

$ docker inspect share-container

 도커 볼륨으로 외부에서 디렉토리에 저장되고 share컨테이너에 저장되고 해당 컨테이너와 공유하는 data-1컨테이너에도 저장되기에 이중으로 연결된 내용을 확인 할 수 있다

data1컨테이너에서 파일을 만들고 종료하여 컨테이너를 정지한 후 

  data-2컨테이너를 만들어서 제대로 연동이 되어 있는 지 확인

 

 이렇게 2단계로 연동을 하면 좀더 안정적으로 데이터 보관이 가능하다

 

★ Auto Scaling

 - 클라우드 환경에서 자원의 수를 자동으로 조정하여 애플리케이션의 성능을 최적화하고 비용 효율성을 높이는 기술

 - 특정 조건을 지정하여 서버를 늘리거나 줄이는 작업을 자동으로 하는 작업

 - web은 사용자가 늘면 자동으로 생성하고 줄면 자동으로 줄이나, 다른 웹에서 쓴 데이터를 다른 웹에서도 쓰고 볼 수 있어야 하니 다른 곳에 데이터를 저장해서 그걸 전부 모든 웹에 연결시키면 데이터가 남아있음

 

◆ Bind Mount

 세부 내용은 암시적 볼륨과 동일 하며 특정 볼륨과 연결하는 정도의 차이

 

 

◆ 데이터 지속성을 위한 Volume 구성

 - 마이그레이션 : 다른 프로그램에서 데이터를 옮기는 것 (한글에서는 excel로 데이터를 옮기는 느낌)

  ㄴ a데이터를 b데이터로 넘길 때 중간 데이터를 test파일로 넘기는 것

 데비안 계 현재 os 확인하는 방법

 

◆ nignx log

- 데이터의 로그를 실시간 확인 및 유지를 위한 컨테이너

  ㄴ 이렇게 컨테이너를 제작 후 연결된 ip주소를 웹에 접속 시 access.log에 남게된다

 ㄴ 8011 포트로 접속 성공 시에 access.log에 남음

 

 

11. Dockerfile 작성.pdf
0.48MB

 

◈ Docker File

 - Docker 에서 동작하는 컨테이너의 구성 정보를 프로비저닝 (Provisioning) 한 텍스트 template 파일

 ㄴ 프로비저닝 : 사용자의 요구에 맞게 시스템 자원을 할당 , 배치 , 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것

 - 컨테이너에 설치해야 하는 패키지 , 소스 코드 , 명령어 , 환경 변수 설정 등을 기록한 하나의 파일

 - Docker 이미지는 컨테이너가 런타임 환경으로 동작하기 위해 필요한 특정 기술 또는 서비스를 사전에 구축한 환경

 - 애플리케이션 배포에 필요한 컨테이너 인프라를 코드 형태로 정의한 파일이다.

    이러한 개념을 IaC(Infrastructure as Code) 라고 한다 .

 - 원하는 환경의 Docker Image 개발에 필요한 Instration( 명령 ) 을 포함한 텍스트 파일

 

 - docker build: Dockerfile 을 사용하여 docker image 생성 과정을 트리거하는 Docker CLI

 - Image registry: 생성된 이미지를 public or private 하게 저장할 수 있는 영역

☆ 이론은 11번 pdf를 보고 실습을 11-01번 pdf로 실행한다

11-01. 다양한 Dockerfile build.pdf
0.82MB

 

◆ Docker Build

 - 도커에서 이미지를 생성하는 명령어

 - 도커파일은 기본적으로 Dockerfile이라는 설정 파일을 기반으로 이미지를 생성 (디폴트 값, 대문자 D 사용)

 - 도커는 Dockerfile의 지침을 순차적으로 수행하여 이미지를 생성,

   이 과정에서 각 단계는 새로운 레이어로 생성되어, 변경 사항이 있을 때만 해당 레이어를 다시 빌드

  ㄴ도커 파일에서 이미지로 실행되는 순서

 

ㄴ 도커 빌드를 제작하여 확인하기 위한 기본 웹파일 제작

 ㄴ /home/ubuntu/sample/index.html         // 웹파일의 기본 위치

 ㄴ 디폴트 Dockerfile 파일 제작

 ㄴ이런 형식으로 도커허브에서 실행하여 이미지를 구축

 

$ docker build -t mywebserver:1.0 .         // 현재 디렉토리에 Dockerfile이 없다면 .이 아닌 파일명을 써야함

 ㄴ 이렇게 도커이미지를 만든다

 ㄴ 컨테이너 제작 완료 시 8001포트로 접속하면 index.html로 연결된 내용을 확인 할 수 있다

 ㄴ history를 확인하면 이미지생성과정을 볼 수 있다

 

◆ Docker File 명령어

★11번 파일의 Docker file 명령어를 잘 확인 한다

 RUN에서 레이어 수가 감소하면 다운되는 수도 줄기에 용량이 감소한다

  -y를 붙이지 않으면 목록을 가져와 출력하여 묻는데 데이터를 사용하기에 명령어 사용으로 조금이라도 줄일 수 있음

 CMD에서 운영체제는 shell만 정상작동하면 연결된다 ( /bin/bash 등)

 

 CMD는 entrypoint와 비슷

 copy는 add와 비슷

 

 ARG = 매개변수

 

◆ 도커파일 최적화

 - 빠른 컨테이너 구성을 위한 "최소한의 설정과 구성" 을 권장

 - Docker 에서 제공되는 base image 들도 해당 이미지의 지향점에 필요한 프로그램 , 라이브러리 , 실행 파일 만을 보유한다

 - 이미지 내부에 불필요한 파일을 포함하지 않기 위해 “.dockerignoreˮ 의 사용으로 빌드와 관련 없는 파일을 이미지 내부에 넣지 않는다 .

 

 - 작성 시 불필요한 패키지 설치를 피하고 , 설치된 패키지 파일은 autoremove, clean 등의 명령을 통해 제거하면 경량화에 효과적

ch11디렉토리에 다른 디렉토리를 만들어서 sample의 index를 복사한 후 도커파일을 제작

 ㄴ기본도커파일명이 아니기에 -f 하여 파일명 입력 필요

 도커파일을 이용하여 myweb이라는 이미지 생성

 

 도커파일1을 cp 명령어로 2로 복사하여 내용 수정

 우분투 14.04버전은 apt만 있으면 인식하지 못하기에 apt-get으로 다운로드 설정

 ㄴ설치 밑의 세부분은 캐시파일 삭제를 의미

 새 버전의 이미지 생성

 캐시파일 삭제만으로 어느정도의 용량이 감소함을 확인할 수 있다

 

 이번에는 도커파일1 을 3으로 복사 후 내용 수정

 ㄴ 베이스 이미지를 우분투에서 알파인으로 변경

 엄청나게 용량이 줄어든 것을 확인 할 수 있다

 

 용량이 줄었기에 보관도 사용도 편해지는 게 알파인 버전이다

기본에 2.0은 설치까진 동일하나 이후 캐시파일을 삭제하고 3.0은 처음부터 설치되는 베이스 이미지의 용량이 적다

 

 - Alpine Linux 를 사용하면 생성되는 최종 이미지의 크기와 복잡성을 줄이는데 도움이 되어 성능이 향상되고 빌드 시간이 빨라진다 . 또한 최종 이미지에 존재할 수 있는 잠재적인 취약점의 수를 줄여 보안 향상도 기대할 수 있다 .

 

 ◇ scratch

  - 아무것도 없는 빈 Image      // 내부 실행을 위한 3가지 방법

  ㄴ가 . 정적 바이너리 실행파일 생성을 위한 gcc 활용

  ㄴ나 . busybox 컨테이너의 실행 도구를 cp

  ㄴ다 . 실행 파일이 있는 rootfs.tar.xz 를 cp

 

   ㄴ먼저 c컴파일러를 사용하기 위해 gcc를 인스톨

 ㄴ printf   = 화면에 출력하라 (알아서 줄을 바꿔주지 않기에 \n을 추가)

  gcc프로그램을 이용하여 소스파일을 기계어프로그램으로 번역하여 바꾼다 (-o 하여 이미지생성하여 입력)

 이렇게 바로 실행가능한 파일로 변경된다

app.js    
Node.js go-to-lightweight shell script
OS OS Linux(쉘)

 

 도커파일우분투를 제작하여 내용을 입력한 후 도커파일 스크래치로 복사하여 내용 수정 (FROM을 스크래치로)

 각 버전의 도커이미지 생성

 우분투와 스크래치의 용량을 확인 할 수 있다

 

 ★ Scratch 이미지

  - 가장 기본 패키지조차 없는 완전 빈 박스

  - 일반적으로 Go, Rust, C 같이 정적으로 컴파일 된 바이너리를 실행하는 데 사용됨

 

 이제 출력확인 후

 2.0은 오류발생을 확인 할 수 있는데 

 여기서 2.0을 삭제 (수정하여 재 제작할 예정)   // docker rmi -f lightweight:2.0

 도커파일의 CMD 형태를 exec형태로 수정 한 후 빌드하여 2.0 이미지 생성하면 

 정상 작동되는 것을 확인 할 수 있다

이미지 파일을 열고 컨테이너로 그 위에 레이어를 쌓고 그걸 이미지로 만들어서 또 위에 레이어를 쌓는다

728x90