바이브 빌드 (Vibe Build)

혼자서 서버구축, 바이브 코딩, WebUI 제작, 배포, 운영, 응용과정을 기록하는 기술 블로그 입니다.

Docker Engine 설치

Docker Engine 설치

Article Guide

목  차

핵심 요약

Nginx, Node.js, MySQL, Redis 등의 프로그램을 Ubuntu에 각각 직접 설치하지 않고, 서로 분리된 컨테이너로 간편하고 동일하게 실행·관리하기 위해 Docker Engine을 설치합니다.

구성 요소 역할
Docker Engine 모든 컨테이너를 실행하고 관리
Docker 이미지 컨테이너를 만드는 설계도
컨테이너 이미지로 생성하여 실행하는 격리된 프로세스
Docker Compose 여러 컨테이너를 서비스 단위로 구성하고 관리

이 문서는 같은 네트워크에 있는 Windows 관리 PC에서 VS Code로 Linux 서버에 SSH 접속한 후, Linux 서버에 Docker Engine을 설치하고 기본 작동과 사용자 권한을 확인하는 과정을 설명합니다.

Docker Engine과 project-dev-server의 관계

Windows 브라우저의 요청이 project-dev-server의 8080번 포트를 거쳐 Docker Engine 내부 Nginx 컨테이너의 80번 포트로 전달되는 구조

project-dev-server 안에서는 컨테이너가 격리된 환경에서 실행됩니다. 외부에서 컨테이너의 서비스에 접속하려면 필요한 컨테이너 포트를 호스트 포트에 게시해야 합니다.

설치 목적과 예시 환경

아래 예시 환경을 사용하겠습니다.

구분 예시 값
Windows PC Windows 관리 PC
Linux 서버 project-dev-server
Linux 사용자 apple2ne1
Linux 서버 IP 192.168.1.231
SSH 포트 22
Nginx 외부 접속 포트 8080
Linux 배포판 Ubuntu Server

실제 작업에서는 192.168.1.231자신의 Linux 서버 IP 주소로 바꾸어야 합니다.

1. 전체 연결 구조

Windows PC
   │
   │ VS Code Remote - SSH
   ▼
Linux 서버: 192.168.1.231
   │
   │ Docker Engine
   ▼
Nginx 컨테이너
   │
   │ Linux 서버의 8080번 포트로 공개
   ▼
Windows 웹 브라우저
http://192.168.1.231:8080
Windows PC에서 VS Code Remote SSH로 Linux 서버에 연결하고 Docker Engine의 Nginx 컨테이너를 8080 포트로 공개해 웹 브라우저에서 접속하는 구조

VS Code는 Windows에서 실행되지만, VS Code의 SSH 원격 터미널에서 입력하는 Linux 명령은 Windows가 아니라 Linux 서버에서 실행됩니다.

VS Code의 Remote – SSH 확장은 SSH 서버가 실행 중인 원격 컴퓨터에 연결하여 원격 파일과 터미널을 로컬 VS Code처럼 사용할 수 있게 합니다.

2. 시작하기 전에

다음 조건을 먼저 확인합니다.

  • 지원되는 64비트 Ubuntu Server가 설치되어 있음
  • 서버가 인터넷에 연결되어 있음
  • sudo 명령을 실행할 수 있는 사용자 계정이 있음
  • Windows 관리 PC에서 서버로 SSH 접속할 수 있음
  • VS Code에서 project-dev-server에 연결하고 원격 터미널을 열 수 있음

네트워크와 SSH 접속을 준비하는 방법은 prepare-project-dev-server-on-local-network-ko에서, VS Code의 Remote – SSH 설정과 원격 터미널 사용법은 VS Code 환경에서 설명합니다.

터미널 프롬프트가 다음처럼 표시되면 이후 명령은 Linux 서버에서 실행됩니다.

apple2ne1@project-dev-server:~$

3. 검증 환경

이 문서는 다음 환경에서 Docker Engine 설치와 기본 작동을 확인한 기록을 기준으로 작성했습니다.

