본문 바로가기
AI Journey/클라우드

[Docker] 우분투에 도커 설치하기

by 보눔비스타 2025. 12. 26.

리눅스(Ubuntu) 환경에서 도커(Docker)를 설치하는 방법과, 필수 설정부터 컨테이너 실행 및 종료 원리까지 알아보자.

 

1. 사전 준비 및 필수 패키지 설치

가장 먼저 시스템 패키지 목록을 최신화하고, 도커 설치에 필요한 의존성 패키지들을 설치한다. apt-transport-https는 패키지 관리자가 HTTPS를 통해 저장소에 접근할 수 있게 해주며, curlgnupg는 GPG 키 인증을 위해 필요하다.

 

***  여기서 GPG 키 인증은 쉽게 말해 "내가 받은 이 파일이 원작자가 배포한 그 순수한 파일이 맞다(무결성)" 는 것을 수학적으로 증명하여 안전하게 설치하기 위한 절차이다.
GPG(GNU Privacy Guard) 키 인증은 공개키 암호화 방식을 이용해 데이터의 암호화, 복호화, 디지털 서명을 통해 송신자의 신원과 데이터 무결성을 검증하는 과정으로, 키 쌍(개인키/공개키)을 생성하고, 공개키를 키 서버 등에 배포하여 상대방이 내 공개키로 암호화하거나 서명을 검증하게 하는 방식으로 이루어진다. 핵심은 자신의 개인키로 서명하고, 상대방은 자신의 공개키로 그 서명을 검증하며, 상대방의 공개키로 암호화된 내용은 자신의 개인키로만 복호화하는 것이다. ***

sudo apt update
sudo apt -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • apt-transport-https: 패키지 관리자가 HTTPS를 통해 저장소에 접근할 수 있게 한다.
  • curl, gnupg-agent: GPG 키 관리 및 데이터 전송을 위한 도구들이다.

이후 도커 공식 GPG 키를 등록하고 저장소(Repository)를 추가한다. 우분투 기본 저장소에 있는 도커보다 최신 안정 버전을 받기 위해 공식 저장소를 이용한다.

curl -fsSL http://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

2. 도커 엔진 설치

저장소 추가 후 다시 apt update를 수행하여 패키지 목록을 갱신하고, 실제 도커 엔진을 설치한다.

apt -y install docker-ce docker-ce-cli containerd.io
  • docker-ce: Docker Community Edition (도커 엔진 본체).
  • docker-ce-cli: 도커 명령어를 사용할 수 있는 클라이언트 도구.
  • containerd.io: 컨테이너 런타임 인터페이스.

3. 도커 데몬 설정 (daemon.json)

도커가 실행될 때 적용될 세부 설정을 /etc/docker/daemon.json 파일에 직접 작성한다. 이 부분은 운영 환경에서 성능과 로그 관리를 위해 매우 중요하다.

{
  "exec-opts" : ["native.cgroupdriver=systemd"],
  "log-driver" : "json-file",
  "log-opts" : {"max-size" : "100m"},
  "storage-driver" : "overlay2"
}

 

  • Cgroup Driver (systemd): 리눅스의 자원 관리 기능인 cgroup을 systemd가 관리하도록 설정한다. (쿠버네티스 구축 시 필수적인 설정이다).
  • Log Driver & Opts: 컨테이너 로그가 무한정 커지는 것을 방지하기 위해 파일당 최대 크기를 100MB로 제한했다.
  • Storage Driver (overlay2): 이미지 레이어를 효율적으로 관리하기 위한 스토리지 드라이버로, 현재 가장 권장되는 방식이다.

4. 서비스 시작 및 확인

설정을 마친 후 systemd를 통해 도커 서비스를 시작하고 상태를 확인한다.

systemctl daemon-reload   # 설정 파일 변경 사항 반영
systemctl enable docker.service # 부팅 시 자동 실행 설정
systemctl restart docker  # 서비스 재시작
docker --version          # 설치 확인

 

 

5. 첫 번째 컨테이너 실행 (Hello World)

설치가 잘 되었는지 검증하기 위해 가장 기본적인 이미지인 hello-world를 실행한다.

docker run hello-world

 

실행 결과 분석:

  1. Image Pull: 로컬에 hello-world 이미지가 없으므로 (Unable to find image...), 도커 허브(Docker Hub)에서 자동으로 이미지를 다운로드(Pull)했다.
  2. Container Run: 이미지를 기반으로 컨테이너를 생성 및 실행했다.
  3. Output: "Hello from Docker!" 메시지를 출력하고 컨테이너는 할 일을 다 했으므로 종료(Exited)되었다.

6. 인터랙티브 모드 실습 (Ubuntu)

이번에는 단순 출력 후 종료되는 것이 아니라, 컨테이너 내부로 들어가서 작업을 해보자.

docker run -it ubuntu bash

중요 옵션 -it:

  • -i (interactive): 입출력을 활성화하여 상호작용 가능하게 함.
  • -t (tty): 가상 터미널을 할당.
  • 이 두 옵션을 같이 써야 터미널에서 셸(bash)을 입력하며 사용할 수 있다.

ls 명령어로 내부를 확인하고 exit로 빠져나온다. exit를 입력하는 순간 셸 프로세스가 종료되므로, 컨테이너도 함께 정지(Stop) 상태가 된다.

 

7. 컨테이너 생명주기 (feat. Rocky Linux)

마지막으로 Rocky Linux 이미지를 이용해 "컨테이너가 실행되고 종료되는 과정"을 실습해본다.

 

1. 이미지 다운로드: docker pull rockylinux:8로 이미지만 미리 받아둠

2. 단순 실행 (바로 종료됨):

 

docker run rockylinux:8
docker run -d rockylinux:8

 

  • 실행하자마자 docker ps -a로 확인해보면 상태가 Exited다. -d (백그라운드 실행) 옵션을 줘도 마찬가지다.
  • 원인: 컨테이너는 "실행할 메인 프로세스"가 살아있을 때만 유지된다. rockylinux:8 이미지는 기본 실행 명령(CMD)이 bash로 설정되어 있을 텐데, 터미널(-it)을 연결하지 않으면 bash가 실행되자마자 입력을 받을 곳이 없어 바로 종료되기 때문이다.

3. 인터랙티브 실행 (유지됨):

docker run -it rockylinux:8 bash
  • 결과: 셸이 유지되므로 컨테이너가 계속 실행(Up) 상태를 유지한다. exit를 치면 그제야 종료된다.

 

8. 도커 상태를 확인하는 주요 명령어

  • docker images: 다운로드된 이미지 목록 확인.
  • docker ps: 현재 실행 중인 컨테이너만 확인.
  • docker ps -a: 종료된 것을 포함한 모든 컨테이너 이력 확인.
  • docker ps -a | wc -l: 컨테이너 개수 카운트.