Docker 알아보기 및 설치하기

박찬병·2024년 11월 7일

데이터 분석

목록 보기
6/11

도커(Docker)란?

https://docs.docker.com/get-started/docker-overview/

도커(Docker)는 컨테이너(Container) 기술을 이용해 애플리케이션을 개발, 배포, 실행하는 환경을 독립적으로 구성할 수 있게 돕는 플랫폼이다.
컨테이너는 애플리케이션이 필요로 하는 라이브러리, 설정 파일 등의 모든 종속적인 구조를 포함하는 격리된 실행 환경을 의미한다.
이를 통해 개발, 배포, 실행 과정에서 환경 설정의 불일치로 인해 발생할 수 있는 문제를 방지하고, 애플레케이션을 빠르게 배포하고 확장할 수 있다는 장점을 가진다.

컨테이너 vs 가상 머신

애플리케이션을 격리된 환경에서 실행하기 위해서는 컨테이너 외에도 가상 머신을 사용할 수 있다.
다만 두 기술은 구조적인 차이를 가지며, 그에 따라 다른 특성을 갖는다.

컨테이너(Container)
컨테이너는 컨테이너가 실행되는 장치의 운영체제를 공유한다. 즉, 각 컨테이너는 Host OS의 커널을 공유하며 그 위에서 프로세스 수준으로 격리되어 존재한다.
이를 위해 Host OS가 가지고 있는 특성을 보존하면서 목표한 환경을 구성하는데 필요한 부분만큼만 보정하여 Host OS를 기반으로 하면서도 독립적인 환경을 구축한다.
이러한 특성 덕분에 가상 머신에 비해 가벼워 빠른 배포 및 확장이 가능하다는 장점이 있다.
다만 Host OS가 공유되기 때문에 특정 컨테이너로 인해 Host OS에 문제가 발생하면 전체 컨테이너에 장애가 발생할 수 있다.

가상 머신(Virtual Machine; VM)
가상 머신은 하이퍼바이저(Hypervisor)라는 소프트웨어를 통해 장치의 인프라를 가상화하여 구성된다. 각 가상 머신은 독립적인 운영체제인 Guest OS를 실행하고 Host OS와 독립적인 커널을 사용하기 때문에 하드웨어 수준으로 격리되어 있다고 할 수 있다.
가상 머신은 독립된 운영체제를 실행해야 하므로 더 많은 자원과 시간을 소모한다는 단점이 있다.
다만 각 가상 머신이 독립된 운영체제를 실행하기 때문에 더 강력한 보안을 유지할 수 있으며, 한 VM의 장애가 다른 VM이나 Host에 영향을 미치지 않는다는 장점이 있다.


Docker 설치하기

Windows에서는 Docker Desktop을 이용하여 Docker를 사용할 수 있는데, 이는 결국 하위에 WSL(Windows Subsystem for Linux)이나 Hyper-V로 Linux를 설치하여 사용하는 것이기 때문에 그냥 WSL 상에서 Docker를 설치해보고자 한다.

WSL 설치

이를 위해 먼저 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

  1. Windows 기능 켜기/끄기에 들어가서 Hyper-V, 가상 머신 플랫폼, Linux용 Windows 하위 시스템을 사용하도록 체크하고 재부팅한다.
  2. 위 링크의 4단계에서 x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지를 다운받고 실행한다.
  3. PowerShell에서 wsl --set-default-version 2을 실행하여 WSL 2를 기본 버전으로 설정한다.
  4. Microsoft Store에서 Ubuntu를 검색하여 원하는 버전을 설치한다. 나는 Ubuntu 20.04 LTS를 설치하였다.
  5. 우분투에 처음 접속하여 사용자 계정과 암호를 설정한다.

이후 Docker 설치를 진행하기 전에, 각종 명령어를 하나하나 치기에는 너무 힘들기 때문에 우분투 창의 좌측 상단 아이콘을 클릭한 뒤 속성에 들어가서 편집 옵션"Ctrl+Shift+C/V를 복사(C)/붙여넣기로 사용"을 체크하자.

그러면 윈도우 환경에서 컨트롤+C로 복사한 내용을 WSL에서 컨트롤+쉬프트+V로 붙여넣기 할 수 있다.


Docker 설치

기본적으로 공식 문서를 참고하여 설치하자.
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 권한 설정

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 기본 명령어

docker pull

  • docker pull은 docker image repository로부터 docker image를 가져오는 명령이다.
  • 예시로 다음과 같은 명령어를 수행하면 docker.io/library라는 repository에서 ubuntu:18.04라는 image를 다운로드 받는다.
docker pull ubuntu:18.04

  • 기본적으로 docker.io는 docker hub의 public한 저장소로 지정되어 있는데, 특정 repository를 사용하고 싶은 경우에는 docker login을 통해 특정 repository를 바라보게 한 뒤 수행하면 된다.

docker images

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

앞서 설치 테스트를 위해 hello-world라는 image를 실행했는데, 그때 다운로드가 되었기 때문에 로컬에 해당 image가 함께 존재한다.

docker ps

  • docker ps는 현재 실행 중인 container의 목록을 출력하는 명령이다.
  • docker ps -a로 실행하면 과거에 실행했던 목록까지 포함하여 출력한다.
docker ps
docker ps -a

docker run

  • 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

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

  • 이때 다음 명령을 수행하면 앞서 실행한 컨테이너 내부로 접속할 수 있다.
docker exec -it demo2 /bin/bash

docker logs

  • docker logs는 컨테이너의 로그를 확인하는 명령이다.
  • 예를 들어 다음과 같은 명령으로 컨테이너를 실행했다고 생각하자.
    • 이는 demo3라는 이름(--name)의 busybox 이미지를
    • 백그라운드에서 실행(-d)하여,
    • 1초에 한 번씩 현재 시간을 출력(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 stop은 실행 중인 컨테이너를 종료하는 명령이다.
  • 앞서 demo2와 demo3라는 이름의 두 컨테이너가 실행되어 있는데, 다음 명령을 수행한 뒤 docker ps로 확인하면 모두 실행이 종료되었음을 알 수 있다.
docker stop demo2
docker stop demo3

docker rm

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

docker rmi

  • docker rmi은 로컬에 저장된 도커 이미지를 삭제하는 명령이다.
  • 다음 명령어를 수행하고 docker images를 실행하면 삭제한 이미지가 존재하지 않음을 확인할 수 있다.
  • 도커 이미지를 삭제할 때에는 뒤에 태그를 붙여서 특정 이미지를 정확히 나타내야 한다. 다만 태그가 latest인 경우에는 태그를 붙이지 않아도 알아서 제거한다.
docker rmi ubuntu:18.04
docker rmi busybox

  • 이때, 해당 이미지를 기반으로 하는 컨테이너가 있다면 이미지가 삭제되지 않는다. 해당 컨테이너를 종료하고 삭제해야 이미지를 삭제할 수 있다.

0개의 댓글