본문 바로가기

docker

3W docker study

책 : 시작하세요! 도커/쿠버네티스 (개정판)을 이용한 Docker스터디 3W 주간 내용 정리

 

2.3 도커 이미지

당연히 기본적으로 docker search를 수행하면, 공식 Docker저장소인 도커 허브 "https://hub.docker.com/" 의 정보가 조회된다.
docker search ubuntu  docker search docker.io/ubuntu 수행하는 것과 같은 결과를 제공한다.

 

구글도 해당 도커 저장소를 제공하는 기능이 있으니 참고하면 좋을것 같다.

https://cloud.google.com/container-registry?hl=ko  (gcr.io 로 저정소 지정)

 

Container Registry  |  Google Cloud

팀이 한 곳에서 Docker 이미지를 관리하고, 취약점 분석을 수행하며, 세분화된 액세스 제어 기능으로 액세스 허용 수준을 결정할 수 있습니다.

cloud.google.com

 

  • 검색된 이미지 중에 STAR와 Offical여부를  보고 사용하면 된다

 

- 2.3.1 도커 이미지 생성

  • docker를 사용해서 환경구성 후, 각자의 요구사항에 따른 변화된 사항을 개발할것입니다. 
    그리고 추가된 사항을 별도 이미지로 저장하는 것은 대부분 필요합니다.

  • commit의 정의 : 컨테이너를 이미지로 만드는 작업!!
<명령어>
docker commit [OPTIONS] CONTAINER [REPOSITORY][:TAG]]

- tag부분은 유동적으로 사용 (미 사용시 latest로 설정됨)
- 제일 중요한 부분은 container이름을 적는 것이다.
- a 옵션은 author의 의미이다. 
- m 옵션을 message 의미이다.



여기서 눈여겨볼 사항은 대상을 정할때, images명이 아닌 Container를 기준으로  한다는 점이다.!!
commit을 할때, 기준이 Container가 된다.
  • commit을 통해서 다양한 tag버전을 생성할 수 있다.

 

- 2.3.2 이미지 구조 이해

  • 엔진의 구성요소 :  컨테이너 → 이미지 + 레이어
  • 여기서 Read Only속성의 이미지의 이해를 조금 더 해본다.
  • 실습으로 확인해본 Layer항목
  • ubuntu기반으로 만들어진 이미지를 보면 당연히 예상한대로 증분을 통해서 기존의 사항(Layer)는 동일한 hash값을 가지고 있다.

 

<명령어>
1. docker history 이미지:tag             // 이미지 레이어 구조를 파악하기
2. docker rm -f [container name]  // 이미지 레이어는 실제 삭제 안되고 이미지 이름만 삭제됨
3. docker rmi [container_name].   // 이미지 레이어 삭제
4. docker images -f dangling=true  // 사용중인 이미지 삭제시 이미지 이름이 <none>으로 변경되는 것 조회


- 2.3.3 이미지 추출

  • 이미지를 별도로 저장하거나 이동할때 사용하는 방법
  • 해당 방법은 효율적인 방법이 아닙니다.
    • 위에서 언급된 Layer구조를 통한 용량관리에 대한 장점이 없습ㄴ디ㅏ.
    • 용량을 각기 차지하게 됩니다.
> docker save -o [추출파일명] [대상컨테이너이름]
  실행한 명령어 위치에 생성됨
> docker load -i ubuntu_14_04.tar
  생성한 이미지를 다시 로드 
  • save / load : container이미지 + 컨테이너 생성시 detached모드, 컨테이너 설정등도 다 포함
  • export / import : container 이미지 정보만 대상으로 합니다.
  • save로 추출한 파일을 import로 수행해서 동작시켜본 화면
    • 실행은 정상적으로 되었음