항목 확인 값
서버 Ubuntu 26.04 LTS
서버 이름 project-dev-server
사용자 apple2ne1
Docker Engine 29.6.2
Docker Compose v5.3.1

Docker 지원 여부를 확인하려면 다음 명령으로 운영체제 버전과 아키텍처를 확인한 뒤 Docker 공식 문서의 현재 지원 범위와 비교합니다.

lsb_release -a
uname -m
dpkg --print-architecture
VS Code의 Linux 서버 터미널에서 Ubuntu 26.04와 resolute 코드명, x86_64 CPU 아키텍처 및 amd64 패키지 아키텍처를 확인한 결과

4. 기존 Docker 관련 패키지 확인 및 제거

새로운 project-dev-server를 구축한 경우에는 필요하지 않을 수 있지만, Docker를 설치한 적이 있다면 Docker 공식 저장소를 이용하기 전에 충돌할 수 있는 기존 패키지를 제거합니다. Docker는 Ubuntu에서 공식 APT 저장소를 설정한 뒤 Docker Engine을 설치하는 방식을 권장합니다.

터미널 화면을 보기 좋게 확장한 후 다음 명령을 실행합니다.

이 명령은 Ubuntu 터미널에 전체를 한꺼번에 붙여 넣고 Enter를 누르면 됩니다. VS Code에서는 Ctrl+CCtrl+V를 사용하여 복사하고 붙여 넣을 수 있습니다.

for pkg in docker.io docker-doc docker-compose docker-compose-v2 docker-buildx podman-docker containerd runc; do
    sudo apt-get remove -y "$pkg"
done
VS Code의 Linux 서버 터미널에서 기존 Docker 관련 패키지 제거 명령을 실행하고 sudo 암호 입력을 기다리는 화면

아래에 보이는 한 줄로 실행해도 됩니다.

for pkg in docker.io docker-doc docker-compose docker-compose-v2 docker-buildx podman-docker containerd runc; do sudo apt-get remove -y "$pkg"; done

명령의 의미

지정된 패키지를 하나씩 확인하며 제거하는 반복문입니다.

  • for pkg in ... : 패키지 이름을 하나씩 pkg에 넣습니다.
  • do ... done : 각 패키지마다 내부 명령을 실행합니다.
  • sudo apt-get remove : 해당 패키지를 제거합니다.
  • -y : 확인 질문에 자동으로 Yes라고 답합니다.
  • "$pkg" : 현재 처리 중인 패키지 이름입니다.

예를 들어 내부적으로 다음 명령들을 차례로 실행합니다.

sudo apt-get remove -y docker.io
sudo apt-get remove -y docker-doc
sudo apt-get remove -y docker-compose

나머지 패키지도 같은 방식으로 처리합니다.

일부 패키지가 설치되어 있지 않으면 다음과 비슷한 메시지가 나올 수 있지만 오류가 아닙니다.

Package 'docker-doc' is not installed, so not removed
기존 Docker 관련 패키지 제거 명령 실행 후 containerd와 runc가 설치되어 있지 않아 제거하지 않았다는 결과가 표시된 화면

이 명령은 Ubuntu 저장소에서 설치했을 가능성이 있는 기존 또는 충돌 가능한 Docker 관련 패키지를 정리한 후 공식 Docker를 설치할 때 주로 사용합니다. 기존 Docker 컨테이너와 이미지 데이터가 중요하다면 먼저 백업하는 것이 안전합니다.

5. Docker 공식 저장소 등록

5.1 패키지 목록 업데이트

APT 패키지는 Ubuntu에서 프로그램을 쉽게 설치하고 관리할 수 있도록 묶어 놓은 소프트웨어 설치 꾸러미입니다. 먼저 APT를 이용하여 저장소의 패키지 목록을 업데이트합니다.

sudo apt update
VS Code의 Linux 서버 터미널에서 sudo apt update 명령을 입력한 화면
Ubuntu 저장소에서 최신 패키지 목록을 가져와 sudo apt update 실행을 완료한 화면

APT의 역할

