Docker 입문 가이드 2026|컨테이너와 이미지 개념부터 기본 명령어로 웹서버 실행하기

2026 DOCKER BEGINNER GUIDE

목차

Docker를 처음 접해도
웹서버까지 직접 실행할 수 있습니다

이미지 · 컨테이너 · 포트 연결 · Nginx · Dockerfile

Docker는 애플리케이션을 필요한 실행 환경과 함께 패키징하고 컨테이너로 실행할 수 있도록 도와주는 플랫폼입니다. 개발 환경을 구성하거나 웹서버를 배포할 때 자주 사용되지만, 처음 배우는 사람에게는 이미지와 컨테이너의 차이, Docker Engine의 역할, 포트 연결 방식 등이 낯설 수 있습니다. 이 글에서는 Docker의 기본 개념을 이해한 다음 Docker Desktop 설치, 핵심 명령어 실습, Nginx 웹서버 실행, HTML 파일 연결, Dockerfile을 이용한 이미지 제작까지 순서대로 살펴봅니다.

🐳 Docker 기초
📦 이미지와 컨테이너
🌐 Nginx 웹서버
⌨️ CLI 실습
🧠

개념 이해

이미지와 컨테이너의 관계를 알아봅니다.

⚙️

환경 구축

Docker 설치와 정상 실행 여부를 확인합니다.

🚀

웹서버 실행

Nginx를 컨테이너로 실행합니다.

🛠️

직접 제작

Dockerfile로 나만의 이미지를 만듭니다.

💡 이 글에서 완성할 결과물

Docker로 Nginx 웹서버를 실행하고 웹브라우저에서 http://localhost:8080에 접속해 페이지를 확인합니다. 이후 직접 작성한 HTML 파일을 연결하고 Dockerfile로 사용자 정의 웹서버 이미지를 만들어 봅니다.

⚠️ 실습 전 확인 사항

이 글의 주요 실습은 Docker Engine이 정상 실행되고 있다는 전제에서 진행합니다. Windows에서는 Docker Desktop과 WSL 2 구성이 필요할 수 있습니다. 또한 -p 8080:80 명령은 기본적으로 호스트의 여러 네트워크 인터페이스에 포트를 게시할 수 있으므로, 로컬 실습에서는 127.0.0.1:8080:80처럼 루프백 주소를 지정해 외부 노출을 줄이는 방식을 사용합니다.

Docker란 무엇인가? 컨테이너와 가상머신 차이

Docker를 이해하려면 먼저 컨테이너가 어떤 문제를 해결하는지 알아야 합니다. Docker는 개발자가 애플리케이션과 실행에 필요한 구성 요소를 일관된 형태로 배포하도록 도와줍니다.

Docker의 기본 개념

Docker는 애플리케이션을 이미지로 패키징하고 이를 컨테이너로 실행하는 플랫폼입니다. 애플리케이션 실행에 필요한 파일과 라이브러리, 기본 설정 등을 이미지에 포함할 수 있습니다.

예를 들어 웹서버를 직접 설치하려면 운영체제에 맞는 패키지 설치와 설정 작업이 필요합니다. 반면 Docker를 이용하면 미리 준비된 Nginx 이미지를 내려받아 컨테이너를 실행할 수 있습니다.

이 방식은 개발 환경과 테스트 환경의 차이를 줄이는 데 도움이 됩니다. 다만 운영체제 커널, CPU 아키텍처, 네트워크, 저장소, 환경 변수 등 실행 환경의 모든 차이가 자동으로 사라지는 것은 아닙니다.

Docker는 단순히 프로그램을 압축하는 도구가 아니라 이미지 관리, 컨테이너 실행, 네트워크와 저장소 설정 등을 함께 제공하는 기술입니다.

컨테이너는 어떻게 동작할까요?

컨테이너는 애플리케이션 프로세스를 다른 프로세스와 일정 수준 격리하여 실행하는 환경입니다.

Linux 컨테이너는 네임스페이스와 cgroups 등 운영체제 기능을 활용해 프로세스, 네트워크, 파일 시스템, 자원 사용 등을 분리하거나 제한할 수 있습니다.

각 컨테이너가 별도의 완전한 운영체제 커널을 가지는 것은 아닙니다. 일반적인 Linux 컨테이너는 호스트의 Linux 커널을 공유합니다.

Windows나 macOS의 Docker Desktop에서는 Linux 컨테이너를 실행하기 위해 경량 가상화 환경을 사용할 수 있습니다. 따라서 모든 플랫폼에서 컨테이너가 가상화 기술 없이 직접 실행된다고 이해하면 정확하지 않습니다.

컨테이너는 서로 격리되지만 완전한 보안 경계로 무조건 신뢰해서는 안 됩니다. 권한, 이미지 출처, 네트워크 노출 등을 함께 관리해야 합니다.

Docker와 가상머신(VM)의 차이