- 2.3.4 이미지 배포

  • 2가지 방법이 있습니다.
    DockerHub이용하는 방법 / 도커 사설 레지스트리를 사용하는 방법 
    • ① 공식 DockerHub를 이용하는 방법
      • public : 갯수 제한 없음 (대외 공개 필수)
      • private : 1개는 무료 제공 (추가 사용은 유료 결제가 필요함)
    • ② 도커 사설 레지스트리 (Docker Private Registry)
      • 사용자가 직접 이미지 저장소를 만드는 과정

 - 2.3.4.1 도커 허브 저장소

  •  docker pull을 수행시, 자동으로 host cpu 아키텍처에 해당하는 이미지를 자동으로 처리 (ex : amd64)
  • docker hub에 "docker login"을 통해서 로그인 후에
  • docker push [docker id]/[이름]을 통해서 실제 업로드를 수행한다.
  • 웹훅 기능을 제공해서 docker-hub의 변경사항이 있으면 알림 기능을 사용할수 있다.

 

 - 2.3.4.2 도커 사설 레지스트리

  • registry : 사설 구성시 필요한 이미지를 docker에서 공식적으로 제공한다.
  • mac에서 아래 5000 포트는 airdrop에서 사용중이라서 다른 포트를 사용해야 한다.

  • 주의점 / CheckList
    • 레지스트리 Rest-API를 사용해야 합니다.
    • 도커엔진은 명령행 도구 docker ps와 같은 명령어를 사용할수 있지만, registry container에서는 별도의 인터페이스를 제공하지 않습니다. !!! 그래서 REST-API를 사용해야 합니다.
    • 도커데몬이 기본적으로 https를 사용하기 때문에, 사설인증서를 구축하거나, 별도 설정을 해야 합니다.
      • --insecure-registry
    • nginx을 통한 인증처리 구성 가능합니다.
  • https://docs.docker.com/registry/
 

Docker Registry

 

docs.docker.com

 


2.4 Dockerfile

  • docker를 통해서 수행한 일련의 과정을 정의한 build파일과 같은 개념
  • 도커 허브 배포시, 이미지 자체를 배포하지 않고, Dockerfile을 배포할수 있음
  • 대부분 이미지 배포시, Dockerfile을 함께 배포합니다.
  • 도커 엔진은 Dockerfile을 읽을 때 기본적으로 현재 디렉토리에 있는 Dockerfile 파일을 선택합니다.

- 2.4.1 이미지를 생성하는 방법
- 2.4.2 Dockerfile 작성

  • 파일명을 Dockerfile이 아닌 dockerfile로 작성을 하여도 정상 작동은 한다.
  • Dockerfile 작성
    • 명령어를 소문자로 작성해도 무관하지만, 관례적으로 대문자로 표기한다.
    • 아래 예시에서 RUN, RUN, WORKDIR, RUN으로 수행한 이유가 있다. 
      • cd역활을 하는 WORKDIR을 통해서 경로이동 후, 다음 작업을 진행하기 때문이다.
FROM ubuntu:14.04
→ 이미지 이름을 의미함 (docker run에서 사용했던 동일한 이미지를 뜻함)
→ 이미지가 없으면 pull로 땡겨옴

MAINTAINER alicek106
→ 이미지를 생성한 개발자 정보
→ docker 1.13.0이후에는 사용하지 않음
→ LABEL을 대신해서 사용함
→ LABEL maintainer "alicek106 <aaaa@gmail.com>"

LABEL "purpose"="practice"
→ 이미지에 메타데이터를 추가합니다.
→ 키:값 형태로 입력
→ docker inspect에서 출력되는 정보

RUN apt-get update
RUN apt-get install apache2 -y
→ 이미지를 만들기 위해서 컨테이너 내부에서 명령어 실행
→ Y/N옵션에 대해서 -y로 인자값 전달

ADD
test.html /var/www/html
→ 파일을 이미지에 추가합니다.
→ 원본 파일을 Dockerfile이 있는 위치에서 조회합니다.

WORKDIR /var/www.html
→ 명령어를 실행할 디렉토리를 나타냄
shell에서 cd와 같은 역활


RUN
["/bin/bash", "-c", "echo hello >> test2.html"]
→ RUN ["실행가능한 파일", "명령줄 인자1", "명령줄 인자2", ....]
→ Json형태로 구성함

EXPOSE 80
→ 이미지에서 노출할 포트를 설정
→ 단지 컨네이너가 해당 포트를 사용하는것을 나타내는 역활
→ container run 수행시, 모든 노출된 컨테이너의 포트를 host에 퍼블리시 하는 -P 플래그와 함께 사용함


CMD
apachectl -DFOREGROUND
→ container가 시작될때 마다 실행할 명령어 이다.
Dockerfile에서 한번만 사용이 가능하다
→ Json형태로 ["실행간으한 파일", "명령줄 인자 1", "명령줄 인자 2", ....] 형태도 가능

 

