Fall in IT.

Docker 간단 개념정리 본문

기타

Docker 간단 개념정리

D.Y 2021. 4. 4. 22:28

Docker란

  • Docker는 컨테이너 가상화 환경에서 애플리케이션을 관리하고 실행하기 위한 오픈소스 플랫폼이다
  • 리눅스 위에서 동작하는것이 특징이며 Go 언어로 만들어졌다.

 

 

Docker의 특징

  • 이식성
    • Docker는 기본적으로 애플리케이션이 동작하는 모든 인프라 환경을 컨테이너로 관리한다
    • 애플리케이션 실행에 필수적인 모든 파일 및 디렉터리를 통째로 컨테이너에 담는다
    • 그리고 이 컨테이너의 기반이 되는 Docker 이미지를 Docker Hub에 공유한다
    • 이런 Docker의 특성 때문에 개발 환경에서는 동작하지만 운영 환경에서는 동작하지 않는 리스크를 줄일 수 있다.
  • 상호 운용성
    • 여러 조직이나 시스템과 연계하여 사용할 수 있는 소프트웨어의 특성을 상호 운용성이라고 말한다
    • Amazon EC2 Container Service
    • Kubernetes (Google이 개발한 오픈소스로 Docker 컨테이너 통합 관리 프레임워크이다)

 

 

Docker의 기본 기능

  • Docker 이미지 생성
  • Docker 컨테이너 동작
  • Docker 이미지 공개 및 공유

 

 

Docker 이미지 생성

  • Docker는 애플리케이션 실행에 필요한 프로그램, 라이브러리, 미들웨어와 OS, 네트워크 설정 등을 하나로 모아 Docker 이미지를 생성한다.
  • Docker 이미지는 실행 환경에서 동작하는 컨테이너의 기반이 된다.
  • Docker 이미지란 애플리케이션 실행에 필요한 파일이 담긴 디렉터리이다.
  • Docker 이미지는 Docker 커맨드를 사용하여 수동으로 만들 수 있고
  • Dockerfile 프로그램을 통해 자동으로 생성할 수도 있다.

 

Docker 이미지를 여러개 사용하여 새로운 이미지를 생성할 수 있다.

ex. CentOS, Apache, Mysql 등

 

 

Docker 컨테이너 동작

  • Docker는 Linux 상에서 컨테이너 단위로 서버를 구동시킨다.
  • 이 컨테이너의 기반이 되는것이 Docker 이미지이다.
  • 도커 이미지가 설치되었다면 컨테이너를 구동시킬 수 있다
  • 컨테이너는 Docker 커맨드로 컨트롤 할 수 있다. (시작/정지/삭제 등)
    • 다른 가상화 기술로 서버를 사용할 때에는 OS부터 구동시키고 애플리케이션을 실행시켜야하므로 많은 시간이 소요되지만
    • 도커는 이미 동작하고 있는 OS위에서 프로세스 형태로 실행되기 때문에 빠르게 동작한다.
    • 하나의 이미지로 여러개의 컨테이너를 실행 시킬 수 있다

 

 

Docker 이미지 공개 및 공유

  • Docker 이미지는 Docker 레지스트리에서 통합적으로 관리할 수 있다
  • 공식 Docker 레지스트리는 Docker Hub이다
  • Docker Hub에서는 기본 베이스 리눅스 배포판 이미지를 제공하고 있다.
  • 이를 기반으로 미들웨어, 라이브러리, 애플리케이션 등을 포함한 이미지를 중첩하여 독자적인 Docker 이미지를 만들면 된다.

 

 

Docker 컴포넌트

  • Docker Registry (이미지 공개 및 공유)
    • 컨테이너의 기반이 되는 Docker 이미지를 공개 및 공유하기 위한 레지스트리 기능이며
    • 도커 공식 레지스트리 서비스인 Docker Hub도 이러한 Docker Registry를 사용한다
  • Docker Compose (여러 컨테이너 통합 관리)
    • 여러 컨테이너의 구성 정보를 코드로 정의하고 커맨드를 통해 애플리케이션 실행 환경을 구성하는 컨테이너 통합 관리 툴
  • Docker Machine (Docker 실행 환경 구축)
    • 로컬 호스트용인 VirtualBox를 시작으로 AWS EC2 등 클라우드 환경에서 Docker 실행 환경을 커맨드로 자동 생성하기 위한 툴
  • Docker Swarm (클러스터 관리)
    • Docker Swarm은 여러 Docker 호스트를 클러스터화하기 위한 툴

 