가상머신은 일반적으로 하이퍼바이저 위에서 별도의 게스트 운영체제를 실행합니다. 따라서 각 가상머신은 자체 운영체제와 커널을 가질 수 있습니다.

반면 일반적인 Linux 컨테이너는 Linux 커널을 공유하면서 애플리케이션 프로세스를 격리합니다.

이러한 구조 덕분에 컨테이너는 전체 게스트 운영체제를 실행하는 방식보다 가볍게 구성할 수 있는 경우가 많습니다.

다만 실제 메모리 사용량과 시작 속도는 이미지 크기, 실행하는 애플리케이션, 호스트 환경에 따라 달라집니다.

컨테이너가 가상머신을 완전히 대체하는 것은 아닙니다. 서로 다른 커널이 필요하거나 강한 운영체제 수준의 분리가 필요한 환경에서는 가상머신이 더 적합할 수 있습니다.

Docker가 활용되는 대표적인 상황

Docker는 개발 환경을 빠르게 준비하거나 여러 애플리케이션을 일관된 방식으로 배포할 때 유용합니다.

웹서버, 데이터베이스, 캐시 서버, 백엔드 API, 개발용 도구 등을 컨테이너로 실행할 수 있습니다.

팀 프로젝트에서는 Dockerfile과 구성 파일을 공유해 다른 개발자가 유사한 환경을 재현하도록 도울 수 있습니다.

CI/CD 환경에서는 이미지를 빌드하고 테스트한 후 배포하는 자동화 과정에 Docker를 활용할 수 있습니다.

다만 데이터 보존, 비밀 정보 관리, 보안 업데이트, 백업, 모니터링은 Docker 사용 여부와 관계없이 별도로 설계해야 합니다.

비교 항목 컨테이너 가상머신
실행 단위 격리된 프로세스 환경 게스트 운영체제
커널 일반적으로 호스트 커널 공유 별도 게스트 커널
실행 부담 상대적으로 가벼운 경우가 많음 게스트 OS 자원 필요
주요 활용 앱 배포·개발 환경 OS 격리·서버 가상화
💡 Docker를 이해하는 첫 번째 핵심

Docker는 애플리케이션을 이미지로 준비하고, 그 이미지를 바탕으로 컨테이너라는 실행 환경을 만드는 기술이라고 기억하면 좋습니다.

Docker 이미지와 컨테이너의 핵심 개념

Docker 입문에서 가장 중요한 두 단어는 이미지(Image)와 컨테이너(Container)입니다. 두 개념은 밀접하게 연결되어 있지만 같은 의미는 아닙니다.

Docker 이미지란 무엇인가요?

Docker 이미지는 컨테이너를 생성할 때 사용하는 읽기 전용 계층 기반의 패키지입니다.

이미지에는 애플리케이션 실행 파일, 라이브러리, 필요한 파일, 기본 설정 등이 포함될 수 있습니다.

예를 들어 nginx:alpine 이미지는 Alpine Linux 기반으로 구성된 Nginx 이미지 계열을 가리킵니다.

이미지 이름 뒤의 :alpine은 태그입니다. 태그는 특정 이미지 변형이나 버전을 가리키는 데 사용되지만 항상 불변의 내용을 보장하지는 않습니다.

배포 결과를 엄격하게 재현해야 한다면 변경될 수 있는 태그만 사용하기보다 이미지 다이제스트 고정 등을 검토할 수 있습니다.

Docker 컨테이너란 무엇인가요?

컨테이너는 이미지를 바탕으로 생성한 실행 인스턴스입니다.

하나의 이미지로 여러 개의 컨테이너를 생성할 수 있습니다.

예를 들어 같은 Nginx 이미지에서 서로 다른 이름과 포트를 가진 웹서버 컨테이너를 여러 개 실행할 수 있습니다.

컨테이너에는 이미지의 읽기 전용 계층 위에 쓰기 가능한 계층이 추가됩니다.

컨테이너 내부에서 변경한 파일은 해당 컨테이너의 쓰기 가능한 계층에 저장될 수 있지만, 컨테이너를 삭제하면 그 계층의 데이터도 일반적으로 사라집니다.

따라서 데이터베이스나 업로드 파일처럼 보존해야 하는 데이터에는 볼륨 또는 적절한 외부 저장소를 사용해야 합니다.

Docker Hub와 이미지 저장소 이해하기

Docker 이미지는 로컬 컴퓨터에 저장하거나 레지스트리(Registry)라는 이미지 저장소에서 내려받을 수 있습니다.

대표적인 공개 이미지 레지스트리로 Docker Hub가 있습니다.

Docker Hub에는 Nginx, Redis, PostgreSQL 등 다양한 소프트웨어 이미지가 등록되어 있습니다.

이미지를 내려받을 때는 공식 이미지 여부, 게시자, 유지보수 상태, 지원 버전 등을 확인해야 합니다.

출처가 불분명한 이미지는 악성 파일이나 취약한 설정을 포함할 수 있으므로 주의가 필요합니다.