- 2.4.3 Dockerfile 빌드

  • 실습
    • build 명령어 사용
    • -t 옵션을 사용하지 않으면, 16진수 이름의 형태로 이미지가 저장되므로 -t옵션 사용하기
    • ./ : 경로를 현재 폴더를 지정하였지만, 외부 경로를 사용할수도 있음
    • 해당 시점은 이미지를 생성만 한 상태입니다. 아직 run 상태가 아닙니다.

 

  • 생성된것 run하고 label로 검색 해보기
  • mac에서 80 port를 사용중이라서 접속이 안될것으로 생각된다.
  • 여기 예시에서 -P는 대문자이다
    • 이전에 port설정은 -p 소문자였다.
    • 책에서는 -P옵션에 대해서 "EXPOSE로 노출된 포트를 호스트에서 사용가능한 포트에 차례로 연결하므로 이 컨테이너가 호스트의 어떤 포트와 연결되었는지 확인이 필요함" 설명하고 있습니다.

  • ADD 말고COPY 명령어도 있음
  • / (root) 위치에서 이미지 빌드를 하지 않아야 합니다.
    • 하위 디렉토리의 내용까지 전부 포함됩니다.
  • .dockerignore 파일
    • .gitignore와 같은 역활이며, build시 제외해야 할 파일을 정의합니다.
