도커의 정의 및 작동원리
- 하나의 컴퓨터에 설치된 리눅스 운영체제에서 완전히 분리된 별도의 리눅스 시스템을 운영할 수 있는 기술
- CPU, 메모리, 네트워크를 분리하여 마치 별도의 시스템처럼 사용할 수 있는 기술
도커에서 프로그램이 실행이 될때 하드웨어 위에 OS(Mac, windows)와 컨테이너들이 작동하고 그 위에 리눅스가 하위 시스템 설치를 담당합니다.
레이어로 구성을 나눈다고 볼때 카카오톡과 같이 우리가 사용하는 응용프로그램을 애플리케이션 레이어, 운영체제들이 있는 곳을 커널 레이어, 그 아래는 하드웨어 레이어로 분리할 수 있습니다.

* HW로 직접 제어할 수도 있긴 하지만, 아두이노(8bit), 라즈베리파이(32bit) 이런 컴퓨터를 직접 포트를 제어하기엔 어려운 부분이 많습니다. 그래서 OS를 제어하는 것이 편리합니다.

커널안에서 Host 운영체제에서 터미널로 도커에 명령를 내리면 도커서버가 명령을 받고 컨테이너에 전달합니다.
이미지와 컨테이너의 용어정리를 하자면
컨테이너가 세팅된 상태를 이미지(이전에 jdk를 설치한것처럼)라고 하고 이미지가 실행된 상태(메모리로딩)를 컨테이너라고 합니다.

도커 이미지 삭제 하기
이미지 삭제 실습을 하기에 앞서 우분투 이미지를 설치합시다.
도커허브에 ubuntu를 검색하고 Docker official Image를 찾아 설치합니다.
* Tags를 누르면 구체적인 버전을 골라서 설치할 수 있습니다.

docker images
명령어로 설치 확인할 수도 있고, 데스크탑 버전으로도 확인이 가능합니다. 물론, 데스크탑 버전에서 실행과 삭제도 가능하지만 이후 배포할때에 제약사항이 많기 때문에 명령어로 작동하는 방법을 반드시 숙지해야 합니다.

이미지를 삭제할때는 아래 명령어를 사용해서 삭제합니다.
docker rmi openjdk ## openjdk 이미지 삭제
우분투에 최신버전과 18버전이 있다면 IMAGE ID를 이용하여 지정해서 삭제해줄 수 있습니다. 이때도 같은 명령어를 사용하지만 ID를 다 적을 필요는 없고 앞의 몇글자만 적어주어도 자동으로 인식해서 삭제해줍니다.

마찬가지고 docker/getting-started를 지우려고 하면 실행중이라면서 종료가 안됩니다.
컨테이너가 동작중이기 때문인데, 컨테이너를 종료하는 명령어는 아래와 같습니다.
docker ps ##실행중인 도커 프로세스
docker stop CONTAINER ID ## 컨테이너 ID로 종료
하지만 이렇게 종료를 한 후에 이미지 파일을 삭제하려고 하면 "종료된 컨테이너에서 이미지가 사용중" 이라며 에러를 나옵니다.
이러는 이유는 컨테이너가 종료되었다고 해도 종료된 프로세스의 메모리에 이미지가 할당되어 있기 때문입니다.
- 이미지 - 하드디스크 저장된 파일
- 컨테이너(실행중) - PS(메모리할당)
- docker stop
- 컨테이너(종료) - PS(메모리할당)
종료된 컨테이너를 삭제하려면 아래의 명령어들을 이용해서 삭제할 수 있습니다.
docker ps -a ## 모든 프로세스 확인
docker rm CONTAINER ID ## 프로세스 삭제
docker rmi IMAGE ID ## 이미지 삭제
컨테이너 실행하기
컨테이너에는 생명주기가 존재하는데 만약 이미지에 JDK만 설치되어 있다면 while(데몬)이 없기 때문에 실행 후에 바로 종료됩니다.
아파치 톰캣서버에는 데몬이 실행되기 때문에 실행해도 종료되지 않고 계속해서 실행되게 됩니다.
이처럼 생명주기는 컨테이너내의 있는 프로그램에 영향을 받습니다.

톰캣의 이미지를 다운로드 받고 컨테이너를 실행해보겠습니다.
docker pull tomcat ## 이미지 설치
docker run tomcat ## 톰캣 실행
실행하고 나서 새로운 터미널을 열어서 docker ps 명령어로 확인해보면 정상적으로 실행된걸 확인할 수 있습니다.
하지만 localhost:8080 으로 접속해보면 작동하지 않고 있습니다.
그 이유는 브라우저에서의 localhost 네트워크와 톰캣이 실행된 네트워크는 다른 네트워크로 처리되고 있기 때문입니다.
해결하기 위해서는 localhost에서 톰캣의 네트워크로 리다이렉션 해줘야 합니다. 즉, 포트포워딩을 해줘야 합니다.
컨테이너 포트포워딩 및 데몬으로 실행
docker run -d -p 8080:80 httpd ## 데몬과 포트포워딩 옵션
httpd 서버로 옵션 실습을 해보겠습니다.
- -d : 데몬의 약자로 백그라운드에서 계속 실행시키겠다는 뜻
- -p : 포트포워딩의 약자로 8080포트로 들어오는 신호를 80포트로 받겠다는 뜻
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93c77cbbff98 httpd "httpd-foreground" 16 seconds ago Up 15 seconds 0.0.0.0:8080->80/tcp amazing_liskov
포트를 보면 정상적으로 80포트로 포트포워딩이 되는걸 확인할 수 있고, localhost:8080으로 정상 접속이 되는걸 확인할 수 있습니다.

이제 nginx로 다시 한번 실습을 해보겠습니다.
docker run -d -p 8081:80 nginx
위와같이 명령어를 작성하면 nginx 이미지가 없는데도
기존에 pull로 설치하는 명령어가 생략되고 자동으로 설치하고 실행이 됩니다.
* 이미지가 있다면 있는걸 사용하고 없다면 도커허브에서 다운로드를 받습니다.

지금까지 한 것을 정리하면 아래 그림처럼 표현할 수 있습니다.
host 운영체제에서만 작동하던 것을 이제는 localhost 포트번호를 이용해서 운영체제를 바꿔가며 사용할 수 있습니다.
즉, 컴퓨터에 운영체제가 3개가 되었습니다.

모든 image 한번에 삭제하는 명령어
실행중인 이미지를 삭제하려면 아래의 명령어들을 다 실행시켜야 해서 상당히 시간소모가 많아집니다.
- 실행중인 프로세스 종료
- docker ps
- docker rm 컨테이너ID
- 종료된 컨테이너 삭제
- docker ps -a
- docker rm 컨테이너ID
- 이미지 삭제
- docker images
- docker rmi 이미지이름
이를 한번에 삭제하기 위해서 아래의 명령어를 사용하면 됩니다.
docker stop $(docker ps -q)
docker rm $(docker ps -a -q)
docker rmi -f $(docker images -q)
* -q 는 이미지 ID만을 표시한다는 뜻입니다.
명령어를 실행하고 나서는 프로세스와 이미지 모두 삭제된 것을 확인할 수 있습니다.
* 위의 명령어를 메모장에 저장해두고 삭제가 필요할 때마다 터미널에 붙여넣기를 통해 사용하면 편리합니다.
출처
https://youtube.com/playlist?list=PL93mKxaRDidGMzIllhYKx1d6aMg6_5wW3&si=1alrmRYvJM8PEaEb
도커입문
www.youtube.com