Docker Hub는 이미지 배포 장소이며, 실제 컨테이너 실행은 로컬 Docker Engine이나 별도의 서버에서 수행합니다.

이미지와 컨테이너의 관계를 예시로 이해하기

이미지를 설계도 또는 실행용 원본 패키지에 비유할 수 있습니다.

컨테이너는 그 이미지를 사용해 만들어진 실제 실행 환경입니다.

예를 들어 Nginx 이미지를 한 번 다운로드한 뒤 web-a, web-b라는 이름으로 두 컨테이너를 생성할 수 있습니다.

각 컨테이너는 서로 다른 포트와 설정으로 실행할 수 있으며, 한 컨테이너를 중지하더라도 다른 컨테이너는 계속 실행될 수 있습니다.

이미지를 삭제하려고 할 때 해당 이미지를 사용하는 컨테이너가 남아 있다면 삭제가 제한될 수 있습니다.

📦 Docker 이미지
nginx:alpine
↓
docker run으로 컨테이너 생성
컨테이너 A

web-a

컨테이너 B

web-b

구분 이미지 컨테이너
개념 실행용 패키지 이미지 기반 실행 인스턴스
대표 명령 docker pull docker run
조회 docker image ls docker ps -a
삭제 docker image rm docker rm
💡 이미지는 실행되지 않고 컨테이너가 실행됩니다

이미지는 컨테이너를 만들기 위한 원본입니다. 웹서버가 실제로 동작하려면 해당 이미지를 사용해 컨테이너를 생성하고 실행해야 합니다.

Docker 설치 및 기본 명령어 익히기

Docker를 사용하려면 Docker Engine이 실행되는 환경과 명령어를 입력할 수 있는 Docker CLI가 필요합니다. 초보자가 Windows나 macOS에서 시작한다면 Docker Desktop을 활용할 수 있습니다.

Windows에서 Docker Desktop 설치하기

Windows에서는 공식 Docker Desktop 설치 페이지를 통해 설치 파일을 받을 수 있습니다.

Docker Desktop Windows 설치 공식 안내

설치 전 Windows 버전과 CPU 아키텍처, 가상화 기능, WSL 2 지원 여부 등 최신 시스템 요구 사항을 확인합니다.

WSL 2 기반 Linux 컨테이너를 사용하는 경우 Windows 기능과 가상화 설정이 적절히 구성되어 있어야 합니다.

Docker Desktop 설치를 마친 뒤 프로그램을 실행하고 Docker Engine이 준비될 때까지 기다립니다.

기업 및 조직에서 사용하는 경우 Docker Desktop의 라이선스 조건도 확인해야 합니다. 모든 업무 환경에서 무료로 사용할 수 있는 것은 아닙니다.

Docker 설치 상태 확인하기

Windows PowerShell, Windows Terminal 또는 명령 프롬프트를 실행합니다.

다음 명령으로 Docker CLI 버전을 확인합니다.

docker –version

이 명령은 주로 Docker CLI 설치 여부를 확인합니다.

Docker Engine 연결 상태까지 확인하려면 다음 명령을 실행합니다.

docker info

Docker Engine이 정상 실행 중이면 클라이언트 및 서버 환경에 대한 정보가 표시됩니다.

서버에 연결할 수 없다는 오류가 발생한다면 Docker Desktop이 실행 중인지 확인합니다.

Windows에서는 Docker Desktop이 Linux 컨테이너 모드로 구성되어 있는지도 확인해야 합니다.

hello-world 이미지로 첫 번째 컨테이너 실행하기

Docker의 기본 실행 흐름을 확인하기 위해 hello-world 이미지를 사용합니다.

docker run hello-world

로컬 컴퓨터에 hello-world 이미지가 없다면 Docker가 기본 레지스트리에서 이미지를 내려받으려고 시도합니다.

이미지를 사용할 수 있게 되면 컨테이너를 생성하고 실행합니다.

정상적으로 실행되면 Docker 설치가 동작하고 있음을 알려주는 안내 메시지가 표시됩니다.

hello-world 컨테이너는 안내 메시지를 출력한 뒤 종료되므로 계속 실행 중인 컨테이너 목록에는 나타나지 않을 수 있습니다.

종료된 컨테이너까지 확인하려면 docker ps -a를 사용합니다.

처음 알아야 할 Docker 기본 명령어

Docker를 사용하면서 자주 입력하는 명령어는 이미지 다운로드, 컨테이너 실행, 목록 확인, 중지, 삭제와 관련되어 있습니다.

다음 명령어를 먼저 익혀두면 이후 웹서버 실습을 이해하기 쉽습니다.

docker image ls
docker ps
docker ps -a
docker pull nginx:alpine
docker logs 컨테이너이름
docker stop 컨테이너이름
docker start 컨테이너이름
docker rm 컨테이너이름

docker image ls는 로컬에 저장된 이미지를 조회합니다.