APTAdvanced Package Tool의 약자로 다음 작업을 담당합니다.

  • 프로그램 검색과 설치
  • 프로그램 업데이트
  • 프로그램 삭제
  • 필요한 의존성 패키지 자동 설치
  • 패키지 간 충돌 확인
  • 설정된 저장소에서 패키지 내려받기

5.2 인증서 모음과 curl 설치

ca-certificates는 HTTPS로 Docker의 APT 저장소에 연결할 때 서버 인증서를 검증하는 데 사용합니다. 이 단계에서 APT는 Docker 이미지가 아니라 저장소 메타데이터와 설치 패키지를 가져옵니다.

sudo apt install -y ca-certificates curl
VS Code의 Linux 서버 터미널에서 ca-certificates와 curl 설치 명령을 실행하고 sudo 암호 입력을 기다리는 화면
ca-certificates와 curl이 이미 최신 버전으로 설치되어 있다는 패키지 설치 결과 화면
  • ca-certificates: HTTPS 인증서 확인에 사용
  • curl: 인터넷에서 파일을 가져오는 명령

5.3 Docker 공식 GPG 키 저장 폴더 생성

Docker 공식 서명 키를 저장할 폴더를 만듭니다.

sudo install -m 0755 -d /etc/apt/keyrings
VS Code의 Linux 서버 터미널에서 Docker 서명 키를 저장할 apt keyrings 폴더 생성 명령을 완료한 화면

5.4 Docker 공식 GPG 키 내려받기

이 키는 내려받은 Docker 패키지가 다음 조건을 충족하는지 확인하는 데 사용됩니다.

  • Docker 공식 저장소에서 제공된 것인지
  • 전송 중 변조되지 않았는지
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
VS Code의 Linux 서버 터미널에서 Docker 공식 GPG 키를 내려받고 docker.asc 파일의 읽기 권한을 설정한 화면

5.5 Docker 저장소 추가

Docker 저장소는 Docker Engine을 설치하고 업데이트하는 데 필요한 패키지를 보관하고 배포하는 인터넷 서버입니다.

Ubuntu가 Docker 프로그램을 내려받는 공식 공급처라고 이해하면 됩니다.

Ubuntu 서버
→ Docker 공식 저장소에 접속
→ Docker 패키지 내려받기
→ Docker Engine 설치

아래 명령을 그대로 한 번에 실행합니다.

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

저장소 정보를 다시 읽습니다.

sudo apt update

위 설치 흐름은 Docker가 제공하는 Ubuntu용 공식 Docker Engine 설치 절차를 기준으로 합니다.

6. Docker Engine 설치

다음 패키지를 설치합니다.

sudo apt install -y \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  docker-buildx-plugin \
  docker-compose-plugin
VS Code의 Linux 서버 터미널에서 Docker Engine과 CLI, containerd, Buildx와 Compose 플러그인 설치 명령을 입력한 화면
Docker Engine과 관련 플러그인을 설정하고 Docker 서비스와 소켓 연결을 생성하는 설치 진행 화면

각 패키지의 역할은 다음과 같습니다.

패키지 역할
docker-ce Docker Engine 본체
docker-ce-cli docker 명령어
containerd.io 컨테이너 실행 관리
docker-buildx-plugin Docker 이미지 빌드 기능
docker-compose-plugin docker compose 기능

Docker Engine에서는 Docker 데몬이 이미지, 컨테이너, 네트워크, 볼륨 등의 Docker 객체를 생성하고 관리합니다.

Docker 설치 시 오류가 발생했을 때

아래와 같은 오류는 저장소가 올바르게 등록되지 않아 패키지를 찾지 못했을 때 주로 나타납니다.

Docker Engine 설치 과정에서 docker-ce-cli와 containerd 및 Docker 플러그인 패키지를 찾지 못했다는 오류가 표시된 화면

저장소 설정 파일이 있는지 확인합니다.

ls -l /etc/apt/sources.list.d/docker.sources

다음 메시지가 나오면 저장소가 등록되지 않은 것이므로 5. Docker 공식 저장소 등록부터 다시 진행합니다.

No such file or directory

7. Docker 서비스 상태 확인

