https://docs.docker.com/get-started/docker-overview/
도커(Docker)는 컨테이너(Container) 기술을 이용해 애플리케이션을 개발, 배포, 실행하는 환경을 독립적으로 구성할 수 있게 돕는 플랫폼이다.
컨테이너는 애플리케이션이 필요로 하는 라이브러리, 설정 파일 등의 모든 종속적인 구조를 포함하는 격리된 실행 환경을 의미한다.
이를 통해 개발, 배포, 실행 과정에서 환경 설정의 불일치로 인해 발생할 수 있는 문제를 방지하고, 애플레케이션을 빠르게 배포하고 확장할 수 있다는 장점을 가진다.
애플리케이션을 격리된 환경에서 실행하기 위해서는 컨테이너 외에도 가상 머신을 사용할 수 있다.
다만 두 기술은 구조적인 차이를 가지며, 그에 따라 다른 특성을 갖는다.
컨테이너(Container)
컨테이너는 컨테이너가 실행되는 장치의 운영체제를 공유한다. 즉, 각 컨테이너는 Host OS의 커널을 공유하며 그 위에서 프로세스 수준으로 격리되어 존재한다.
이를 위해 Host OS가 가지고 있는 특성을 보존하면서 목표한 환경을 구성하는데 필요한 부분만큼만 보정하여 Host OS를 기반으로 하면서도 독립적인 환경을 구축한다.
이러한 특성 덕분에 가상 머신에 비해 가벼워 빠른 배포 및 확장이 가능하다는 장점이 있다.
다만 Host OS가 공유되기 때문에 특정 컨테이너로 인해 Host OS에 문제가 발생하면 전체 컨테이너에 장애가 발생할 수 있다.
가상 머신(Virtual Machine; VM)
가상 머신은 하이퍼바이저(Hypervisor)라는 소프트웨어를 통해 장치의 인프라를 가상화하여 구성된다. 각 가상 머신은 독립적인 운영체제인 Guest OS를 실행하고 Host OS와 독립적인 커널을 사용하기 때문에 하드웨어 수준으로 격리되어 있다고 할 수 있다.
가상 머신은 독립된 운영체제를 실행해야 하므로 더 많은 자원과 시간을 소모한다는 단점이 있다.
다만 각 가상 머신이 독립된 운영체제를 실행하기 때문에 더 강력한 보안을 유지할 수 있으며, 한 VM의 장애가 다른 VM이나 Host에 영향을 미치지 않는다는 장점이 있다.
Windows에서는 Docker Desktop을 이용하여 Docker를 사용할 수 있는데, 이는 결국 하위에 WSL(Windows Subsystem for Linux)이나 Hyper-V로 Linux를 설치하여 사용하는 것이기 때문에 그냥 WSL 상에서 Docker를 설치해보고자 한다.
이를 위해 먼저 WSL을 설치해야 하는데, 이는 공식 문서를 참고하자.
https://learn.microsoft.com/ko-kr/windows/wsl/install
공식 문서에는 PowerShell이나 명령 프롬프트(cmd)에서 wsl --install을 실행하면 WSL이 설치된다고 하는데, 나는 이렇게 설치하기보다는 수동 설치를 사용한 경험만 있다.
https://learn.microsoft.com/ko-kr/windows/wsl/install-manual
wsl --set-default-version 2을 실행하여 WSL 2를 기본 버전으로 설정한다.이후 Docker 설치를 진행하기 전에, 각종 명령어를 하나하나 치기에는 너무 힘들기 때문에 우분투 창의 좌측 상단 아이콘을 클릭한 뒤 속성에 들어가서 편집 옵션의 "Ctrl+Shift+C/V를 복사(C)/붙여넣기로 사용"을 체크하자.