docker ps는 현재 실행 중인 컨테이너를 보여주며, docker ps -a는 종료된 컨테이너를 포함해 조회합니다.

docker pull은 이미지를 내려받고, docker logs는 컨테이너 로그를 확인합니다.

docker stop과 docker start는 기존 컨테이너를 중지하거나 다시 실행할 때 사용합니다.

docker rm은 컨테이너를 삭제하는 명령이므로 보존할 데이터가 있는지 확인한 뒤 사용해야 합니다.

명령어 기능 주의 사항
docker pull 이미지 다운로드 출처 확인
docker run 컨테이너 생성·실행 포트·볼륨 확인
docker ps 실행 중 목록 -a로 전체 조회
docker logs 실행 로그 확인 민감 정보 출력 주의
docker stop 컨테이너 중지 서비스 중단
docker rm 컨테이너 삭제 데이터 보존 확인
💡 hello-world 실행이 성공했다면

Docker CLI와 Docker Engine의 기본 연결이 동작한다고 볼 수 있습니다. 이제 Nginx 이미지를 사용해 웹브라우저에서 확인할 수 있는 웹서버를 실행해 보겠습니다.

Docker로 Nginx 웹서버 실행하기

Docker의 기본 개념과 명령어를 익혔다면 실제 웹서버를 실행해 볼 차례입니다. 이번 실습에서는 Nginx 이미지를 사용합니다. Nginx는 정적 웹페이지 제공, 리버스 프록시 등 다양한 용도로 활용되는 웹서버입니다.

Nginx 이미지 다운로드하기

터미널에서 다음 명령을 입력합니다.

docker pull nginx:alpine

이 명령은 Docker Hub에서 nginx:alpine 이미지를 가져옵니다.

다운로드가 완료되면 다음 명령으로 로컬 이미지 목록을 확인합니다.

docker image ls

목록에서 nginx 이미지와 alpine 태그를 확인할 수 있습니다.

이미지 다운로드만으로 웹서버가 실행되는 것은 아닙니다. 다음 단계에서 이미지를 바탕으로 컨테이너를 생성해야 합니다.

실제 운영 환경에서는 이미지의 유지보수 상태와 보안 업데이트 여부도 주기적으로 확인해야 합니다.

docker run으로 웹서버 컨테이너 실행하기

다음 명령을 입력합니다.

docker run -d --name my-nginx -p 127.0.0.1:8080:80 nginx:alpine

이 명령에는 여러 옵션이 포함되어 있습니다.

docker run은 이미지에서 새 컨테이너를 생성하고 실행합니다.

-d는 컨테이너를 백그라운드 모드로 실행합니다.

--name my-nginx는 컨테이너 이름을 my-nginx로 지정합니다.

-p 127.0.0.1:8080:80은 호스트의 루프백 주소 8080번 포트를 컨테이너의 80번 포트에 연결합니다.

nginx:alpine은 사용할 이미지입니다.

컨테이너가 정상적으로 실행되면 긴 컨테이너 ID가 출력됩니다.

이미 같은 이름의 컨테이너가 존재한다면 이름 충돌 오류가 발생할 수 있으므로 기존 컨테이너 목록을 확인해야 합니다.

localhost:8080에서 웹페이지 확인하기

컨테이너가 실행되었다면 웹브라우저 주소창에 다음 주소를 입력합니다.

http://localhost:8080

정상적으로 연결되면 Nginx의 기본 환영 페이지가 표시됩니다.

이 화면이 나타났다면 호스트의 8080번 포트를 통해 컨테이너 내부 Nginx 웹서버에 접근할 수 있다는 의미입니다.

컨테이너 상태를 확인하려면 다음 명령을 실행합니다.

docker ps

출력 결과에서 my-nginx와 포트 연결 정보를 확인합니다.

웹페이지가 열리지 않는다면 Docker Engine 상태, 컨테이너 실행 상태, 포트 충돌, 로컬 방화벽 등을 확인해야 합니다.

웹서버 중지·재시작·삭제하기

웹서버 실습을 마친 뒤에는 컨테이너를 중지할 수 있습니다.

docker stop my-nginx
docker start my-nginx
docker restart my-nginx

docker stop은 실행 중인 컨테이너를 중지합니다.

docker start는 중지된 컨테이너를 다시 실행합니다.

docker restart는 실행 중인 컨테이너를 재시작할 때 사용할 수 있습니다.

컨테이너를 완전히 삭제하려면 먼저 중지한 뒤 다음 명령을 실행합니다.

docker rm my-nginx

컨테이너를 삭제하더라도 이미지 자체는 일반적으로 로컬에 남아 있습니다.

단, 컨테이너의 쓰기 가능한 계층에만 저장된 데이터는 컨테이너 삭제와 함께 사라질 수 있습니다.

Nginx 웹서버 실행 순서
01. 이미지 다운로드

docker pull nginx:alpine

02. 컨테이너 생성 및 실행

docker run -d –name my-nginx -p 127.0.0.1:8080:80 nginx:alpine

