Docker?
리눅스의 경량 가상화 기실인 리눅스 컨테이너 기능들을 쉽게 사용할 수 있도록 추상화 해둔 리눅스 명령어이자 서버 애플리케이션
기본적으로 리눅스 컨테이너는 리눅스 커널의 기능을 활용하기 때문에 리눅스를 필요로 하지만 Docker를 통해 윈도우에서도 심리스하게 활용할 수 있다.
Docker가 정상적으로 설치 및 실행되었다면 Client 버전과 Server 버전이 모두 출력될 것입니다. 정상적으로 동작중인지 확인하려면 docker ps를 실행해 보면 됩니다.
$ docker run -it --rm rockylinux:9 bash
처음 실행하면 대략 30초가량 시간이 걸립니다. 여기서 중요한 점은 셸 프롬프트가 다음과 같이 바뀐다는 점입니다.

여기서 rockylinux:9는 레드햇 엔프라이즈 리눅스 계열의 Rocky Linux 9버전을 의미합니다. 우분투와 비슷한 리눅스 배포판 중 하나입니다.
docker run 명령어 이해하기
docker <SUBCOMMAND> (<OPTIONS>)
docker run 명령어의 형식은 다음과 같습니다.
docker run (<OPTIONS>) <IMAGENAME> (<COMMAND>)
그러면 실행하였던 $ docker run -it --rm rockylinux:9 bash 명령어는 어떤 명령어 일까요.
-it : 2개의 옵션으로 한 글자 옵션일 경우 -i, -t를 하나로 붙여서 사용이 가능합니다
--rm : 하나의 옵션
rockylinux:9 : IMAGENAME
bash : COMMAND
처음 실행했을 때 자세히 보면, Unable to find image라는 문구를 볼 수 있습니다. 즉, Docker는 로컬에 지정한 이미지가 있는지 확인한 다음, 없으면 Docker Hub라는 외부 이미지 저장소에서 이미지를 다운로드 받습니다. 도커에서는 전문 용어로 이미지를 풀 받는다(pull)고 표현합니다. 그리고 이 이미지를 기반으로 bash 명령어를 실행합니다. 또 전문 용어 하나 나옵니다. docker run으로 실행한 프로세스를 컨테이너라고 부릅니다.
그래서 같은 명령어를 두 번째 실행할 때는 이미지를 풀 받는 과정이 없으므로, 딜레이 없이 바로 컨테이너가 실행 됩니다. 풀 받는 시간이 없다면, 실행 시간은 거의 제로입니다.
컨테이너의 생애주기와 관련된 명령어도 잠깐 살펴보도록 하겠습니다. 컨테이너의 기본적인 생애주기는 “생성 -> 실행 -> 종료 -> 삭제”입니다. 여기서는 생성과 실행은 하나로 묶어서 실행으로 두겠습니다. 그렇다면 종료와 삭제가 남습니다.
셸 프롬프트에서 exit 명령어를 실행해서 셸을 종료할 수도 있지만, docker stop 명령어를 사용해서 컨테이너를 종료시킬 수도 있습니다.
$ docker run -it debian:12 uname -a으로 docker을 실행하면 어떻게 될까? -rm 옵션이 없으므로 즉시 종료되지 않는고 다음과 같이 남는 것을 확인할 수 있다.

이번에는 Exited 상태의 컨테이너가 보입니다. 바로 우리가 방금 실행한 컨테이너입니다. 이 컨테이너는 docker rm 명령어로 삭제할 수 있습니다.
$ docker rm e35c3b
예제를 위해 sleep 명령어로 컨테이너를 하나 실행해보겠습니다. 이 컨테이너는 1000초 후에 종료됩니다.
$ docker run -it debian:12 sleep 1000
docker rm에 -f 옵션을 붙여서 실행하면, 컨테이너가 실행중일 때 컨테이너를 강제 종료하고 삭제합니다.
$ docker rm -f 30740d

참고 : https://www.lainyzine.com/ko/article/docker-tutorial-1/
$ docker run -it --rm rockylinux:9 uname -a
위의 명령어에서 rockylinux:9은 이미지이다.
일반적으로 uname -a라는 명령어를 실행하면 현재 시스템에서 이 명령어를 찾아서 실행한다.
ex) Windows에는 uname이 없기 떄문에 에러가 난다.
하지만 맥 OS에서는 에러가 나지 않는다.
Docker이미지는 어떤 명령어가 실행되는 환경을 제공한다. 즉, docker run -it --rm rockylinux:9 uname -a이 명령어는 WSL 기반 윈도우 Docker Desktop에서 실행한 결과이다.
->
분명 Windows에는 uname이라는 명령어가 없지만, Docker를 기반으로 uname 명령어를 실행할 수 있다. 앞에서는 docker run으로 실행한 프로세스를 컨테이너라고 부른다 했지만 좀 더 넓은 의미에서 보면 컨테이너는 어떤 명령어를 실행하는 환경과 그 위에서 실행한 프로세스까지 포함하는 개념이다.
Quiz.
만일 다음 명령어로 출력하면 어떤 결과가 나올까?
$ docker run -it --rm rockylinux:9 bash -c "rm /usr/bin/date; date"
date 명령어를 삭제하고 date 명령어를 실행한다. 여기서는 여러 명령어를 한 줄에서 실행하기 위해서 bash -c 명령어를 사용했고, 따옴표 사이에 여러 명령어들을 ; 세미콜론으로 구분지어 주면 여러 명령어를 실행할 수 있다. 결과는 명령어를 찾을 수 없다고 에러가 출력됩니다.
그러면 다음 명령어는 어떻게 동작할까?
$ docker run -it --rm rockylinux:9 date
위 명령어는 정상적으로 동작한다. 즉 컨테이너는 상태를 공유하지 않고 어떤 컨테이너에서 파일을 삭제하더라도 다른 컨테이너에는 영향을 끼치지 않는다. 이를 이식성 이라고 한다.
+) 컨테이너를 종료된 상태로 남겨놓았을 때 지우기 위해서는 docker rm명령어로 모두 지워야한다. 하지만
docker container prune명령어를 사용한다면 종료된 컨테이너를 일괄 삭제할 수 있다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 021283c8eb95 6 days ago 187MB
debian 12 3676c78a12ad 6 days ago 116MB
rockylinux 9 eeea865f4111 6 weeks ago 176MB
docker image ls와 같은 명령어임. 둘 다 자주 사용된다.
Docker와 유니온 마운트
컨테이너들은 이미지를 공유해서 사용하기 때문에, 컨테이너를 실행한다고 용량이 추가로 필요하지는 않습니다. 대신 컨테이너들은 컨테이너들에서 사용하는 고유한 디스크를 가지고 있습니다. 컨테이너는 이 디스크에 사용하는 만큼만 추가적으로 용량을 차지합니다.
이미지는 디스크 용량을 차지한다. 인터넷에 연결되어 있으면 언제든 다운로드 받을 수 있기 때문에 로컬에 꼭 필요하지 않은 이미지를 미리 다운로드 받아놓을 필요는 없다. 이미지를 삭제할 때는 docker rmi 혹은 docker image rm을 사용하고, 이미지를 삭제하기 전에 이미지를 사용하는 모든 컨테이너를 종료해야한다.
-> rmi 명령어나 -f 옵션으로 이미지가 사용중이라도 삭제할 수 있지만 이는 강제 삭제가 아니라 이미지의 이름만 지울 뿐이다.
출처
https://www.lainyzine.com/ko/article/docker-tutorial-2/#table-of-contents