Docker에서는 애플리케이션 실행 환경을 구동하기 위해 이러한 컴포넌트를 필요에 맞게 조합하여 사용한다

 

 

Docker의 동작구조

  • 컨테이너를 구분하는 구조 (namespace)
    • Docker는 컨테이너라는 독립된 환경을 만들고 이를 나누어 애플리케이션 실행환경을 만든다.
  • 리소스 관리 구조(cgroup)
    • 도커는 여러 컨테이너에서 물리 머신의 리소스를 공유하여 사용한다
    • 이때 Linux 커널 기능인 cgroup을 이요하여 리소스 할당 등의 관리를 수행한다
  • 네트워크 구성 (가상 bridge 및 가상 NIC)
    • 도커의 컨테이너는 서버의 물리 NIC와 별도로 각 컨테이너마다 가상 NIC가 할당되어 있다
    • 동일한 호스트상의 Docker 컨테이너는 구동 시 private Address가 자동으로 할당되므로 컨테이너끼리 통신하기 위해 링크 기능을 사용한다
    • 컨테이너의 alias 명을 통해 서로 다른 컨테이너에 접속할 수 있다
      • 각종 서버용 컨테이너의 로그 파일을 로그용 컨테이너에 출력하는 방식으로 사용할 수 있다
      • 멀티 호스트 환경에서는 링크 기능을 사용하여 통신이 불가능하다
  • 도커 컨테이너와 외부 네트워크 통신
    • 도커에서는 NAPT(Network Address Port Translation) 기능을 사용하여 접속한다
    • 컨테이너 구동시, 컨테이너 내의 웹 서버가 사용하는 80번 포트를 호스트 OS의 8080번 포트로 전송하도록 설정하였을 때
    • 외부 네트워크에서 호스트 OS의 8080번 포트에 액세스하면 컨테이너 내의 80 포트로 연결되는 구조이다

 

NAT는 global IP Address와 private IP Address를 1대1로 변환한다

NATP는 IP Address와 포트까지 변환하는 기술이다.

 

(+번외)

로컬에서 Docker를 사용할때 우리는 Docker 엔진의 작동방식이 어떻게 되는지 모르는 경우가 많다.

아래 이미지를 보면 간단히 확인할 수 있다.

  • Docker는 Client와 Server로 분리되어 있는데, (아래 명령어를 치면 확인가능)
    • $ docker version
  • Client는 사용자에게 입력을 받는 CLI 영역에 해당하고
  • Server는 입력받은 CLI를 실제로 작업을 수행하는 영역에 해당한다

 

Docker의 설치 방법과 기본 커맨드

 

이미지 다운로드

  • 도커 이미지는 Docker Hub에서 다운 받을 수 있다
  • $ docker pull [옵션] <이미지명>:[:태그명]
    • $ docker pull centos:7 (태그명 생략시 최신 버전 다운로드)
    • $ docker pull registry.hub.docker.com/centos:7

 

이미지 목록 출력

  • 다운로드한 이미지 목록 출력
    • $ docker images [옵션] [repository명]
      • $ odcker images

 

이미지 세부 정보 확인

  • docker inspect [옵션] <컨테이너 또는 이미지의 이름, ID>
    • $ docker inspect centos

 

이미지 태그 설정

  • $ docker tag 이미지 <Docker Hub 사용자명>/이미지명 : 태그명
    • $ docker tag httpd:2.4 ewshin/webserver:1.0

 

이미지 검색

  • $ docker search [옵션] <검색 키워드>
    • $ docker search centos
  • Docker Hub에는 사용자가 작성한 임의의 Docker 이미지가 공개된다
  • 때문에 Docker 이미지명은 [사용자명/이미지명]의 형식으로 통일한다

 