03. 웹브라우저 접속

http://localhost:8080

04. 컨테이너 상태 확인

docker ps

포트 연결 시 주의할 점
호스트 포트 충돌

8080번 포트를 다른 프로그램이 사용하면 컨테이너 실행에 실패할 수 있습니다.

외부 네트워크 노출

-p 8080:80은 기본적으로 외부 접근 가능한 인터페이스에 포트를 게시할 수 있습니다.

운영 환경 보안

실제 서비스 공개 시 방화벽, HTTPS, 접근 제어, 이미지 업데이트 등을 함께 검토해야 합니다.

HTML 파일 연결과 Dockerfile 이미지 제작

기본 Nginx 페이지를 확인했다면 이번에는 직접 작성한 HTML 파일을 웹서버에 연결해 보겠습니다. 이어서 Dockerfile을 작성해 사용자 정의 이미지를 만드는 과정까지 실습합니다.

웹페이지 프로젝트 폴더 만들기

원하는 위치에 docker-web이라는 폴더를 생성합니다.

그 안에 index.html 파일을 만듭니다.

파일에는 다음과 같은 간단한 HTML 코드를 입력합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
 <meta charset="UTF-8">
 <meta name="viewport"
 content="width=device-width, initial-scale=1.0">
 <title>Docker 첫 웹서버</title>
</head>
<body>
 <h1>Docker 웹서버 실행 성공!</h1>
 <p>Nginx 컨테이너에서 제공하는 페이지입니다.</p>
</body>
</html>

파일을 UTF-8 인코딩으로 저장하면 한글이 정상적으로 표시되는 데 도움이 됩니다.

Windows 파일 탐색기에서는 확장자 표시 기능을 켜고 파일이 index.html.txt로 저장되지 않았는지 확인합니다.

프로젝트 폴더에서 터미널을 열면 다음 명령을 편리하게 실행할 수 있습니다.

Bind Mount로 HTML 파일 연결하기

Docker에서는 호스트 컴퓨터의 폴더를 컨테이너 내부 경로에 연결할 수 있습니다.

이를 Bind Mount라고 합니다.

먼저 기존 my-nginx 컨테이너가 8080번 포트를 사용하고 있다면 중지합니다.

docker stop my-nginx

그다음 docker-web 폴더에서 PowerShell을 열고 다음 명령을 실행합니다.

docker run -d --name my-web -p 127.0.0.1:8080:80 --mount "type=bind,source=$($PWD.Path),target=/usr/share/nginx/html,readonly" nginx:alpine

위 명령은 Windows PowerShell 기준이며, 현재 폴더 경로를 Nginx의 기본 정적 파일 디렉터리에 읽기 전용으로 연결합니다.

다른 셸에서는 현재 경로를 표현하는 문법이 다를 수 있습니다.

웹브라우저에서 http://localhost:8080에 접속하면 직접 작성한 HTML 페이지가 표시됩니다.

Bind Mount를 사용하면 호스트의 HTML 파일을 수정했을 때 컨테이너를 새로 빌드하지 않고도 변경 내용을 확인할 수 있습니다. 브라우저 새로고침이 필요할 수 있습니다.

다만 호스트 파일 접근 권한이나 Docker Desktop의 파일 공유 설정에 따라 마운트가 제한될 수 있습니다.

Dockerfile 작성으로 사용자 정의 이미지 만들기

Bind Mount는 개발 중 파일을 빠르게 수정할 때 유용합니다.

반면 배포할 웹페이지 파일을 이미지에 포함하려면 Dockerfile을 사용할 수 있습니다.

docker-web 폴더에 확장자가 없는 Dockerfile 파일을 생성합니다.

다음 내용을 입력합니다.

FROM nginx:alpine

COPY index.html /usr/share/nginx/html/index.html

EXPOSE 80

FROM nginx:alpine은 기본 이미지로 Nginx를 사용한다는 의미입니다.

COPY는 프로젝트의 HTML 파일을 이미지 내부 경로에 복사합니다.

EXPOSE 80은 컨테이너가 80번 포트를 사용하도록 설계되었다는 정보를 나타냅니다.

중요한 점은 EXPOSE 명령만으로 호스트 포트가 외부에 게시되는 것은 아니라는 사실입니다. 실제 포트 연결은 컨테이너 실행 시 -p 옵션 등으로 설정해야 합니다.

Dockerfile을 이용하면 웹페이지 파일이 이미지에 포함되므로 다른 Docker 환경으로 이미지를 전달해 실행할 수 있습니다.

docker build로 이미지 제작하고 실행하기

Dockerfile과 index.html이 들어 있는 프로젝트 폴더에서 다음 명령을 실행합니다.

docker build -t my-first-web:1.0 .

-t 옵션은 이미지 이름과 태그를 지정합니다.

마지막의 점(.)은 현재 폴더를 빌드 컨텍스트로 사용한다는 의미입니다.