그러면 윈도우 환경에서 컨트롤+C로 복사한 내용을 WSL에서 컨트롤+쉬프트+V로 붙여넣기 할 수 있다.
기본적으로 공식 문서를 참고하여 설치하자.
https://docs.docker.com/engine/install/ubuntu/
공식 문서에는 apt repository를 사용하는 방법과 package를 사용하는 방법이 있는데, repository를 사용하는 방법으로 진행하겠다.
설치를 위해서는 가장 먼저 다음 두 명령어를 실행하며 우분투의 패키지를 최신 버전으로 업그레이드 한다.
sudo apt-get update
sudo apt-get upgrade
이후 다음 명령어를 실행하여 Docker 설치에 필요한 패키지들을 설치한다.
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
그 다음에는 Docker의 GPG Key를 추가해야 한다. GPG는 암호화 방식 중의 하나이다.
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
다음으로는 stable한 버전의 repository를 바라보도록 설정한다.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
이제 다음 명령어를 실행해 Docker의 최신 버전을 설치한다.
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
마지막으로 다음 명령어를 통해 Docker 컨테이너를 실행시켜 정상적으로 설치되었는지 확인한다.
sudo docker run hello-world
다음과 같이 실행되면 성공적으로 설치된 것이다.

Docker 관련 작업은 기본적으로 root 유저에게만 권한이 있기 때문에, docker 명령을 수행하려면 앞에 sudo를 붙여야 한다.
일례로, docker ps라는 명령어를 수행하려고 하면 permission denied라는 메시지가 출력되며, sudo docker ps로 실행해야 제대로 수행된다.

계속 sudo를 앞에 붙이는 것은 상당히 번거롭기 때문에, 다음 명령어를 실행하여 root가 아닌 기본 유저에게도 권한을 줄 수 있다.
이때, 이 명령어는 우분투 창을 종료 후 다시 실행한 뒤 수행해야 한다.
sudo usermod -a -G docker $USER
sudo service docker restart
그러면 다음과 같이 docker ps만 실행해도 동일한 결과를 얻는다.

docker pull은 docker image repository로부터 docker image를 가져오는 명령이다.docker pull ubuntu:18.04

docker images는 로컬에 존재하는 docker image 목록을 출력하는 명령이다.docker images

앞서 설치 테스트를 위해 hello-world라는 image를 실행했는데, 그때 다운로드가 되었기 때문에 로컬에 해당 image가 함께 존재한다.
docker ps는 현재 실행 중인 container의 목록을 출력하는 명령이다.docker ps -a로 실행하면 과거에 실행했던 목록까지 포함하여 출력한다.docker ps
docker ps -a

docker run은 docker 컨테이너를 실행하는 명령이다.-it 옵션은 -i와 -t 옵션을 합친 것으로, 컨테이너를 실행함과 동시에 interactive한 terminal로 접속하게 된다.--name 옵션은 컨테이너를 구분하기 쉽게 container id 대신 이름을 지정하는 것이다. 이름을 직접 지정하지 않으면 자동으로 생성된다./bin/bash는 컨테이너 실행과 동시에 실행할 명령으로, bash 터미널을 사용함을 의미한다.docker run -it --name demo1 ubuntu:18.04 /bin/bash

docker exec은 컨테이너 내부에서 명령을 내리거나, 내부로 접속하는 명령이다.-d 옵션에 의해 컨테이너에서 접속 종료를 해도 백그라운드에서 계속 실행됨을 확인할 수 있다.docker run -it -d --name demo2 ubuntu:18.04
docker ps

docker exec -it demo2 /bin/bash

docker logs는 컨테이너의 로그를 확인하는 명령이다.--name)의 busybox 이미지를-d)하여,sh -c "while true; do $(echo date); sleep 1; done")하는 명령이다.docker run --name demo3 -d busybox sh -c "while true; do
$(echo date); sleep 1; done"
docker logs demo3
docker logs demo3 -f

-f 옵션은 로그를 한 번 출력하고 끝내는 대신 계속 확인하면서 출력하는 것이다.docker stop은 실행 중인 컨테이너를 종료하는 명령이다.docker ps로 확인하면 모두 실행이 종료되었음을 알 수 있다.docker stop demo2
docker stop demo3

docker rm은 컨테이너를 삭제하는 명령이다.docker ps -a를 실행하면 삭제한 컨테이너가 존재하지 않음을 확인할 수 있다.docker rm demo1
docker rm demo2
docker rm demo3

docker rmi은 로컬에 저장된 도커 이미지를 삭제하는 명령이다.docker images를 실행하면 삭제한 이미지가 존재하지 않음을 확인할 수 있다.docker rmi ubuntu:18.04
docker rmi busybox

