ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 기본 개념
    BackEnd/서버 2020. 4. 29. 14:48

    도커를 한마디로 정의하자면 데이터 또는 프로그램을 격리시키는 기능을 제공하는 소프트웨어라고 할 수 있다.

    다양한 프로그램과 데이터를 각각 독립된 환경에서 격리하는 기능을 제공한다.

     

    1. 도커 소프트웨어의 본질인 도커 엔진을 설치해 도커 엔진으로 도커 컨테이너를 생성하고 구동한다.

    2. 리눅스 운영체제는 필수적이다. mac, window 에서도 내부적으로는 리눅스를 사용한다.
    그러므로 컨테이너 내 띄울 프로그램도 리눅스용 프로그램이 된다.

    서버는 기능적의미의 서버와 물리적의미의 서버가 있다.

    하나의 물리적 서버에 여러 기능적 의미의 서버를 함께 구동하는 것이 도커의 장점이다.

     

    한 대의 서버에서는 1개의 웹서버만 실행 가능하다.

    컨테이너 기술을 이용해 여러 개의 웹 서버를 올릴 수 있다.

    한 대의 서버에 1개 이상의 웹서버를 실행한다면, A,B 서버의 환경을 공유하면서 서로 영향을 줄 수 있다.

    하지만 컨테이너 기술을 이용해 격리한다면 그런 리스크를 줄일 수 있으며

    OS가 달라도 물리적 환경, 서버 구성의 차이를 무시할 수 있다.

     

    - 서버 가상화는 물리적 서버를 만드는 것과 같아서 OS를 마음대로 설치할 수 있다.(메인보드, 메모리를 포함한)

    - 도커는 OS의 일부 기능을 호스트 컴퓨터에 의존하므로 물리서버에도 리눅스기능이 필요하다. 

    컨테이너 내용도 리눅스 운영체제가 될 수 밖에 없다.

    - EC2도 인스턴스 개념이 있다. 각각의 인스턴스가 독립된 컴퓨터로 동작한다. EC2와 도커는 VM Ware와 도커의 관계랑 같다.

    다만 인스턴스가 AMI이미지로 생성되므로 도커와 배포방식이 비슷하다.

    - 호스팅 서버: ECS, 별도 가상 서버없이 이미지 실행이 가능하다.

     

    - 운영체제의 역할 : 하드웨어에 명령을 전달한다.

    - 운영체제의 구성: 커널과 그 외  (*커널: 하드웨어를 다룬다.)

    정리하자면, 도커는 리눅스 컴퓨터에서 독립된 격리 환경을 만들며, 리눅스에서만 동작한다. 

     

    윈도우나 맥에서 도커 데스크탑 앱을 다운받으면 Hyper-V와 함께 아래와 같은 구성이 된다.

    * 도커 컨테이너는 도커 이미지를 통해 만들수 있다. 이미지는 직접 만들지 않아도 도커 레지스트리를 이용해 받을 수 있는데 도커 레지스트리를 도커 허브라고 한다. 

    * 혹은 컨테이너를 생성하고 export 명령어로 컨테이너에서 이미지를 만들 수도 있다. 컨테이너 내 수정사항이 자동 반영된다. 

     

    - 컨테이너는 일회용품으로 업데이트를 계속하는 것보다, 새로운 컨테이너를 사용하는 것이 권장된다.

    - 컨테이너 하나하나를 업데이트하는 것은 컨테이너의 장점을 반감시키기 때문이다.

    - 하나의 컨테이너에 하나의 소프트웨어만 설치하는 것이 보안과 유지보수의 장점이 있다.

    - 컨테이너는 생성-실행-종료-삭제의 생애주기를 가진다.

    - 도커가 설치된 물리적 서버(호스트 컴퓨터)의 디스크를 마운트해 데이터를 저장한다. (*마운트란 디스크를 연결해 데이터를 기록할 수 있는 상태를 말한다.)

    - 컨테이너를 폐기 전 컨테이너 저장 정보 확인한다.

    단점 :

    리눅스만 가능

    여러개 띄워야 장점이 있다. 컨테이너 하나만 필요하면 굳이 사용할 필요없다. 

     

    리눅스  

    레드햇 : 레드햇엔터프라이즈, CentOS

    데비안 : 우분투, 데비안, 페로나 

    크기가 작은 배포본이자, 공식 컨테이너인 알파인 리눅스를 많이 사용한다.

     

     

    도커 명령어 구조

    docker [상위 커맨드] [하위 커맨드](옵션) [대상] (인자)

    상위 커맨드 : container, network, image 등 

    하위 커맨드 : create-start-stop-remove, - run 커맨드 안에는  pull + create + start 가 다 포함되어 있다.

    옵션: 예) -i, -t, -d 등  

    -i or -t 키보드 조작

    - d 백그라운드

    인자:   예) --mode=1

     

    - 컨테이너는 기본적으로 외부에서 접근이 불가능하다. 실행할 때 port 를 설정해야한다. 컨테이너 생성 후에는 변경할 수 없다.

    - 물리 컴퓨터가 외부 요청을 받아 컨테이너 내부로 요청을 전달한다.

    - p [호스트포트]:[컨테이너포트] 8080:80 

    - 컨테이너는 동일한 포트를 가질 수 있지만 물리 컴퓨터의 포트는 달라야한다. 8080:80,8081:80  만약 

    물리 컴퓨터의 포트를 동일하게 하려면 reverse proxy 를 사용해야한다.

    - 컨테이너 내 명령어를 사용하기 위해서 -it /bin/bash 명령어를 사용할 수 있다.

    - 두 개의 컨테이너를 연결하기 위해 가상 네트워크를 만들어 네트워크 위에 두개의 컨테이너를 소속시켜 연결할 수 있다.

    docker run .. --net=[네트워크이름]

     

    - 호스트컴퓨터와 컨테이너 간 파일복사 

    docker cp 호스트경로 컨테이너명:컨테이너경로 

    docker cp 컨테이너명:컨테이너경로 호스트경로 

     

    마운트

    - 볼륨이란 스토리지의 한 영역을 분할하는 것 

    하드디스크나 SSD를 분할한 하나의 영역이다.

    mount: 연결하다, 대상을 연결해 운영체제/소프트웨어의 관리 하에 두는 일 

    컨테이너가 외부에 있는 데이터를 다룰 수 있게 된다.

    볼륨 마운트 : 도커엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크형태로 마운트

    이름만으로 관리, 볼륨에 비해 직접 조작 어려워. '임시','자주 사용안하지만 지우면 안되는' 데이터를 두는 목적으로 주로 이용

    바인드 마운트:  호스트 컴퓨터 영역의 디렉터리를 컨테이너에 마운트, '자주' 사용되고 수정되는 데이터는 두는데 사용 

    백업이 간단한가 / 복잡한가?,

    호스트 컴퓨터에서 데이터를 다룰 필요성이 있는지 ,

    환경의 의존성을 배제해야하는지,

    여부에 따라서 마운트 종류를 선택한다.

     

    볼륨마운트는 도커엔진의 관리하에 있으므로 사용자가 파일 위치를 신경쓸 필요가 없다. 

    바탕화면에 있는 폴더를 실수로 삭제해 데이터를 유실할 일도 없다.

    OS마다 경로 기재방식이 다르기 때문에, OS에 따라 명령어가 달라지는 의존성도 없다.

    볼륨마운트는 익숙해지면 손쉽게 사용할 수 있기때문에, 도커 제작사도 볼륨마운트를 권장한다.

     

    바인드 마운트는 도커엔진과 무관하게 파일을 다룰 수 있어, 워드프레스처럼 자주 편집이 필요한 경우 바인드마운트를 사용한다.

     

    *이외의 마운트 방식

    - 임시메모리 마운트 tmpfs

    디스크가 아닌 주 메모리 영역을 마운트한다.

    접근속도를 높일 목적으로 사용하지만 도커 엔진 재부팅시 / 호스트 재부팅 시 소멸한다.

     

    마운트는 바탕화면 바로가기 아이콘과 같다. 

    컨테이너(마운트 대상이 되는 위치)에 스토리지(마운트 원본) 단축 아이콘을 만드는 것이다.

    컨테이너 내 마운트 대상 위치는 컨테이너의 소프트웨어가 컨텐츠를 저장하는 경로가 되는 경우가 많다. 

     

    볼륨 마운트는 마운트와 동시에 볼륨 생성도 가능하지만, 마운트 전에 미리 생성해두는 것이 권장된다.

    볼륨 관련 명령어 

    docker volume create 이름 

    docker volume prune * 마운트되지 않은 볼륨을 모두 삭제

    docker container run .. -v 볼륨명:컨테이너마운트경로 

     

    docker inspect volume 으로 볼륨 정보를 보면 mount point(마운트경로), name(볼륨명)정보도 나오는데, 

    docker inspect container 로 컨테이너 정보에 mounts 항목에 source 는 mount point, name 은 name 으로 같은 정보를 표시한다. destination 은 컨테이너 내 경로를 가리킨다.

     

    볼륨에 쓰기한 내용을 확인하고 싶다면 리눅스 컨테이너를 같은 볼륨에 마운트해 별도로 띄워야한다. 

    볼륨백업도 별도의 리눅스 컨테이너에서 접근해 tar명령어로 볼륨을 압축에 컨테이너 밖에 저장한다. 

    왜? 서비스에 영향을 주지 않기 위해서

    *백업하기
    
    docker run --rm \
      -v 볼륨명:/source \
      -v $(pwd):/target \
      busybox tar cvzf /backup/backup.tar.gz -C /source .

    /source내용을 /target에 tar.gz로 압축해 저장하는 것.

    백업 전 주 컨테이너 정리/삭제 반드시 확인해야한다.

     

    이미지 만드는 방법

    1. docker commit [컨테이너명][이미지명]  : 이미지 변환

    2. docker save -o [파일이름.tar] [이미지이름] : 이미지를 파일로 추출해 복사  

    3. Dockerfile 작성

    Dockerfile 은 이미지재료가 있는 폴더에 있으면 되며, 위치는 무관하다. docker build -t [이미지이름] [재료경로]

    FROM 이미지이름
    COPY 원본경로 대상경로
    RUN 리눅스 명령어
    CMD 컨테이너 실행 시 실행할 명령어
    ENTRYPOINT 컨테이너 실행 시 강제로 실행할 명령어
    WOKRDIR RUN,ADD,COPY,CMD 등을 실행할 작업디렉터리 지정

     

    도커 컨테이너 내 명령어

    - exec 는 실행 중인 컨테이너 속에서 명령을 실행하는 커맨드이다.

    컨테이너에 리눅스 명령어를 실행하려면 리눅스에 우리 명령을 전달해주는 프로그램인 shell 이 있어야한다.

    shell 에도 몇 가지 종류가 있는데 대부분의 컨테이너에는 bash 가 많이 설치돼 있다.

    run 에 bash 인자를 주면 컨테이너는 실행되고 소프트웨어는 실행되지 않는다.

    exec -it [이름] /bin/bash 

    bash 가 실행되면 shell에 입령된 명령을 도커엔진이 아니라 해당 컨테이너로 전달된다.

    명령을 입력받는 대상이 바뀌는 것이다.

    따라서 프롬프트도 바뀐다.

    도커엔진과 컨테이너는 말하자면 부모-자식 관계인 것이다.

    컨테이너는 엔진과 별개의 존재다.

    따라서 bash 를 통해 컨테이너 내부를 조작하는 동안에는 도커명령어를 사용할 수 없다. 현재 조작중인 컨테이너라도 이 점은 마찬가지다. 

    컨테이너에서 할 일을 마치면 exit 명령어로 나온다.

     

    - 도커 엔진을 통해 내리는 명령: 컨테이너 전체에 대한 관리. 이미지,컨테이너,네트워크 생성 및 관리, 엔진 시작과 종료 등

    - 컨테이너 내부 명령: 새로운 소프트웨어 추가, 소프트웨어 실행/종료, 파일 복사/이동/삭제 등

    - 도커 커맨드는 같지만 내부 명령은 윈도우/리눅스 등 os 에 따라 다를 수 있다.

    - 컨테이너 A는 데비안 계열, B는 레드햇계역이면 같은 도커에서 실행 중이라도 컨테이너 내부 명령어 스타일이 달라진다.

    도커에서는 데비안계열을 권장한다.

    - 데비안 설치 명령: apt install

    - 레드햇 설치 명령: yum install

     

    레지스트리와 레파지토리

    - 레지스트리 : 이미지를 배포하는 장소 (소프트웨어)

    - 레파지토리: 레지스트리를 구성하는 단위

    도커 허브: 각각의 회사나 개인이 가진 레지스트리가 여럿 모인 형태 

    도커의 태그는 레지스트리에 업로드를 상정한 이미지 이름에 가깝다.

    레지스트리주소(도커허브ID)/레파지토리이름:버전

    레파지토리 이름은 처음 push 할 때 생성된다. default 레파지토리는 공개 레파지토리이다.

    이미지에 태그를 부여하는 명령어는 원래 이미지이름을 태그로 바꾸고 이미지를 복제하라는 것이다.

    원래 이미지 이름과 태그가 부여된 이미지 둘 다 존재하게 된다.

    같은 이미지 ID 를 갖지만 별개로 취급돼 삭제 시 둘 다 해야한다.

     

    도커 컴포즈 

    - 도커 컴포즈로 여러 명령어를 하나의 텍스트파일에 기재할 수 있다.

    명령어 한 번에 실행,종료, 폐기까지 할 수 있도록 도와주는 도구이다.

    - 시스템 구축에 필요한 설정을 yaml 포맷으로 기재한 정의파일로 전체 시스템을 일괄 실행 또는 종료/삭제 할 수 있게 한다.

    - 정의 파일에는 컨테이너나 볼륨을 '어떠한 설정으로 만들지' 에 대한 항목이 기재돼 있다. 

    - up/down/stop 으로 명령을 할 수 있다. 

    up은 run 과 비슷하다. 이미지 pull, 컨테이너 생성/실행, 네트워크, 볼륨 설정 등. 

    down은 컨테이너와 네트워크를 정지 및 삭제한다. 볼륨과 이미지는 삭제하지 않는다.

    컨테이너와 네트워크를 삭제하지 않고 종료만 하고 싶다면 stop 명령어를 사용한다.

    - 도커컴포즈는 docker run 을 여러 개 모아둔 것과 같다.

     

    도커컴포즈, 도커파일, 쿠버네티스의 차이

    - 도커컴포즈는 컨테이너와 주변 환경을 생성한다. 네트워크, 볼륨도 생성 가능하다.

    - 반면 Dockerfile 은 이미지를 만들기 위한 것으로 네트워크나 볼륨을 만들 수 없다.

    만드는 대상이 다르다.

    - 쿠버네티스는 컨테이너를 관리하는 도구인데 반해 도커컴포즈는 컨테이너를 생성/삭제하지만 관리 기능이 없다.

     

    도커 컴포즈를 사용하려면 설치를 먼저 해야한다.

    도커 컴포즈는 도커 엔진과 별개의 소프트웨어이다. 

    하지만 도커컴포즈의 사용법은 도커엔진과 비슷해, 설치하고 나면 신경쓰지 않아도 된다.

    도커 컴포즈로 생성한 컨테이너를 도커 엔진으로 똑같이 관리할 수 있다.

    커맨드만 조금 다를 뿐 거의 같은 소프트웨어다.

    윈도우나 mac 의 도커 데스크탑은 도커컴포즈가 함께 설치된다.

    도커 컴포즈 파일명은 미리 정의된 docker-compose.yaml 로 해야한다.

    파일은 호스트 컴퓨터에 배치되지만 명령어는 똑같이 도커엔진에 전달되며, 만들어진 컨테이너도 도커엔진 위에서 동작한다.

    정의파일의 이름이 사전에 정의되어있기 때문에, 한 폴더에 하나의 컴포즈만 있을 수 있다.

    도커 컴포즈에서 컨테이너가 모인 것을 '서비스'라고 부른다. 공식문서에는 컨테이너와 서비스라는 용어가 혼용되는데 모두 컨테이너로 이해하면 된다. 리눅스에서 동작하는 소프트웨어를 서비스라고 해서 정착된 용어인 것으로 보인다.

    쿠버네티스에서도 컨테이너 집합체를 서비스라고 한다.

    반응형
Designed by Tistory.