이미지 빌드가 완료되면 docker image ls 명령으로 my-first-web 이미지를 확인합니다.

이전에 실행한 my-web 컨테이너가 8080번 포트를 사용하고 있다면 중지합니다.

docker stop my-web

docker run -d --name my-built-web -p 127.0.0.1:8080:80 my-first-web:1.0

웹브라우저에서 http://localhost:8080에 접속해 직접 만든 페이지가 표시되는지 확인합니다.

이번에는 호스트 폴더를 마운트하지 않았습니다. HTML 파일이 이미지 내부에 포함되어 있기 때문입니다.

따라서 호스트의 index.html 파일을 수정하더라도 기존 이미지에는 자동 반영되지 않습니다. 수정된 파일을 포함하려면 이미지를 다시 빌드하고 새 컨테이너로 실행해야 합니다.

프로젝트 폴더 구성 예시

docker-web/
├── Dockerfile
└── index.html

정적 HTML 웹서버의 가장 기본적인 이미지 제작 구조입니다. CSS와 JavaScript 파일을 추가한다면 Dockerfile의 COPY 구성을 해당 파일 구조에 맞게 변경해야 합니다.

⚠️ Dockerfile에 비밀번호와 API 키를 넣지 마세요

Dockerfile의 명령이나 이미지에 포함된 파일을 통해 비밀 정보가 노출될 수 있습니다. 실제 서비스에서는 Docker의 비밀 정보 관리 기능 또는 실행 환경의 안전한 비밀 변수 관리 방식을 사용해야 합니다. 또한 신뢰할 수 있는 기본 이미지를 사용하고 보안 업데이트를 주기적으로 확인하는 것이 중요합니다.

Docker 실행 오류와 관리 명령어 정리

Docker 실습 중 오류가 발생했다면 무작정 재설치하기보다 오류 메시지와 컨테이너 상태를 먼저 확인하는 것이 좋습니다. 특히 Docker Engine 연결 문제, 포트 충돌, 컨테이너 이름 중복은 초보자가 자주 경험하는 문제입니다.

Cannot connect to the Docker daemon 오류

다음과 비슷한 오류가 나타날 수 있습니다.

Cannot connect to the Docker daemon

이 오류는 Docker CLI가 Docker Engine에 연결하지 못할 때 발생할 수 있습니다.

Windows에서는 Docker Desktop이 실행 중인지 먼저 확인합니다.

Docker Desktop의 엔진 시작이 완료되었는지 확인하고, WSL 2 기반 환경이라면 WSL 구성과 가상화 지원 상태도 점검합니다.

다음 명령으로 서버 연결 정보를 확인할 수 있습니다.

docker info

Docker CLI 버전이 출력된다고 해서 Docker Engine까지 정상 동작하는 것은 아니므로 서버 연결 상태를 별도로 확인해야 합니다.

Port is already allocated 오류 해결하기

8080번 포트를 다른 프로그램이나 컨테이너가 사용하고 있다면 포트 충돌이 발생할 수 있습니다.

먼저 실행 중인 Docker 컨테이너를 확인합니다.

docker ps

기존 컨테이너가 8080번 포트를 사용하고 있다면 중지하거나 다른 포트를 선택합니다.

예를 들어 호스트 포트를 8081로 변경하려면 다음과 같이 실행할 수 있습니다.

docker run -d –name my-nginx-8081 -p 127.0.0.1:8081:80 nginx:alpine

이 경우 접속 주소는 http://localhost:8081입니다.

기존 컨테이너의 포트 연결을 바꾸려면 일반적으로 새로운 포트 설정으로 컨테이너를 다시 생성해야 합니다.

컨테이너가 바로 종료될 때 로그 확인하기

컨테이너가 실행 직후 종료되는 경우에는 메인 프로세스가 정상 종료되었거나 오류로 중단되었을 수 있습니다.

먼저 종료된 컨테이너까지 목록에 표시합니다.

docker ps -a

그다음 컨테이너 로그를 확인합니다.

docker logs my-nginx

컨테이너 이름은 실제 문제가 발생한 컨테이너 이름으로 바꿔 입력합니다.

로그에서 설정 파일 오류, 실행 파일 누락, 권한 문제 등을 확인할 수 있습니다.

컨테이너의 종료 코드와 상세 상태를 확인하려면 docker inspect 명령도 사용할 수 있습니다.

docker inspect my-nginx

단순한 hello-world 컨테이너처럼 원래 작업을 마친 뒤 종료되도록 설계된 경우에는 종료 상태가 반드시 오류를 의미하지 않습니다.

불필요한 이미지와 컨테이너 정리하기

Docker를 계속 사용하면 테스트용 컨테이너와 이미지가 누적될 수 있습니다.

먼저 사용량을 확인합니다.

docker system df

중지된 컨테이너 중 불필요한 항목을 정리하려면 다음 명령을 사용할 수 있습니다.

docker container prune