이미지 삭제

  • docker rmi [옵션] <이미지명>
    • $ docker rmi

 

이미지 업로드

  • Docker Hub에 이미지를 업로드땐 docker push 커맨드를 사용한다
    • $ docker push <이미지명>[:태그명]

 


 

Docker 컨테이너 생성 / 구동 / 중지

  • 컨테이너 생성
    • 아래 명령어는 컨테이너를 생성하는것 뿐 컨테이너를 구동하진 않는다
      • $ docker create
  • 컨테이너 생성 및 구동
    • 이미지에서 컨테이너를 생성하여 컨테이너상에 프로세스를 구동한다
      • $ docker run
      • $ docker run -it --name "test1" centos /bin/cal
        • 컨테이너 생성 및 실행 / 콘솔에 결과 출력 / 컨테이너명 / 이미지명 / 컨테이너에서 실행하는 커맨드
      • $ docker run -it --name "test2" ubuntu /bin/bash
      • $ docker run -d centos /bin/ping localhost
        • 위 커맨드는 centos 이미지를 기반으로 컨테이너를 생성하여 localhost에 ping을 실행시킨다
        • -d 옵션은 컨테이너를 백그라운드에서 실행한다는 의미로 이를 Detached 모드라 한다
    • 컨테이너의 포트번호와 호스트 OS의 포트 번호를 매핑하기 위해서는 다음의 커맨드를 실행한다
      • $ docker run -d -p 8080:80 httpd
    • CPU와 메모리, 호스트와 컨테이너의 디렉터리 공유 등을 설정하여 컨테이너를 생성할 수 있다
      • $ docker run --cpu-share=512 --memory=512m
  • 컨테이너 구동
    • $ docker start <컨테이너명 또는 ID>
  • 컨테이너 재시작
    • $ docker restart [옵션] <컨테이너명 또는 ID>
  • 컨테이너 중지
    • $ docker stop <컨테이너명 또는 ID>
  • 컨테이너 삭제
    • $ docker rm <컨테이너명 또는 ID>
  • 컨테이너 상태 확인
    • $ docker ps -a
  • 컨테이너 구동 상태 확인
    • $ docker stats <컨테이너명 또는 ID>
  • 컨테이너 일시정지 및 재시작'
    • $ docker pause <컨테이너명 또는 ID>
    • $ docker unpause centos

 


 

Docker  컨테이너 사용법

컨테이너 접속

  • 구동중인 컨테이너에 접속할 때에는 docker attach 커맨드를 사용한다
    • $ docker attach <컨테이너명 또는 ID>

 

컨테이너의 프로세스 실행

  • 구동 중인 컨테이너에서 새로운 프로세스를 실행시킬 때에는 docker exec 커맨드를 실행한다
  • $ docker exec [옵션] <컨테이너명 또는 ID> <커맨드> [값]
  • 아래 커맨드를 입력하면 httpd 컨테이너에서 /bin/bash가 실행되어 쉘이 동작하며 이를 통해 컨테이너에서 커맨드 입력이 가능해진다
    • $ docker exec -it httpd /bin/bash

 

컨테이너의 프로세스 확인

  • 구동 중인 컨테이너에서 실행 중인 프로세스를 확인할 때는 docker top 커맨드를 실행한다
  • $ docker top

 

컨테이너의 포트 상태 확인

  • $docker port <컨테이너명 또는 ID>

 

컨테이너명 변경

  • $ docker rename <컨테이너명 또는 ID>

 

컨테이너 내에서 파일 복사

  • 컨테이너 내의 파일을 호스트로 복사할때 docker cp 커맨드를 사용한다
  • 컨테이너에서 호스트로 파일복사
    • docker cp <컨테이너명 또는 ID> : <컨테이너 내의 파일 경로> <호스트 디렉터리 경로>
  • 호스트에서 컨테이너로 파일복사
    • docker cp <호스트 파일> <컨테이너명 또는 ID> : <컨테이너 내의 파일 경로>

 

