본문 바로가기

Why?

왜 이런 명령어를 사용한 것일까? (Docker 환경 구성)

Docker는 개발 관련 작업을 하다 보면 자연스럽게 자주 사용하게 되는 도구이다.

 

좀 더 기초적인 접근을 하기 위해서 최근 Docker에 대해 자세히 서술된 책을 발견하고 읽고 있는 중이다.

 

Docker: Up & Running, 3rd Edition (O'Reilly)

 

책에서는 Docker의 역사부터 설치와 사용 방법까지 상세히 설명하고 있다.

 

책에서 명령어를 중심으로 서술하는 부분이 있다 보니, Docker를 설치할 때 항상 마주하는 명령어에 관심이 생겼다.

 

 

사실 이는 너무 자연스럽게 넘어가는 상황이다. 

 

예를 들면, Google에 "How to install Docker in Ubuntu" 라고 검색해서 나오는 Docker Docs를 타고 가면,

아래와 같은 코드를 마주하게 된다.

 

Docker Docs 캡처 이미지

 

Docker를 설치하기 위해 그냥 이 부분을 복사해서 사용하게 된다.

 

그 과정에서 이 부분에 대한 궁금증이 생겼다.

 

왜 이런 명령어를 사용한 걸까? 

 

 

 

한 줄씩 뜯어보자.


 

일단, 처음은 "Set up Docker's apt repository" 를 위한 작업을 진행하는 것이다.

 

sudo apt update

 

sudo"superuser do"의 약어로 일반적으로 명령어를 관리자(root) 권한으로 실행할 때 사용하는 명령어
apt"Advanced Package Tool"의 약자

 

먼저 apt update를 통해 현재 APT에 등록되어 있는 저장소로부터 사용 가능한 패키지와 버전 정보를 갱신한다.

 

결론적으로 최종에는,

첫 번째 apt update
→ 기존에 등록되어 있던 APT 저장소의 패키지 정보 갱신

Docker 저장소 등록

두 번째 apt update
→ 새롭게 등록한 Docker 저장소까지 포함하여 패키지 정보 갱신

 

 

다음으로는 필요한 패키지를 설치하게 된다.

 

sudo apt install ca-certificates curl

 

두 패키지를 설치한다. 각 패키지의 역할은 다음과 같다.

 

1. ca-certificates

HTTPS 사이트의 인증서를 검증할 때 사용하는 신뢰할 수 있는 인증기관(CA) 목록

 

2. curl

URL로부터 데이터를 가져오는 프로그램

 

 

이어서 디렉터리를 만들고 권한을 설정한다.

sudo install -m 0755 -d /etc/apt/keyrings

 

install은 Linux 명령어로 파일/디렉터리를 만들거나 복사하면서 권한·소유권 등을 함께 설정

 

`-m`은 생성할 파일/디렉터리의 권한(mode)을 지정한다. 여기서는 0755, 즉 rwxr-xr-x로 설정한다.

`-d`는 디렉터리를 생성하는 옵션이며, 생성할 경로로 /etc/apt/keyrings를 지정한다.

 

 

 

다음으로 관리자 권한으로 Docker 공식 서버에서 GPG 공개키를 다운로드하여 파일로 저장한다.

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

 

여기서 curl을 사용하며, 옵션으로 -fsSL을 설정하였다. 각각 다음 의미를 가진다.

 

-f : HTTP 요청 실패 시 오류로 처리

-s : 진행률 등 불필요한 출력 숨김

-S : -s 상태에서도 오류 메시지는 표시

-L : Redirect가 발생하면 새 주소를 따라감

 

`-o` 옵션을 통해 결과를 지정한 파일에 저장하게 된다.

 

즉, 이 단계를 통해 APT가 Docker 저장소에서 제공하는 패키지 정보의 서명을 검증하기 위한 공개키를 준비한다.

 

 

다음으로 파일에 모든 사용자가 읽을 수 있는 권한을 추가한다.

 

sudo chmod a+r /etc/apt/keyrings/docker.asc

 

`chmod`와 `a+r` 옵션을 통해 모든 사용자(all)에게 읽기(read) 권한을 추가(+)한다.

 

즉, APT가 해당 공개키를 읽어 서명을 검증할 수 있도록 읽기 권한을 부여하는 과정이다.

 

 

 

 

다음으로 설정 파일을 만들게 된다.

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

 

 

`tee`를 통해 입력 받은 내용을 파일에 기록하게 되는데,

`<<EOF` 를 통해  EOF가 다시 나올 때까지 모든 내용을 표준 입력(stdin)으로 전달하게 된다.

 

`<<EOF` 는 Shell의 Here Document(Heredoc) 문법이라고 한다.
이때 EOF가 따옴표로 감싸져 있지 않기 때문에 `$(...)`와 같은 command substitution이 먼저 실행되고, 그 결과가 파일에 기록된다.

 

 

작성되는 내용을 한 줄씩 분석해보면 다음과 같다.

 

Types: deb

APT가 이 저장소에서 바이너리 패키지(deb)를 가져오도록 지정한다.

URIs: https://download.docker.com/linux/ubuntu

Docker 패키지를 가져올 공식 저장소 주소를 지정한다.

Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")

현재 Ubuntu의 코드네임을 확인해서 해당 버전용 저장소를 사용한다.

Components: stable

Docker 저장소의 stable 컴포넌트에서 패키지를 가져온다.

Architectures: $(dpkg --print-architecture)

현재 시스템 아키텍처에 맞는 패키지만 사용한다.

Signed-By: /etc/apt/keyrings/docker.asc

이 Docker 저장소의 서명을 검증할 때 /etc/apt/keyrings/docker.asc 공개키를 사용한다.

 

 

Ubuntu 24.04 + amd64라면 최종 파일은 대략:

Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

 

처럼 만들어진다.

 

 

전체를 한 문장으로 요약하면,

현재 Ubuntu 버전과 CPU 아키텍처에 맞는 Docker stable .deb 패키지를 Docker 공식 저장소에서 가져오고,
docker.asc 공개키로 Docker 저장소의 서명을 검증하도록 APT에 설정한다.

 

 

 

 

 

마지막으로

sudo apt update

 

update까지 진행한다.

 

 

이 과정을 통해 Ubuntu의 APT가 Docker 공식 저장소를 사용할 준비가 완료된 것이다.

 

 

최종적으로 Docker 패키지를 설치한다

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

이때 특정 버전을 지정하지 않았으므로, 현재 설정된 Docker 저장소에서 제공되는 최신 안정 버전이 설치된다.

 

 

 

최종적으로 Docker 서비스의 실행 여부를 확인한다.

 sudo systemctl status docker

 

Raspberry Pi에서 직접 확인한 모습

 

만약 실행 상태가 아니라면 아래 명령어를 실행한다.

sudo systemctl start docker

 

 

 

마무리는 hello-world 이미지를 실행하여 설치가 완료되었는지 확인하라고 안내하고 있다.

 sudo docker run hello-world

 

진행해보면,

 

hello-world image 실행

 

정상적으로 동작하는 것을 확인할 수 있다!