사용하지 않는 이미지 등을 정리하는 명령도 있지만 삭제 대상이 넓어질 수 있으므로 신중해야 합니다.

docker system prune은 중지된 컨테이너, 사용하지 않는 네트워크, 댕글링 이미지, 사용하지 않는 빌드 캐시 등을 정리할 수 있습니다.

옵션에 따라 더 많은 이미지나 볼륨이 삭제될 수 있으므로 운영 중인 환경에서는 명령어의 삭제 범위를 충분히 확인해야 합니다.

특히 --volumes 옵션을 무분별하게 사용하면 보존해야 할 데이터에 영향을 줄 수 있습니다.

증상 가능한 원인 점검 방법
Docker daemon 연결 실패 Engine 미실행 Docker Desktop · docker info
8080 포트 충돌 다른 프로세스 사용 docker ps · 포트 변경
컨테이너 이름 중복 기존 컨테이너 존재 docker ps -a
컨테이너 즉시 종료 프로세스 종료·실행 오류 docker logs · inspect
디스크 사용량 증가 이미지·캐시 누적 docker system df
💡 Docker 문제 해결의 기본 순서

Docker Engine 상태를 확인한 뒤 컨테이너 목록, 포트 연결, 로그, 이미지와 마운트 설정 순서로 점검하세요. 문제가 발생했다고 모든 이미지와 컨테이너를 삭제할 필요는 없습니다.

Docker 입문 자주 묻는 질문 Q&A

Q1. Docker와 가상머신은 같은 기술인가요?

Docker 컨테이너와 가상머신은 모두 격리된 실행 환경을 제공할 수 있지만 구조가 다릅니다. 일반적인 Linux 컨테이너는 호스트의 Linux 커널을 공유하며 애플리케이션 프로세스를 격리합니다. 가상머신은 일반적으로 별도의 게스트 운영체제를 실행합니다. 다만 Windows나 macOS에서 Docker Desktop으로 Linux 컨테이너를 사용할 때는 내부적으로 가상화 환경이 활용될 수 있습니다. 따라서 컨테이너와 가상머신을 완전히 같은 개념으로 이해해서는 안 됩니다.

Q2. Docker 이미지와 컨테이너는 무엇이 다른가요?

이미지는 애플리케이션을 실행하기 위한 파일과 설정을 포함하는 패키지이며, 컨테이너는 해당 이미지로 생성한 실행 인스턴스입니다. 하나의 이미지로 여러 컨테이너를 만들 수 있습니다. docker pull은 이미지를 내려받고, docker run은 이미지를 사용해 컨테이너를 생성하고 실행합니다. 컨테이너를 삭제해도 이미지는 일반적으로 남지만, 컨테이너의 쓰기 가능한 계층에 저장한 데이터는 사라질 수 있으므로 주의해야 합니다.

Q3. Docker로 웹서버를 실행하려면 코딩이 필요한가요?

기본 Nginx 웹서버를 실행하는 데는 별도의 프로그래밍 코드가 필요하지 않습니다. Docker가 설치되어 있다면 공식 Nginx 이미지를 내려받고 docker run 명령으로 컨테이너를 실행할 수 있습니다. 다만 직접 만든 웹페이지를 제공하려면 HTML 파일을 준비하거나 웹 애플리케이션 코드를 작성해야 할 수 있습니다. Dockerfile은 애플리케이션을 이미지에 포함하고 배포하기 위한 설정 파일로 활용할 수 있습니다.

Q4. Docker 컨테이너를 삭제하면 데이터도 사라지나요?

컨테이너의 쓰기 가능한 계층에만 저장한 데이터는 해당 컨테이너를 삭제하면 일반적으로 사라집니다. 반면 Docker 볼륨이나 호스트 디렉터리에 Bind Mount로 저장한 데이터는 저장소의 수명과 삭제 방식에 따라 별도로 유지될 수 있습니다. 데이터베이스나 사용자 업로드 파일처럼 중요한 데이터는 컨테이너 내부에만 저장하지 않는 것이 좋습니다. 또한 볼륨을 사용하더라도 별도의 백업 정책이 필요합니다.

Q5. Docker Desktop은 무료로 사용할 수 있나요?

Docker Desktop은 사용 목적과 조직 규모 등에 따라 라이선스 조건이 달라질 수 있습니다. 개인 학습이나 일부 소규모 조직 등에는 무료 이용 조건이 적용될 수 있지만, 모든 기업과 상업적 환경에서 무조건 무료인 것은 아닙니다. Docker Engine과 Docker Desktop의 라이선스 및 배포 방식도 구분해서 이해해야 합니다. 실제 업무에 사용하기 전에는 Docker 공식 구독 및 라이선스 안내에서 최신 조건을 확인하는 것이 안전합니다.

핵심 요약 및 Docker 실습 체크리스트