다음 명령을 실행합니다.

sudo systemctl status docker

정상 상태에서는 다음 표시가 나옵니다.

Active: active (running)
VS Code의 Linux 서버 터미널에서 Docker 서비스가 enabled 및 active running 상태임을 확인한 화면

상태 화면에서 빠져나오려면 다음 키를 누릅니다.

q

간단하게 확인하려면 다음 명령도 사용할 수 있습니다.

systemctl is-active docker

정상 결과:

active
VS Code의 Linux 서버 터미널에서 systemctl is-active docker 명령을 실행해 active 결과를 확인한 화면

Docker가 실행되지 않는다면 다음 명령을 실행합니다.

sudo systemctl start docker

Ubuntu와 Debian에서는 Docker 서비스가 기본적으로 부팅 시 시작하도록 설정됩니다. 다음 명령으로 활성화 여부를 먼저 확인합니다.

systemctl is-enabled docker

정상 예시:

enabled
VS Code의 Linux 서버 터미널에서 systemctl is-enabled docker 명령을 실행해 enabled 결과를 확인한 화면

결과가 disabled라면 Docker와 containerd 서비스를 활성화합니다.

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

8. Docker 설치 버전 확인

sudo docker --version
Docker version 29.6.2, build dfc4efb

Docker Compose도 확인합니다.

sudo docker compose version
Docker Compose version v5.3.1
VS Code의 Linux 서버 터미널에서 Docker 29.6.2와 Docker Compose v5.3.1 버전을 확인한 화면

9. Docker 기본 작동 테스트

Docker 공식 테스트 이미지를 실행합니다.

sudo docker run hello-world
sudo docker run hello-world: `hello-world` 컨테이너 실행
→ Docker 데몬에 연결
→ 로컬 서버에 `hello-world` 이미지가 없으면 이미지 내려받기
→ 내려받은 `hello-world` 이미지로 컨테이너 생성
→ 생성한 컨테이너 내부의 코드 실행
→ 터미널에 `Hello from Docker!` 메시지 출력
sudo docker run hello-world 실행 시 로컬 이미지 확인, 이미지 내려받기, 컨테이너 생성과 실행, 내부 코드 실행을 거쳐 터미널에 결과를 출력하는 과정

처음 실행하면 서버에 이미지가 없으므로 Docker Hub에서 이미지를 내려받습니다.

정상적으로 실행되면 다음 문구가 포함됩니다.

Hello from Docker!
VS Code의 Linux 서버 터미널에서 hello-world 이미지를 내려받아 컨테이너를 실행하고 Hello from Docker 결과를 확인한 화면

이 결과가 나오면 다음 과정이 모두 정상이라는 의미입니다.

  • Docker CLI가 Docker 데몬과 통신함
  • Docker Hub에서 이미지를 내려받음
  • 이미지로 컨테이너를 생성하고 실행함
  • 컨테이너의 출력이 터미널에 전달됨

10. sudo 없이 Docker 사용하기와 권한 오류 해결

현재 상태에서는 Docker 명령 앞에 sudo를 붙여야 합니다.

sudo 없이 Docker 명령을 실행할 때 다음과 같은 Docker 데몬 소켓 권한 오류가 발생할 수 있습니다.

permission denied while trying to connect to the Docker daemon socket
sudo docker ps

현재 사용자를 docker 그룹에 추가하면 sudo 없이 사용할 수 있습니다.

sudo usermod -aG docker apple2ne1

Docker 공식 문서도 Linux에서 Docker를 일반 사용자로 실행하려면 사용자를 docker 그룹에 추가하는 방법을 안내합니다. 다만 docker 그룹은 사실상 높은 시스템 권한을 제공하므로 신뢰할 수 있는 사용자만 추가해야 합니다.

그룹 변경 사항은 현재 로그인 세션에 즉시 적용되지 않을 수 있습니다.

apple2ne1 사용자를 docker 그룹에 추가한 직후 현재 로그인 세션에서 docker ps를 실행해 Docker 소켓 권한 오류가 발생한 화면

실제 계정 정보에 기록된 그룹 확인