컨테이너 내에서 파일 변경 이력 확인

  • 컨테이너가 생성된 시점부터 변경된 이력을 확인할 수 있다
  • $ docker diff <컨테이너명 또는 ID>

 

도커 버전 확인

  • $ docker version
  • docker는 클라이언트 및 서버 아키텍처로 구성되어 있으며, Docker 클라이언트와 Docker 서버가 Remote API를 경유하여 접속한다.
  • 그러므로 모든 커맨드는 서버를 거쳐 처리된다.

 

도커 실행환경 확인

  • 아래 커맨드를 사용하면 구동중인 컨테이너 수, 스토리지 드라이브 종류 등 도커의 상세 설정을 확인할 수 있다
  • $ docker info

 


 

컨테이너에서 이미지 생성

 

Docker 컨테이너는 Docker 이미지를 기반으로 생성되지만 반대로 Docker 컨테이너를 기반으로 Docker 이미지를 생성할 수도 있다.

예를들어 상위레벨 repository에서 다운받은 공식 이미지를 기반으로 컨테이너를 생성하고 해당 컨테이너의 설정을 변경한 뒤, 여기에서 다시 이미지를 생성할 수 있다

 

컨테이너에서 이미지 생성

  • 컨테이너에서 이미지를 생성하기 위해서는 docker commit 커맨드를 사용한다
  • $ docker commit [옵션] <컨테이너 명 또는 ID> [이미지명[:태그명]]
    • $ docker commit -a "dylee" ubuntu dylee/ubuntu:1.0

 

컨테이너를 tar 파일로 저장

  • 도커에서 구동 중인 컨테이너의 디렉터리 및 파일들을 모아 tar 파일로 저장할 수 있다
  • 이러한 tar 파일을 기반으로 다른 서버에서 컨테이너를 구동할 수 있다
  • $ docker export <컨테이너명 또는 ID>
    • $ docker export test-httpd > latest.tar

 

tar 파일에서 이미지 생성

  • $ docker import <파일 또는 URL> - [이미지명[:태그명]]
  • cat latest.tar | docker import - dylee/httpd2:1.0

 


 

Dockerfile로 서버구축

 

Dockerfile 이란?

  • Dockerfile은 Docker상에서 동작하는 컨테이너 구성 정보를 저장한 파일이다
  • 도커는 docker biuld 커맨드를 사용하여 Dockerfile에 저장된 구성 정보를 기반으로 Docker 이미지를 생성한다
  • Dockerfile에는 이미지를 생성하는 순서가 코드로 저장되어 있다

 

Dockerfile

  • 에디터 등으로 작성할 수 있는 텍스트 형식의 파일이다
  • 확장자는 불필요하며 Dockerfile이라는 이름의 파일에 인프라 구성 정보를 코딩하면 된다

 

Dockerfile 명령어

  • FROM - 베이스 이미지 지정
  • ADD - 파일 및 디렉터리 추가
  • MAINTAINER - Dockerfile 생성자
  • COPY - 파일 복사
  • RUN - 커맨드 실행
  • VOLUME - 볼륨 마운트
  • CMD - 데몬 실행
  • LABEL - 라벨 설정
  • USER - 사용자 설정
  • WORKDIR - 작업 디렉터리 지정
  • ENV - 환경변수 설정
  • ONBUILD - build 완료 후 실행될 명령어

 

Dockerfile에는 어떤 Docker 이미지로부터 Docker 컨테이너가 생성되었는가에 대한 정보가 반드시 저장되어 있어야 한다

 

Dockerfile로 Docker 이미지 생성

  • $ docker build -t [생성할 이미지명]:[태그명] [Dockerfile 경로]

 

Docker Hub의 공간은 어떻게 관리될까?

  • 생각해보면 Docker Hub에는 전 세계 엔지니어들이 자신이 생성한 이미지를 업로드하게 되는데
  • 이 이미지는 OS 파일을 포함하고 있으므로 용량이 커질 수 밖에 없다.
  • 이를 해결하기 위해서 이미지 중첩을 통해 공통 사용 이미지를 공유하여 관리 한다
Comments