Docker를 처음 배울 때는 이미지와 컨테이너의 차이를 정확히 이해하는 것이 중요합니다. 이미지는 애플리케이션을 실행하기 위한 패키지이고, 컨테이너는 그 이미지를 바탕으로 생성한 실행 환경입니다. Docker CLI 명령어를 사용하면 이미지를 내려받고 컨테이너를 생성하거나 실행 상태를 관리할 수 있습니다.

이번 실습에서는 Nginx 이미지를 내려받고 컨테이너를 실행해 http://localhost:8080에서 웹페이지를 확인했습니다. 이어서 Bind Mount를 사용해 호스트의 HTML 파일을 연결하고, Dockerfile로 웹페이지를 포함한 사용자 정의 이미지를 만들었습니다. 이러한 과정을 이해하면 다른 웹 애플리케이션을 Docker로 패키징하고 실행하는 방법도 확장해서 학습할 수 있습니다.

핵심 항목 명령어 또는 개념
1. Docker 설치 확인 docker –version
2. Engine 연결 확인 docker info
3. 첫 컨테이너 실행 docker run hello-world
4. 이미지 다운로드 docker pull nginx:alpine
5. 웹서버 실행 docker run -d -p 127.0.0.1:8080:80 nginx:alpine
6. 실행 목록 확인 docker ps
7. 로그 확인 docker logs 컨테이너이름
8. 사용자 이미지 빌드 docker build -t my-first-web:1.0 .
9. 컨테이너 중지 docker stop 컨테이너이름

✅ Docker 입문 최종 체크리스트

☐ Docker와 컨테이너의 기본 개념 이해하기

☐ 이미지와 컨테이너의 차이 구분하기

☐ Docker Desktop 또는 Docker Engine 설치하기

☐ docker –version 명령으로 CLI 확인하기

☐ docker info로 Engine 연결 확인하기

☐ docker run hello-world 실행하기

☐ nginx:alpine 이미지 다운로드하기

☐ Nginx 컨테이너 실행하기

☐ localhost:8080에서 웹페이지 확인하기

☐ docker ps와 docker logs 사용하기

☐ index.html 파일 직접 작성하기

☐ Bind Mount로 HTML 파일 연결하기

☐ Dockerfile 작성 및 이미지 빌드하기

☐ 컨테이너 중지와 삭제 명령어 이해하기

☐ 포트 노출과 데이터 보존 주의 사항 확인하기

Docker 입문 단계에서는 복잡한 오케스트레이션 도구부터 공부하기보다 이미지 다운로드, 컨테이너 실행, 포트 연결, 로그 확인, Dockerfile 빌드 과정을 직접 반복해 보는 것이 좋습니다. 기본 흐름을 익힌 다음 Docker Compose, 볼륨, 사용자 정의 네트워크, 다중 컨테이너 애플리케이션, 이미지 보안 및 배포 자동화로 학습 범위를 넓혀 보세요.

📚 Docker 공식 참고 자료

Docker 설치, 이미지와 컨테이너, 명령어, Dockerfile, 네트워크 및 저장소에 관한 최신 설명은 다음 공식 문서에서 확인할 수 있습니다.

※ 본 글은 Docker의 기본 개념과 Nginx 웹서버 실행을 설명하는 입문용 가이드입니다. Docker Desktop의 설치 요구 사항, 지원 운영체제, 구독 조건, 이미지 태그, CLI 동작은 버전과 실행 환경에 따라 달라질 수 있습니다. Windows PowerShell용 Bind Mount 예제는 해당 셸의 경로 표현을 사용하므로 macOS, Linux, WSL 셸에서는 경로 문법을 조정해야 합니다. 실습에서는 외부 노출을 줄이기 위해 루프백 주소로 포트를 게시하지만, 실제 운영 환경에서는 방화벽, 인증, HTTPS, 데이터 백업, 이미지 업데이트 및 접근 제어를 별도로 구성해야 합니다.

관련 키워드

Docker 입문, Docker 초보자 가이드, 도커 사용법, Docker 설치, Docker Desktop, Docker Engine, Docker CLI, Docker 이미지, Docker 컨테이너, Docker Image, Docker Container, Docker Hub, Docker Registry, Docker 가상머신 차이, Docker VM 비교, Docker 명령어, docker run, docker pull, docker ps, docker image ls, docker logs, docker stop, docker start, docker restart, docker rm, docker inspect, docker system df, docker build, Dockerfile 작성, Dockerfile FROM, Dockerfile COPY, Dockerfile EXPOSE, Docker Nginx, Nginx 컨테이너, Docker 웹서버, Docker 웹서버 띄우기, Docker localhost 8080, Docker 포트 연결, Docker Port Mapping, Docker Port Publishing, Docker Bind Mount, Docker Volume, Docker HTML 배포, Docker 정적 웹페이지, Docker WSL2, Docker Windows 설치, Docker daemon 오류, Docker 포트 충돌, Docker 컨테이너 삭제, Docker 이미지 빌드, Docker 개발 환경, Docker 배포, Docker Compose 기초, Docker 보안, Docker Tutorial 2026

댓글 남기기