*.html
→ .html확장자를 가지는 모든 파일
*/*.html
→ 디렉토리 구분을 의도한것 (위 예시는 1개의 디렉토리를 의미)
→ */*/*.html : 디렉토리 2개를 거치고 마지막이 *.html을 의미함
test.htm?
→ ?는 한자리 문자열을 의미함 
→ ?? 

 

 

  • 각 명령어 1개마다 새로운 컨테이너가 생성됩니다. (중요한 개념)

  • Dockerfile이름이 아닌 다른 이름의 파일을 이용하려고 할때, 지정하는 옵션 -f 
    • 같은 폴더에 Dockerfile, Dockerfile2 2개가 있는경우, 의도한 파일로 지정하는 것입니다.
    • -f 가 force의 의미는 아니고, file의 의미입니다.

  • cache관련
    • --no-cache : 소스 영역등에 자주 변경되는 경우 cache 처리를 사용하지 않는 옵션
    • --cache-from : 특정 저장소에 대해서는 cache를 사용하는 것

 

 

- 2.4.3.3 멀티 스테이지를 이용한 Dockerfile빌드하기

  • 간단한 go를 이용한 "hello world"를 출력하는데, 많은 용량을 차지힌다.

 

  • Multi-Stage 빌드 방법
    • 여러개의 FROM이미지를 정의해서, 최종적으로 생성된 이미지를 줄이는 방법
    • 아래와 같이 FROM을 2개 이상으로 구성
    • go에 build에 필요한 alpine(필수적인 런타임 요소가 포함된 리눅스 배포판)을 이용해서 구성

 

- 2.4.4 기타 Dockerfile 명령어

  • ENV : Dockerfile에서 사용될 환경변수를 지정
    • ${ENV_NAME}, $ENV_NAME 형태로 사용
    • 이미지에도 저장되어서 함께 사용가능
  • VOLUME : build 이미지로 컨테이너를 생성했을때 "호스트와 공유할 컨테이너 내부의 디렉토리를 설정" 
    • json형태로 복수개 지정 가능 : ["/home/dir", "/home/dir2"]
    • /home/dir 형태로 단독 설정 가능
  • ARG : build명렁어를 실행할때 추가로 입력받아서 Dockerfile내에서 사용할 변수의 값을 설정
    • 키=값 형태로 쌍을 이루어야 함
  • USER : 컨테이너 내에서 사용될 사용자 계정의 이름이나, UID를 설정
    • 설정한 사항이 관련 사용자 권한으로 실행함
    • root권한이 아니면, 권장됨
  • docs : https://docs.docker.com/engine/reference/builder/
 

Dockerfile reference

 

docs.docker.com

 

 

  • ONBUILD : 빌드된 이미지를 기반으로 다른 이미지가 Dockerfile로 생성될때 실행할 명령어를 추가
  • STOPSignal : 컨테이너가 정지될때 사용될 시스템 콜의 종류를 지정
  • HealthCheck : 이미지로 부터 생성된 컨테이너에서 동작하는 애플리케이션의 상태를 체크하도록 설정
  • Shell : Dockerfile에서 사용하게 될 shell 지정
    • 리눅스 default shell : /bin/sh -C
    • Window default shell : cmd /S /C
  • ADD, COPY 차이점
    • ADD가 더 큰 개념
    • copy는 local에 있는 파일만 대상으로 함
    • add는 외부 url 및 tar파일을 추가 할수 있음
  • ENTRYPOINT, CMD
    • 실습시 bash가 아닌 화면이 있었음
    • 기본적인 command는 /bin/bash
    • entrypoint는 커맨드를 인자로 받아 사용할수 있는 스크립트의 역활을 할수 있다!!!
    • --entrypoint를 shell파일로 지정해서 다양한 기능을 수행한다.


- 2.4.5 Dockerfile로 빌드할 때 주의할 점

  • \ 역슬레쉬 구성으로 가독성 확보
  • fallocate 옵션 사용 : 100mb파일을 가상으로 할당, 나머지는 레이어로 빌드 
  • && : 여러개 명령어를 실행하는것을 묶어놓기

 

2.5 도커 데몬

컨테이너, 이미지, Dockerfile등을 밑바탕으로 이제 실제 도커 자체에 대한 이해 필요

아래 그림처럼 우리가 일반적으로 수행한 명령어가 "도커 데몬"에서 인식하여서 실제 컨테이너를 동작시킵니다.

 

 

- 2.5.1 도커의 구조

  • 도커의 구조는 크게 두가지로 나뉩니다.
    • 클라이언트 역활의 도커
      • /var/run/docker.sock에 위치한 유닉스 소켓을 통해 도커 데몬의 API를 호출한다.
    • 서버역활의 도커
      • dockerd 프로세스가 동작
  • 명령어 구분
    • which docker : /usr/bin/docker (리눅스 기준, mac은 다른 위치에 있음)
    • ps aux | grep docker : /user/bin/dockerd (실행중인 프로세스의 이름이 docker가 아닌 dockerd입니다.)
    •  

- 2.5.2 도커 데몬 실행

  • 리눅스에서는 docker를 설치하면 service에 자동 등록 및 재시작하여도 자동 실행이 됩니다
    • 레드헷 계열은 systemctl enable docker를 통해 등록 필요

- 2.5.3 도커 데몬 설정

앞에 예제에서 https가 기본인 설정을 변경하는 것을 해보았습니다.

즉, 실제 "도커 데몬"에 대한 설정을 하는 옵션에 대한 설명입니다.

  • 교재 p.152에서 보면 dockerd --help를 수행하면 도움말을 볼수 있다고 나오는데
    Host(클라이언트)에서 수행시 : X
    도커 실행후, 해당 컨테이너에서 수행시 : X
    모두 실행되는 결과를 볼수 없었습니다.
  • -H : 도커 데몬 제어
    • /var/run/docker.sock
    • -H unix:///var/run/docker.sock
    • -H tcp://0.0.0.0:2375
    • -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
  • --tlsverify : 도커 데몬에 보안 적용
  • --storage-driver : 도커 스토리지 드라이버 변경
    • 우분투(데비안) : overlay2
    • CentOS : deviceampper
    • 기타 :  OverlayFS, AUFS, Btrfs, VFS, ZFS


- 2.5.4 도커 데몬 모니터링

  • D : 도커 데몬 디버그 모드
    • dockerd -D
    • 문제 발생시 가장 확실히 확인 가능
  • event
    • docker events
    • docker system event
    • 데몬에서 발생되는 이벤트 정보
  • stats
    • docker status
    • 실행중인 모든 컨테이너의 자원 사용량을 스트림으로 출력
  • system df
    • docker system df
    • 도커에서 사용하고 있는 이미지, 컨테이너, 로컬볼륨의 총 개수 및 사용중인 갯수, 크기 확보공간등에 대한 정보
  • CAdvisor
 

GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.

Analyzes resource usage and performance characteristics of running containers. - GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.

github.com

- 2.5.5 파이션 Remote API 라이브러리를 이용한 도커 사용

도커를 제아하고 싶을 경우 일일이 Remote API에 대한 요청을 소스코드로 작성할 필요 없이,

이미 Remote API를 래핑해서 사용하기 쉽게 만들어 놓은 라이브러리 사용

 

https://docs.docker.com/engine/api/sdk/

 

Develop with Docker Engine SDKs

 

docs.docker.com

 

 

'docker' 카테고리의 다른 글

4W docker study  (0) 2023.01.24
2W docker study  (0) 2023.01.24
1W docker study  (0) 2023.01.24