getent group docker
현재 로그인 세션의 groups 결과에는 docker가 없지만 getent group docker 결과에는 apple2ne1 계정이 기록된 화면
docker:x:983:apple2ne1

결과를 보면 apple2ne1 사용자는 docker 그룹에 정상적으로 추가되었습니다. 하지만 현재 groups 결과에는 아직 docker가 없습니다. 다음 중 한 가지 방법을 사용합니다.

방법 1: 현재 터미널에서 바로 적용

newgrp docker
현재 세션의 그룹 목록을 확인하고 newgrp docker 실행 후 docker 그룹이 추가된 것을 다시 확인한 화면
groups

결과를 보면 현재 사용자 apple2ne1docker 그룹에 포함되어 있습니다.

방법 2: 로그아웃한 뒤 다시 로그인

계정 설정에는 아래 명령으로 등록을 확인했지만, 현재 로그인 세션에는 아직 새 권한이 반영되지 않은 상태입니다.

getent group docker
docker:x:983:apple2ne1

VS Code의 모든 원격 터미널에서 로그아웃한 뒤 원격 연결을 종료하고 다시 연결합니다. 다시 로그인하면 사용자의 그룹 정보가 새로 평가됩니다.

그룹 권한이 계속 반영되지 않는 일부 가상 머신이나 원격 개발 환경에서는 마지막 방법으로 서버를 재시작할 수 있습니다.

sudo reboot
Linux 서버에서 sudo reboot 명령을 실행하고 암호를 입력해 재부팅을 시작하는 화면

그런 다음 Linux 서버에 다시 연결합니다.

서버 재부팅으로 VS Code SSH 연결이 끊기고 Reload Window를 선택하라는 안내가 표시된 화면

재접속 후 확인합니다.

groups

결과에 docker가 포함되어야 합니다.

apple2ne1 adm cdrom sudo dip plugdev users lxd docker
VS Code로 Linux 서버에 재접속한 뒤 groups 명령 결과에 docker 그룹이 포함된 화면

이제 다음 명령이 sudo 없이 실행되어야 합니다.

docker ps

권한 오류가 발생한다면 이번 작업에서는 계속 다음처럼 sudo를 붙여도 됩니다.

sudo docker ps
VS Code의 Linux 서버 터미널에서 docker ps와 sudo docker ps를 실행해 컨테이너 목록을 확인한 화면

다음 글

Docker Nginx 컨테이너

다음 글에서 다룰 내용:

  • nginx:alpine 이미지로 nginx-web 컨테이너를 백그라운드에서 실행하고 재시작 정책을 설정합니다.
  • -p 8080:80 포트 게시를 사용해 호스트의 8080번 포트를 Nginx 컨테이너의 80번 포트에 연결합니다.
  • docker ps, curl과 Windows 웹 브라우저를 사용해 컨테이너 상태와 Nginx 접속 결과를 확인합니다.
  • Docker의 포트 공개 범위와 UFW 상태를 점검하고, 같은 네트워크에서 접속할 수 있는 조건을 확인합니다.
  • Nginx 컨테이너의 로그를 확인하고 중지, 시작, 재시작과 삭제 명령을 실습합니다.
  • 사용자 HTML 파일이 있는 호스트 폴더를 Nginx 컨테이너에 바인드 마운트하여 웹페이지를 표시합니다.
  • 컨테이너 이름 중복, 포트 충돌과 Connection refused 등 자주 발생하는 오류의 확인 순서를 익힙니다.

참고 자료 및 출처

  • Install Docker Engine on Ubuntu
  • 지원되는 Ubuntu 환경, 충돌 패키지 제거, 공식 APT 저장소 등록, Docker Engine 설치와 hello-world 실행 절차를 확인했습니다.
  • 확인 날짜: 2026-08-07
  • Linux post-installation steps for Docker Engine
  • docker 그룹의 권한 위험, 사용자 그룹 추가, 재로그인과 newgrp docker 적용 방법을 확인했습니다.
  • 확인 날짜: 2026-08-07

관련 문서


Previous article
Next article