이미지 다운로드

docker pull [이미지:태그]

(보통 태그는 버전을 명시하는 것 같다. 태그를 입력하지 않으면 최신버전을 다운로드한다.)

 

이미지 확인

docker images

 

현재 실행중인 컨테이너 확인

docker ps // 중지된 것은 보이지 않고, 실제로 실행중 인것만 보인다.

docker ps -a // 중지된 컨테이너도 모두 보인다.

 

이미지 삭제하기 

현재 실행중인 컨테이너 혹은 중지된 컨테이너인 경우 삭제할 수 없다.

docker rmi [IMAGE ID] 

docker rmi [REPOSITORY]

 

이미지 실행시키기 (컨테이너로 띄운다)

docker run 

컨테이너 중지하기 (실행중인 것을 중지)

docker stop [CONTAINER ID]

컨테이너 삭제하기 (종료된 것을 삭제)

docker rm [CONTAINER ID]

 

 

기억할 것

  • 컨테이너의 상태는 2가지가 있다. 
    • 실행중 : docker ps 로 확인 가능
    • 중지중 : docker ps -a 를 해야 비로소 확인 가능
  • 컨테이너라는 의미는 메모리에 할당된 프로세스 상태라는 상태인데 docker stop 명령어로 중지 했는데 계속 프로세스 상태인것일까? 라는 의문에는 나중에 설명해주신다고 한다.
  • 이미지를 삭제할 때는 컨테이너로 띄워져 있을 때는 삭제할 수 없다. (중지된 컨테이너라도 docker rm 으로 아예 컨테이너에서 지워줘야 이미지를 삭제할 수 있다.)

 

커스텀 훅

  • 어떤 특정한 Hook 2개 이상이 반복된다면 커스텀 훅을 만들어낸다.
  • 커스텀 훅은 react의 기본 hooks의 조합으로 이루어진다. (기본 훅 여러 개가 세트로 움직인다면? 3개를 세트로 묶어서 커스텀 훅 1개로 퉁 쳐버리면 된다.)
import {useEffect, useRef} from "react";

// 기능
// useInterval(()=>{
//  console.log('hello');
// }, isRunning ? 1000 : null );
function useInterval(callback, delay){
    const savedCallback = useRef();

    useEffect(() => {
        savedCallback.current = callback;
    });

    useEffect(()=>{

        //왜 tick이라는 함수로 감싸서 실행했을까?
        function tick(){
            savedCallback.current();
        }

        if(delay !== null){
            let id = setInterval(tick, delay);
            return () => clearInterval(id);
        }
    },[delay]);

    return savedCallback.current;
}

export default useInterval;

강의에서 만들어 본 useInterval이라는 (useRef + setInterval) 커스텀 훅이다.

 

왜 tick이라는 내부함수가 필요한지에 대해서도 설명해주는데 이해하기 좀 난해하다.

 

따로 기억할것.

※useRef는 항상 최신의 객체를 참조할 수 있게 해준다 라는 것을 기억하자.

가상화 vs 컨테이너(도커)

가상머신과 도커는 리얼 머신이 아니라는 점에서 비슷하지만 작동 방식에서 차이를 보인다.
가상머신은 편하긴 하지만 성능이 좋지 못하다. (CPU에 가상화를 위한 기능들이 많이 들어갔지만 아직도 리얼머신에 비해 많이 느리다.)

 

전가상화와 반가상화

전가상화의 성능 개선을 위해 개발된 반가상화가 널리 쓰이고 있다.

 

가상화 계층도

가상 머신 자체는 완전한 컴퓨터이기 때문에 게스트 OS를 항상 설치해야한다. 그래서 이미지 용량이 커진다.

 

도커 계층도

가상화와 달리 도커는 게스트 OS를 설치하지 않고 OS자원은 호스트와 공유하는 방식이다. 이미지 용량이 크게 줄어들었으며 HW 가상화 계층이 없기 때문에 메모리 접근, 파일시스템, 네트워크 속도가 가상 머신에 비해 월등히 빠르다.

 

도커는 이미지 버전을 관리할 수 있고 저장소(docker hub)에 이미지를 업로드하거나 다른 이미지를 다운로드 받을 수 있는 등 배포에 특화된 기능을 제공해준다.

 

리눅스 컨테이너

LXC는 컴퓨터를 통째로 가상화하여 OS를 실행하는 것이 아닌 리눅스 커널 레벨에서 제공하는 일종의 격리된 가상 공간이다. 이 기상공간은 OS가 설치되지 않기 때문에 가상머신이 아닌 컨테이너라고 부른다.

 

리눅스 커널의 ControlGroups(cgroups)는 CPU, 메모리, 디스크, 네트워크 자원을 할당하여 완전한 형태의 가상공간을 제공한다. 또한 프로세스 트리, 사용자 계정, 파일시스템, IPC등을 격리시켜 호스트와 별개의 공간을 만든다. (chroot 명령어처럼) 이것을 Namespace isolation(namespaces) 라고 한다.

 

LXC는 리눅스 커널의 cgroups와 namespaces기능을 활영하여 가상 공간을 제공한다.

 

LXC의 구조

LXC는 격리된 공간만 제공할 뿐 개발 및 서버 운영에 필요한 부가 기능이 부족한데, docker는 리눅스 커널의 cgroups와 namespaces를 기반으로 하여 이미지, 컨테이너 생성 및 관리 기능과 부가기능을 제공한다.

 

따라서 컨테이너는 리눅스 커널을 기반으로 하기 때문에 윈도우에서 도커같은 컨테이너 기술을 사용하기 위해서는 리눅스 하위시스템이 필요하다. (wsl2나 따로 설정이 필요)

 

docker 명령어 전송방식

  1. Host OS에서 docker container에 명령어 전송
  2. docker daemon이 명령어를 받아서 container에게 전달해준다.

컨테이너 vs 이미지

이미지 

도커에서 실행되지 않고 있는 서버운영에 필요한 소스코드, 라이브러리 등이 셋팅된 상태의 일종의 프로그램 상태
(프로그램은 하드디스크에 저장되어있는 실행되고 있지 않은 상태를 의미하기도하니까)
(이미지는 특정 프로세스를 실행하기 위한 모든 파일과 설정, 의존성을 해결한 상태로 Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고있다.)

 

컨테이너

이미지를 실행시켜 메모리에 로딩한 상태

+ Recent posts